2009-03-15 36 views
8

Tôi hiện đang có mã gọi matplotlib.pylab.plot nhiều lần để hiển thị nhiều bộ dữ liệu trên cùng một màn hình và Matplotlib chia tỷ lệ cho toàn bộ min và max, xem xét tất cả các ô. Có cách nào để yêu cầu nó quy mô từng ô một cách độc lập, với min và max của ô đó?Nhiều ô chồng chéo với tỷ lệ độc lập trong Matplotlib

Trả lời

3

Không có hỗ trợ trực tiếp cho điều này, nhưng đây là một số mã từ một mailing list posting rằng illlustrates hai trục dọc độc lập:

x=arange(10) 
y1=sin(x) 
y2=10*cos(x) 

rect=[0.1,0.1,0.8,0.8] 
a1=axes(rect) 
a1.yaxis.tick_left() 
plot(x,y1) 
ylabel('axis 1') 
xlabel('x') 

a2=axes(rect,frameon=False) 
a2.yaxis.tick_right() 
plot(x,y2) 
a2.yaxis.set_label_position('right') 
ylabel('axis 2') 
a2.set_xticks([]) 
+0

Phạm vi của câu hỏi ban đầu dường như đã cho N thay vì 2 ô được chia tỷ lệ - khi tôi thử điều này với 3 hoặc nhiều hơn nó chết (sử dụng a2, a3 và cứ thế cho các trường hợp trục bổ sung.) toàn bộ các tập hợp dữ liệu hiển thị đúng tỷ lệ cùng một lúc? – tehwalrus

0

Đây là cách bạn tạo ra một cốt truyện duy nhất (add_subplot (1,1,1)) và giới hạn tỷ lệ trên các trục y.

myFig = figure() 
myPlot = self.figure.add_subplot(1,1,1) 
myPlot.plot([1,2,3,4,5], [5,4,3,2,1], '+r') 
myPlot.set_ylim(1,5) # Limit y-axes min 1, max 5 
0

Tôi cần một cái gì đó như thế này nhưng muốn tạo một ví dụ mà bạn có thể sao chép và dán vào vỏ tương tác và hãy xem nó. Dưới đây là dành cho những người trong số các bạn yêu cầu giải pháp làm việc:

from numpy import arange 
from math import sin, cos 
import matplotlib.pyplot as plt 

x = arange(10) 
y1 = [sin(i) for i in x] 
y2 = [10*cos(i) for i in x] 

rect = [0.1, 0.1, 0.8, 0.8] 
a1 = plt.axes(rect) # Create subplot, rect = [left, bottom, width, height] in normalized (0, 1) units 
a1.yaxis.tick_left() # Use ticks only on left side of plot 
plt.plot(x, y1) 
plt.ylabel('axis 1') 
plt.xlabel('x') 

a2 = plt.axes(rect, frameon=False) # frameon, if False, suppress drawing the figure frame 
a2.yaxis.tick_right() 
plt.plot(x, y2) 
a2.yaxis.set_label_position('right') 
plt.ylabel('axis 2') 
a2.set_xticks([]) 

plt.show() 

Thử nghiệm và hoạt động ở trăn 2.7.6, numpy 1.8.1, matpotlib 1.3.1. Tôi sẽ tiếp tục chơi với nó, tìm kiếm một cách gọn gàng để làm việc với các ô xếp chồng ngày tháng. Tôi sẽ đăng lại những phát hiện của mình.

0

Đây là giải pháp sử dụng các ô ngày tháng, và tôi nghĩ giải pháp tối ưu nhất của nó bằng cách sử dụng twinx() một tay ngắn để thêm trục y thứ hai.

import matplotlib.pyplot as plt 
import matplotlib.dates as md 
import datetime 
import numpy 
numpy.random.seed(0) 
t = md.drange(datetime.datetime(2012, 11, 1), 
      datetime.datetime(2014, 4, 01), 
      datetime.timedelta(hours=1)) # takes start, end, delta 
x1 = numpy.cumsum(numpy.random.random(len(t)) - 0.5) * 40000 
x2 = numpy.cumsum(numpy.random.random(len(t)) - 0.5) * 0.002 
fig = plt.figure() 
ax1 = fig.add_subplot(111) 
fig.suptitle('a title', fontsize=14) 
fig.autofmt_xdate() 
plt.ylabel('axis 1') 
plt.xlabel('dates') 
ax2 = ax1.twinx() 
ax1.plot_date(t, x1, 'b-', alpha=.65) 
ax2.plot_date(t, x2, 'r-', alpha=.65) 
plt.ylabel('axis 2') 
plt.show() 

Từ các tài liệu, matplotlib.pyplot.twinx (ax = Không) Thực hiện một trục thứ hai chia sẻ trục x. Các trục mới sẽ phủ rìu (hoặc các trục hiện tại nếu rìu là Không). Các ve cho ax2 sẽ được đặt ở bên phải, và cá thể ax2 được trả về. Thêm here.

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