2012-06-10 33 views
6

Tôi có một lỗi lạ mà tôi không thể sửa chữa mà không cần sự giúp đỡ của bạn. Sau khi tôi đặt một hình ảnh với imshow trong matplotlib, nó vẫn giữ nguyên mọi lúc ngay cả khi tôi thay đổi nó bằng phương pháp set_data. Chỉ cần có một cái nhìn vào ví dụ này:Matplotlib: không có hiệu lực của set_data trong imshow cho âm mưu

import numpy as np 
from matplotlib import pyplot as plt 


def newevent(event): 
    haha[1,1] += 1 
    img.set_data(haha) 
    print img.get_array() # the data is change at this point 
    plt.draw() 

haha = np.zeros((2,2)) 
img = plt.imshow(haha) 
print img.get_array()  # [[0,0],[0,0]] 
plt.connect('button_press_event', newevent) 
plt.show() 

Sau khi tôi vẽ nó, phương pháp set_data không thay đổi bất cứ điều gì trong cốt truyện. Ai đó có thể giải thích cho tôi tại sao?

EDIT

Chỉ cần thêm một vài dòng để chỉ ra những gì tôi thực sự muốn làm. Tôi muốn vẽ lại dữ liệu sau khi nhấn một nút chuột. Tôi không muốn xóa toàn bộ con số, bởi vì nó sẽ là ngu ngốc nếu chỉ có một điều thay đổi.

+0

Chỉ một cạnh sẽ có màu khác. – ahelm

+0

Bạn đang gọi 'newevent' ở đâu? – Levon

+0

xin lỗi. quên sao chép nó. – ahelm

Trả lời

2

Điều này có cung cấp cho bạn sản lượng bạn mong đợi không?

import numpy as np 
from matplotlib import pyplot as plt 

haha = np.zeros((2,2)) 
img = plt.imshow(haha) 
print img.get_array()  # [[0,0],[0,0]] 
haha[1,1] += 1 

img.set_data(haha)  
img = plt.imshow(haha)  # <<------- added this line 
print img.get_array()  # [[0,0],[0,1]] 
plt.show() 

Khi tôi hiển thị ô hai lần (trước khi thay đổi thành haha và cuối cùng), nó thay đổi.

+0

Tôi đã thay đổi đoạn mã để chỉ ra những gì tôi muốn có – ahelm

+0

@PateToni Tôi không thấy nơi bạn đang gọi 'newevent' - câu trả lời của tôi không giải quyết được vấn đề của bạn? – Levon

+0

Nó sẽ giải quyết nó, nhưng nó sẽ buộc một cốt truyện bổ sung. Mà tiêu thụ nhiều hơn và nhiều hơn nữa bộ nhớ mỗi khi bạn vẽ một 'imshow' mới. – ahelm

12

Sự cố là do bạn chưa cập nhật tỷ lệ pixel sau cuộc gọi đầu tiên.

Khi bạn nhanh chóng imshow, nó đặt vminvmax từ dữ liệu ban đầu và không bao giờ chạm vào lại. Trong mã của bạn, mã này đặt cả vminvmax thành 0, vì dữ liệu của bạn, haha = zeros((2,2)), là 0 ở mọi nơi.

Sự kiện mới của bạn nên bao gồm tính năng tự động hóa với img.autoscale() hoặc đặt cụm từ mở rộng mới một cách rõ ràng bằng cách đặt img.norm.vmin/vmax thành thứ bạn muốn.

+1

Cảm ơn! Điều này làm việc cho tôi. =) –

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