2015-07-11 16 views
38

Tôi có một cốt truyện hiện có mà đã được tạo ra với gấu trúc như thế này:Format trục y theo phần trăm

df['myvar'].plot(kind='bar') 

Các trục y là định dạng như phao và tôi muốn thay đổi trục y để tỷ lệ phần trăm. Tất cả các giải pháp tôi thấy cú pháp sử dụng ax.xyz và Tôi chỉ có thể đặt mã bên dưới dòng trên mà tạo ra những âm mưu (Tôi không thể thêm rìu = ax vào dòng ở trên.)

Làm thế nào tôi có thể định dạng y trục như phần trăm mà không thay đổi dòng trên?

Dưới đây là giải pháp tôi thấy nhưng đòi hỏi mà tôi định nghĩa lại những âm mưu:

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() 

Liên kết với các giải pháp trên: Pyplot: using percentage on x axis

Trả lời

59

gấu trúc cốt truyện dataframe sẽ trả lại ax cho bạn, Và sau đó bạn có thể bắt đầu thao tác các trục bất cứ điều gì bạn muốn.

import pandas as pd 
import numpy as np 

df = pd.DataFrame(np.random.randn(100,5)) 

# you get ax from here 
ax = df.plot() 
type(ax) # matplotlib.axes._subplots.AxesSubplot 

# manipulate 
vals = ax.get_yticks() 
ax.set_yticklabels(['{:3.2f}%'.format(x*100) for x in vals]) 

enter image description here

+0

Điều này sẽ có tác dụng không mong muốn ngay khi bạn xoay/thu phóng biểu đồ tương tác – hitzg

+1

Triệu lần dễ dàng hơn việc cố gắng sử dụng các trình định dạng hàm của matplotlib.ticker'! – Jarad

37

Jianxun 's giải pháp đã làm công việc cho tôi, nhưng đã phá vỡ chỉ số giá trị y ở phía dưới bên trái của cửa sổ.

tôi đã kết thúc bằng FuncFormatter thay vì (và cũng có thể lột xác trailing zeroes uneccessary như đề xuất here):

import pandas as pd 
import numpy as np 
from matplotlib.ticker import FuncFormatter 

df = pd.DataFrame(np.random.randn(100,5)) 

ax = df.plot() 
ax.yaxis.set_major_formatter(FuncFormatter(lambda y, _: '{:.0%}'.format(y))) 

Nói chung tôi khuyên bạn nên sử dụng FuncFormatter để định dạng nhãn: đó là đáng tin cậy, và linh hoạt.

enter image description here

+5

Bạn có thể đơn giản hóa mã này nhiều hơn: 'ax.yaxis.set_major_formatter (FuncFormatter ('{0: .0%}'. Format))'. AKA không cần cho lambda, hãy định dạng làm công việc. –

+0

@DanielHimmelstein bạn có thể giải thích điều này một chút không? Đặc biệt bên trong {}. Không chắc làm thế nào 0,06 của tôi được biến thành 6% bằng cách sử dụng với định dạng python. Ngoài ra giải pháp tuyệt vời. Dường như làm việc đáng tin cậy hơn nhiều so với việc sử dụng .set_ticklabels – DChaps

+1

@DChaps ''{0: .0%}'. Format' tạo [chức năng định dạng] (https://docs.python.org/3.6/library/string.html # định dạng-ví dụ). '0' trước dấu hai chấm cho trình định dạng thay thế các dấu ngoặc nhọn và nội dung của nó bằng đối số đầu tiên được truyền cho hàm. Phần sau dấu hai chấm '.0%', báo cho trình định dạng biết cách hiển thị giá trị. '.0' chỉ định 0 chữ số thập phân và'% 'chỉ định hiển thị dưới dạng phần trăm. –

16

Đâ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 chỉ cần một dòng để định dạng lại trục của bạn (hai nếu bạn đếm nhập khẩu matplotlib.ticker):

import ... 
import matplotlib.ticker as mtick 

ax = df['myvar'].plot(kind='bar') 
ax.yaxis.set_major_formatter(mtick.PercentFormatter()) 

PercentFormatter() chấp nhận ba đối số, max, decimals, symbol. max cho phép bạn đặt giá trị tương ứng với 100% trên trục. Điều này là tốt đẹp nếu bạn có dữ liệu từ 0,0 đến 1,0 và bạn muốn hiển thị nó từ 0% đến 100%. Chỉ cần làm PercentFormatter(1.0).

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ị.

+2

Không thể đợi bản phát hành. Tôi đã tự hỏi một lúc tại sao điều này không tầm thường. Cảm ơn bạn đã thêm điều này. – DanT

+0

@DanT. PR được chấp nhận vào phiên bản 2.1. Không chắc chắn khi nào dự kiến ​​phát hành, nhưng có lẽ trong vài tháng tới. Trong thời gian chờ đợi, bạn luôn có thể sử dụng phiên bản từ GitHub. –

+0

Đây là câu trả lời * đúng *, nhưng một năm sau, chúng tôi vẫn đang chờ trên matplotlib 2.1 ... – MinchinWeb

6

Đối với những người đang tìm kiếm nhanh một-liner:

gca().set_yticklabels(['{:.0f}%'.format(x*100) for x in gca().get_yticks()]) 

Hoặc nếu bạn đang sử dụng Latex như formatter trục văn bản, bạn cần phải thêm một dấu chéo ngược '\'

gca().set_yticklabels(['{:.0f}\%'.format(x*100) for x in gca().get_yticks()]) 
Các vấn đề liên quan