2013-02-08 51 views
25

Tôi gặp sự cố với định dạng của nhãn đánh dấu của trục. Tôi vô hiệu hóa bù đắp từ y_axis:định dạng nhãn trục matplotlib

ax1.ticklabel_format(style = 'sci', useOffset=False) 

và cố gắng đặt nó một định dạng khoa học nhưng tất cả tôi nhận được là:

0.00355872 

nhưng tôi mong đợi một cái gì đó như:

3.55872...E-2 

hoặc giống.

những gì tôi thực sự muốn là một cái gì đó như:

3.55872... (on the tick label) 
x 10^2 (or something similar - on the axis label) 

tôi có thể cố gắng thiết lập các nhãn như tĩnh ,, nhưng cuối cùng tôi sẽ có một vài chục hoặc hàng trăm lô với giá trị khác nhau, vì vậy nó cần được đặt động.

Một giải pháp thay thế là đặt offset y_axis làm nhãn, nhưng tôi cũng không có đầu mối về cách thực hiện điều này.

Trả lời

24

Có một số cách để làm điều này

Bạn chỉ có thể tinh chỉnh các giới hạn sức mạnh (doc)

ax1.xaxis.get_major_formatter().set_powerlimits((0, 1)) 

đó thiết lập các quyền hạn nơi ScalerFormatter chuyển sang ký hiệu khoa học

Hoặc, bạn có thể sử dụng một số FuncFormatter mang lại cho bạn một sự kiểm soát tốt (nhưng bạn có thể thổi tắt chân của bạn).

from matplotlib import ticker 

scale_pow = 2 
def my_formatter_fun(x, p): 
    return "%.2f" % (x * (10 ** scale_pow)) 
ax1.get_xaxis().set_major_formatter(ticker.FuncFormatter(my_formatter_fun)) 
ax1.set_xlabel('my label ' + '$10^{{{0:d}}}$'.format(scale_pow)) 

FuncFormatter(doc) mất một hàm 2 lập luận rằng trả về một chuỗi và sử dụng chức năng đó để định dạng nhãn. (Hãy nhận biết, điều này cũng sẽ thay đổi cách các giá trị được hiển thị ở góc các số liệu tương tác). Đối số thứ hai là cho 'vị trí' là một đối số được giao khi trình định dạng tạo ra các nhãn. Bạn có thể bỏ qua nó một cách an toàn, nhưng bạn phải lấy nó (khôn ngoan khác, bạn sẽ nhận được lỗi từ số lượng các đối số sai). Đây là kết quả của API thống nhất của tất cả các trình định dạng và sử dụng trình định dạng để hiển thị vị trí của chuột tương tác.

+0

Làm mờ, sử dụng FuncFormatter, nhưng với một vài sửa đổi 'ax1.get_yaxis(). Set_major_formatter (ticker.FuncFormatter (lambda x, p: "%. 2f"% (x * (10 ** scale_pow))))) '. Chỉ cần một vài nghi ngờ: Tôi vẫn không hiểu 'lambda' và 'p' là gì. Cảm ơn nhiều! :) – jorgehumberto

+0

Tôi đoán rằng 'FuncFormatter' muốn một hàm với hai đối số. 'lambda x, p: do something' tạo ra một hàm nhận hai đối số (' x' và 'p') và thực hiện bất kỳ thao tác nào bạn cần làm. [Xem ở đây để được hướng dẫn] (http://www.secnetix.de/olli/Python/lambda_functions.hawk) –

+0

@jorgehumberto xóa 'lambda' và thêm một chút giải thích về' p'. 'lambda' chỉ là một cách để tạo ra một hàm với' def', đó là python ưa thích không thực sự cần thiết cho câu trả lời này. Xin lỗi vì đã khiến nó phức tạp hơn mức cần thiết. – tacaswell

33

Bạn cũng nên xác định trục và ngưỡng giới hạn:

ax1.ticklabel_format(axis='y', style='sci', scilimits=(-2,2)) 

này sẽ sử dụng định dạng khoa học viễn tưởng về y trục khi con số này ra khỏi [0.01, 99] vọt.

+1

Đơn giản và hiệu quả với tôi, +1 – user3208430

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