Thay đổi tỷ lệ trục x trong matplotlib


93

Tôi đã tạo cốt truyện này bằng Matlab

nhập mô tả hình ảnh ở đây

Sử dụng matplotlib, các trục x vẽ ra các số lớn như 100000, 200000, 300000. Tôi muốn có một cái gì đó như 1, 2, 3 và 10 ^ 5 để chỉ ra rằng nó thực sự là 100000, 200000, 300000.

Có cách nào đơn giản để tạo quy mô như vậy trong matplotlib không?

Câu trả lời:


145

Hãy thử sử dụng matplotlib.pyplot.ticklabel_format:

import matplotlib.pyplot as plt
...
plt.ticklabel_format(style='sci', axis='x', scilimits=(0,0))

Điều này áp dụng ký hiệu khoa học (tức là a x 10^b) cho dấu tích trục x của bạn


9
là nó có thể thêm một bù đắp? (ví dụ như thay vì 0.0, 0.5, 1.0, 1.5, ... và x 10 ^ b nó sẽ là 0, 5, 10, 15, ... và x 10 ^ {b-1})
Eagle

24
ticklabel_formatcũng là một phương pháp cho các đối tượng trục, bạn có thể thử một cái gì đó giống nhưax.ticklabel_format(style='sci', axis='x', scilimits=(0,0))
Covich

Làm thế nào điều này có thể hoạt động nếu bạn có một lô phụ, chẳng hạn như, 2 ô?
FaCoffee

2
@Eagle xin lỗi, câu hỏi tiếp theo của bạn về việc thêm phần bù là điều tôi đang đề cập đến. trục x của tôi là [0.1, 0.2, ...]và tôi thích [1, 2, ...]với số mũ được điều chỉnh. bạn có thể tìm ra giải pháp cho điều đó không?
trianta2

@Eagle Tôi cũng quan tâm đến câu hỏi mà trianta2 đã đề cập
Ben Usman

15

Đây không phải là câu trả lời cho câu hỏi ban đầu của bạn cũng như một trong những câu hỏi bạn có trong phần nội dung câu hỏi.

Mở đầu một chút, để việc đặt tên của tôi không có vẻ lạ:

import matplotlib
from matplotlib import rc
from matplotlib.figure import Figure
ax = self.figure.add_subplot( 111 )

Như đã đề cập, bạn có thể sử dụng ticklabel_format để chỉ định rằng matplotlib nên sử dụng ký hiệu khoa học cho các giá trị lớn hoặc nhỏ:

ax.ticklabel_format(style='sci',scilimits=(-3,4),axis='both')

Bạn có thể ảnh hưởng đến cách hiển thị điều này bằng cách sử dụng các cờ trong rcParams (từ matplotlib import rcParams) hoặc bằng cách đặt chúng trực tiếp. Tôi chưa tìm ra cách thay đổi giữa ký hiệu khoa học '1e' và 'x10 ^' tốt hơn là:

ax.xaxis.major.formatter._useMathText = True

Điều này sẽ cung cấp cho bạn nhiều Matlab-esc hơn và thực sự được cho là ngoại hình đẹp hơn. Tôi nghĩ những điều sau đây cũng nên làm tương tự:

rc('text', usetex=True)

11

Định dạng vô hướng hỗ trợ thu thập các số mũ. Các tài liệu như sau:

class matplotlib.ticker.ScalarFormatter (useOffset = True, useMathText = False, useLocale = None) Cơ sở: matplotlib.ticker.Formatter

Vị trí đánh dấu là một số cũ đơn giản. Nếu useOffset == True và phạm vi dữ liệu nhỏ hơn nhiều so với mức trung bình của dữ liệu, thì một phần bù sẽ được xác định sao cho các nhãn đánh dấu có ý nghĩa. Ký hiệu khoa học được sử dụng cho dữ liệu <10 ^ -n hoặc dữ liệu> = 10 ^ m, trong đó n và m là giới hạn công suất được đặt bằng set_powerlimits ((n, m)). Các giá trị mặc định cho những thứ này được kiểm soát bởi tham số rc axis.formatter.limits.

kỹ thuật của bạn sẽ là:

from matplotlib.ticker import ScalarFormatter
xfmt = ScalarFormatter()
xfmt.set_powerlimits((-3,3))  # Or whatever your limits are . . .
{{ Make your plot }}
gca().xaxis.set_major_formatter(xfmt)

Để hiển thị số mũ ở định dạng x10^5, hãy khởi tạo ScalarFormatter bằng useMathText=True.

Sau hình ảnh

Bạn cũng có thể sử dụng:

xfmt.set_useOffset(10000)

Để có được một kết quả như thế này:

nhập mô tả hình ảnh ở đây


3
Khởi tạo ScalarFormatter với useMathText=Trueđể lấy x10^4.
Đến Hoffmann

9

Tôi tìm thấy giải pháp đơn giản

pylab.ticklabel_format(axis='y',style='sci',scilimits=(1,4))
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.