Vẽ các trục logarit với matplotlib trong python


369

Tôi muốn vẽ đồ thị với một trục logarit bằng matplotlib.

Tôi đã đọc tài liệu, nhưng không thể tìm ra cú pháp. Tôi biết rằng nó có thể là một cái gì đó đơn giản như 'scale=linear'trong các đối số cốt truyện, nhưng dường như tôi không thể hiểu đúng

Chương trình mẫu:

import pylab
import matplotlib.pyplot as plt
a = [pow(10, i) for i in range(10)]
fig = plt.figure()
ax = fig.add_subplot(2, 1, 1)

line, = ax.plot(a, color='blue', lw=2)
pylab.show()

Câu trả lời:


384

Bạn có thể sử dụng Axes.set_yscalephương pháp. Điều đó cho phép bạn thay đổi tỷ lệ sau khi Axesđối tượng được tạo. Điều đó cũng sẽ cho phép bạn xây dựng một điều khiển để cho phép người dùng chọn tỷ lệ nếu bạn cần.

Dòng liên quan để thêm là:

ax.set_yscale('log')

Bạn có thể sử dụng 'linear'để chuyển trở lại quy mô tuyến tính. Đây là mã của bạn sẽ như thế nào:

import pylab
import matplotlib.pyplot as plt
a = [pow(10, i) for i in range(10)]
fig = plt.figure()
ax = fig.add_subplot(2, 1, 1)

line, = ax.plot(a, color='blue', lw=2)

ax.set_yscale('log')

pylab.show()

biểu đồ kết quả


6
Phương pháp này rất hay vì nó hoạt động với tất cả các loại cốt truyện (ví dụ như biểu đồ), không chỉ với "cốt truyện" (đó là những gì semilogx / semilogy làm)
Tim Whitcomb

16
Tôi đến đây để tìm cách sử dụng một trục cho quyền hạn của hai: pylab.gca (). Set_xscale ('log', basex = 2)
zje

53
Matplotlib có semilogy(). Hơn nữa, nó dễ sử dụng trực tiếp pyplot.yscale()hơn sử dụng ax.set_yscale('log'), vì không cần phải lấy axđối tượng (không phải lúc nào cũng có sẵn ngay lập tức).
Eric O Lebigot

5
Nếu bạn muốn quy mô nhật ký trên cả hai trục, hãy thử loglog()hoặc trên trục x chỉ thửsemilogx()
drevicko

10
@EOL Mình xin tư vấn ngược lại. Nó là tốt hơn để sử dụng một rõ ràng axđối tượng đó để sử dụng pyplotmà chỉ có thể áp dụng đối với các Axes bạn muốn nó.
tacaswell

288

Trước hết, nó không gọn gàng để trộn pylabpyplotmã. Hơn nữa, phong cách pyplot được ưa thích hơn so với sử dụng pylab .

Đây là một mã được làm sạch một chút, chỉ sử dụng các pyplotchức năng:

from matplotlib import pyplot

a = [ pow(10,i) for i in range(10) ]

pyplot.subplot(2,1,1)
pyplot.plot(a, color='blue', lw=2)
pyplot.yscale('log')
pyplot.show()

Các chức năng có liên quan là pyplot.yscale(). Nếu bạn sử dụng phiên bản hướng đối tượng, thay thế nó bằng phương thức Axes.set_yscale(). Hãy nhớ rằng bạn cũng có thể thay đổi tỷ lệ của trục X, bằng cách sử dụng pyplot.xscale()(hoặc Axes.set_xscale()).

Kiểm tra câu hỏi của tôi Sự khác biệt giữa 'log' và 'symlog' là gì? để xem một vài ví dụ về tỷ lệ biểu đồ mà matplotlib cung cấp.


Có một thời gian khó khăn để cố gắng tìm ra cách để làm điều đó. Câu trả lời này đã cứu ngày của tôi!
HWende

13
pyplot.semilogy()là trực tiếp hơn.
Eric O Lebigot

64

Bạn chỉ cần sử dụng semilogy thay vì cốt truyện:

from pylab import *
import matplotlib.pyplot  as pyplot
a = [ pow(10,i) for i in range(10) ]
fig = pyplot.figure()
ax = fig.add_subplot(2,1,1)

line, = ax.semilogy(a, color='blue', lw=2)
show()

1
LOL, tôi đã thử đăng nhập (FloatArray) trong thời gian dài, cảm ơn bạn đã cứu ngày của tôi
Pradeep

5
Ngoài ra còn có semilogx . Nếu bạn cần đăng nhập trên cả hai trục, hãy sử dụng loglog
drevicko

40

nếu bạn muốn thay đổi cơ sở của logarit, chỉ cần thêm:

plt.yscale('log',basey=2) 
# where basex or basey are the bases of log

8

Tôi biết điều này hơi lạc đề, vì một số ý kiến ​​đề cập ax.set_yscale('log')đến giải pháp "đẹp nhất" tôi nghĩ rằng một phản bác có thể là do. Tôi không khuyên bạn nên sử dụng ax.set_yscale('log')cho biểu đồ và biểu đồ thanh. Trong phiên bản của tôi (0.99.1.1) tôi gặp phải một số vấn đề về kết xuất - không chắc vấn đề này nói chung như thế nào. Tuy nhiên, cả thanh và lịch sử đều có các đối số tùy chọn để đặt thang đo y thành nhật ký, hoạt động tốt.

tài liệu tham khảo: http://matplotlib.org/api/pyplot_api.html#matplotlib.pyplot.bar

http://matplotlib.org/api/pyplot_api.html#matplotlib.pyplot.hist


5

Vì vậy, nếu bạn chỉ đơn giản sử dụng API không phức tạp, như tôi thường (tôi sử dụng nó trong ipython rất nhiều), thì đây đơn giản là

yscale('log')
plot(...)

Hy vọng điều này sẽ giúp ai đó tìm kiếm một câu trả lời đơn giản! :).


-1

Bạn có thể sử dụng mã dưới đây:

np.log(df['col_whose_log_you_need']).iplot(kind='histogram', bins=100,
                                   xTitle = 'log of col',yTitle ='Count corresponding to column',
                                   title='Distribution of log(col_whose_log_you_need)')
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.