2012-02-02 30 views
21

Tôi đã cố gắng vẽ một hình elip thành một âm mưu imshow. Nó hoạt động, nhưng vẽ hình elip sau khi vẽ hình ảnh dường như để tăng xlim và ylim, dẫn đến một biên giới, mà tôi muốn thoát khỏi:matplotlib: giới hạn khi sử dụng âm mưu và imshow trong cùng một trục

Lưu ý rằng có NO đường viền màu trắng trực tiếp sau khi gọi imshow.

Mã của tôi trông như sau:

self.dpi = 100 
self.fig = Figure((6.0, 6.0), dpi=self.dpi) 
self.canvas = FigureCanvas(self.fig) 
self.canvas.setMinimumSize(800, 400) 
self.cax = None 
self.axes = self.fig.add_subplot(111) 
self.axes.imshow(channel1, interpolation="nearest") 
self.canvas.draw() 
self.axes.plot(dat[0], dat[1], "b-") 

Tôi đã cố gắng thiết lập các giới hạn trước và sau khi gọi "âm mưu", không có hiệu lực thi hành

# get limits after calling imshow 
xlim, ylim = pylab.xlim(), pylab.ylim() 
... 
# set limits before/after calling plot 
self.axes.set_xlim(xlim) 
self.axes.set_ylim(ylim) 

Làm thế nào tôi có thể buộc âm mưu không tăng giới hạn con số hiện tại?

Solution (nhờ Joe):

#for newer matplotlib versions 
self.axes.imshow(channel1, interpolation="nearest") 
self.axes.autoscale(False) 
self.axes.plot(dat[0], dat[1], "b-") 

#for older matplotlib versions (worked for me using 0.99.1.1) 
self.axes.imshow(channel1, interpolation="nearest") 
self.axes.plot(dat[0], dat[1], "b-", scalex=False, scaley=False) 

Trả lời

29

gì đang xảy ra là trục được autoscaling để phù hợp với mức độ của từng hạng mục bạn cốt truyện. Hình ảnh được tự động chắt chẽ hơn nhiều so với đường kẻ, vv (imshow về cơ bản gọi là ax.axis('image')).

Nhận giới hạn trục trước và đặt chúng sau khi đã hoạt động. (Tuy nhiên, chỉ cần thực hiện sạch hơn limits = axes.axis() trước và sau axes.axis(limits)).

Tuy nhiên, nếu bạn không muốn tự động sửa, tốt nhất là chỉ tắt tính năng tự động tắt sau âm mưu ban đầu. Hãy thử axes.autoscale(False) sau khi vẽ hình ảnh.

Như một ví dụ, so sánh này:

import matplotlib.pyplot as plt 
import numpy as np 

fig, ax = plt.subplots() 
ax.imshow(np.random.random((10,10))) 
ax.plot(range(11)) 
plt.show() 

enter image description here


Với điều này:

import matplotlib.pyplot as plt 
import numpy as np 

fig, ax = plt.subplots() 
ax.imshow(np.random.random((10,10))) 
ax.autoscale(False) 
ax.plot(range(11)) 
plt.show() 

enter image description here

+3

Hi Joe, cảm ơn vì exp chi tiết của bạn lan rộng! Phiên bản matplotlib của tôi có vẻ quá cũ (matplotlib .__ version__ = '0.99.1.1') vì nó không hỗ trợ cả plt.subplots() lẫn ax.autoscale, tuy nhiên khi bạn chỉ ra autoscale = False, tôi tìm thấy [giải pháp thay thế] (http://stackoverflow.com/questions/7386872/make-matplotlib-autoscaling-ignore-some-of-the-plots) để khắc phục sự cố của tôi: mỗi khi tôi sử dụng cốt truyện sau khi bắt đầu gọi imshow, tôi sử dụng các đối số từ khóa scalex = Sai, scaley = False, cái nào đúng! Cảm ơn bạn! – soramimo

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