2009-04-21 44 views
247

Tôi muốn vẽ đồ thị với một trục lôgarít bằng matplotlib.Vẽ các trục lôgarit lô với matplotlib trong python

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ố âm mưu, nhưng tôi dường như không thể làm cho nó đú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() 

Trả lời

55

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

+1 cho 'semilogy()'. – EOL

+1

LOL, tôi đã cố gắng đăng nhập (FloatArray) cho wholetime, nhờ bạn đã lưu ngày của tôi – Pradeep

+3

Ngoài ra còn có [semilogx] (http://matplotlib.org/api/pyplot_api.html#matplotlib.pyplot.semilogx). Nếu bạn cần đăng nhập trên cả hai trục, hãy sử dụng [loglog] (http://matplotlib.org/api/pyplot_api.html#matplotlib.pyplot.loglog) – drevicko

259

Bạn có thể sử dụng phương thức Axes.set_yscale. Điều đó cho phép bạn thay đổi tỷ lệ sau khi đối tượng Axes đượ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 quy mô nếu bạn cần.

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

ax.set_yscale('log') 

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

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

result chart

+6

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

+1

Nếu tôi muốn có một trục mũ? –

+13

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

223

Trước hết, nó không phải là rất gọn gàng để trộn pylabpyplot mã. Còn gì nữa, pyplot style is preferred over using pylab.

Dưới đây là một mã hơi dọn dẹp, chỉ sử dụng pyplot chứ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() 

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, hãy 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ệ trục X, sử dụng pyplot.xscale() (hoặc Axes.set_xscale()).

Kiểm tra câu hỏi của tôi What is the difference between ‘log’ and ‘symlog’? để xem một vài ví dụ về tỷ lệ biểu đồ mà matplotlib cung cấp.

+0

Đã có một thời gian khó 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

+9

'pyplot.semilogy()' trực tiếp hơn. – EOL

8

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

tham khảo: http://matplotlib.org/api/pyplot_api.html#matplotlib.pyplot.bar

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

4

Vì vậy, nếu bạn chỉ đơn giản là sử dụng API không phức tạp, giống như tôi thường là (tôi sử dụng nó trong ipython rất nhiều), thì đây chỉ đơ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! :).

4

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

plt.yscale('log',basey=2) 
# where basex or basey are the bases of log 
Các vấn đề liên quan