2014-10-10 23 views
7

Tôi có biểu đồ dạng đường dựa trên danh sách số đơn giản. Theo mặc định, trục x chỉ là giá trị gia tăng 1 cho mỗi giá trị được vẽ. Tôi muốn được một tỷ lệ phần trăm thay vì nhưng không thể tìm ra cách. Vì vậy, thay vì có một trục x 0-5, nó sẽ đi từ 0% đến 100% (nhưng vẫn giữ dấu tick cách nhau một cách hợp lý. Mã dưới đây. Cảm ơn!Pyplot: sử dụng tỷ lệ phần trăm trên trục x

from matplotlib import pyplot as plt 
from mpl_toolkits.axes_grid.axislines import Subplot 

data=[8,12,15,17,18,18.5] 
fig=plt.figure(1,(7,4)) 
ax=Subplot(fig,111) 
fig.add_subplot(ax) 
plt.plot(data) 

Trả lời

18

Đoạn code dưới đây sẽ cung cấp cho bạn một đơn giản trục x dựa trên tỷ lệ phần trăm, giả sử rằng mỗi giá trị của bạn là khoảng không bằng nhau giữa 0% và 100%.

Nó tạo ra một mảng perc giữ tỷ lệ phần trăm đều nhau có thể được sử dụng để vẽ. điều chỉnh định dạng cho trục x sao cho nó bao gồm một dấu phần trăm sử dụng matplotlib.ticker.FormatStrFormatter. Thật không may điều này sử dụng định dạng chuỗi kiểu cũ, trái ngược với kiểu mới, tài liệu kiểu cũ có thể được tìm thấy here.

import matplotlib.pyplot as plt 
import numpy as np 
import matplotlib.ticker as mtick 

data = [8,12,15,17,18,18.5] 
perc = np.linspace(0,100,len(data)) 

fig = plt.figure(1, (7,4)) 
ax = fig.add_subplot(1,1,1) 

ax.plot(perc, data) 

fmt = '%.0f%%' # Format you want the ticks, e.g. '40%' 
xticks = mtick.FormatStrFormatter(fmt) 
ax.xaxis.set_major_formatter(xticks) 

plt.show() 

Example plot

+0

Không có gì sai với kiểu định dạng cũ. Nó vẫn tương thích hơn với cả hai (xem mô-đun ghi nhật ký). –

+0

Định dạng sẽ là gì nếu giá trị ban đầu đã là 0,5? Tôi muốn biến nó thành 50%. –

+1

Một giải pháp khác có thể là sử dụng 'mtick.FuncFormatter (" {:. 0%} ". Format)', sử dụng các chuỗi định dạng kiểu mới mà tôi thấy dễ đọc và linh hoạt hơn. –

2

Đây là một vài tháng cuối năm, nhưng tôi đã tạo PR#6251 với matplotlib để thêm một lớp mới PercentFormatter. Với lớp này, bạn có thể thực hiện như sau để đặt trục:

import matplotlib.ticker as mtick 

# Actual plotting code omitted 

ax.xaxis.set_major_formatter(mtick.PercentFormatter(5.0)) 

Điều này sẽ hiển thị giá trị từ 0 đến 5 trên thang tỷ lệ từ 0% đến 100%. Trình định dạng tương tự như khái niệm về những gì @Ffisegydd gợi ý làm ngoại trừ việc nó có thể lấy bất kỳ dấu tick hiện có tùy ý nào.

PercentFormatter() chấp nhận ba đối số, max, decimalssymbol. max cho phép bạn đặt giá trị tương ứng với 100% trên trục (trong ví dụ của bạn, 5).

Hai tham số còn lại cho phép bạn đặt số chữ số sau dấu thập phân và ký hiệu. Chúng mặc định tương ứng là None'%'. decimals=None sẽ tự động đặt số thập phân dựa trên số lượng trục bạn đang hiển thị.

Lưu ý rằng trình định dạng này sẽ sử dụng bất kỳ dấu tick nào thường được tạo nếu bạn chỉ vẽ dữ liệu của mình. Nó không sửa đổi bất cứ điều gì ngoài các chuỗi được xuất ra các dấu tick.

Các vấn đề liên quan