2010-04-15 23 views
23

Các mã sau thất bại trong việc chạy trên Python 2.5.4:AttributeError khi thêm colorbar trong matplotlib

from matplotlib import pylab as pl 
import numpy as np 

data = np.random.rand(6,6) 
fig = pl.figure(1) 
fig.clf() 
ax = fig.add_subplot(1,1,1) 
ax.imshow(data, interpolation='nearest', vmin=0.5, vmax=0.99) 
pl.colorbar() 

pl.show() 

Các thông báo lỗi là

C:\temp>python z.py 
Traceback (most recent call last): 
    File "z.py", line 10, in <module> 
    pl.colorbar() 
    File "C:\Python25\lib\site-packages\matplotlib\pyplot.py", line 1369, in colorbar 
    ret = gcf().colorbar(mappable, cax = cax, ax=ax, **kw) 
    File "C:\Python25\lib\site-packages\matplotlib\figure.py", line 1046, in colorbar 
    cb = cbar.Colorbar(cax, mappable, **kw) 
    File "C:\Python25\lib\site-packages\matplotlib\colorbar.py", line 622, in __init__ 
    mappable.autoscale_None() # Ensure mappable.norm.vmin, vmax 
AttributeError: 'NoneType' object has no attribute 'autoscale_None' 

Làm thế nào tôi có thể thêm colorbar để mã này?

Sau đây là các thông tin dịch:

Python 2.5.4 (r254:67916, Dec 23 2008, 15:10:54) [MSC v.1310 32 bit (Intel)] on win32 
Type "help", "copyright", "credits" or "license" for more information. 
>>> 

Trả lời

15

Lưu ý: Tôi đang sử dụng python 2.6.2. Lỗi tương tự đã được đưa ra với mã của bạn và sửa đổi sau giải quyết được vấn đề.

tôi đọc ví dụ colorbar sau: http://matplotlib.sourceforge.net/examples/pylab_examples/colorbar_tick_labelling_demo.html

from matplotlib import pylab as pl 
import numpy as np 

data = np.random.rand(6,6) 
fig = pl.figure(1) 
fig.clf() 
ax = fig.add_subplot(1,1,1) 
cax = ax.imshow(data, interpolation='nearest', vmin=0.5, vmax=0.99) 
fig.colorbar(cax) 

pl.show() 

Không chắc chắn tại sao ví dụ của bạn không làm việc. Tôi không quen với matplotlib.

+7

Một nên cẩn thận với những cái tên biến ở đây. Trong chức năng colorbar, có một từ khóa được gọi là 'cax' là viết tắt của' colorbar axes' (không phải cái bạn gọi là 'cax'), một tên tốt hơn cho kết quả của' imshow' có thể là 'img'. – pelson

47

(Đây là câu hỏi rất cũ mà tôi biết) Lý do bạn gặp vấn đề này là vì bạn đã trộn lẫn việc sử dụng máy trạng thái (matplotlib.pyplot) với cách tiếp cận OO để thêm hình ảnh vào một trục.

Chức năng plt.imshow khác với phương pháp ax.imshow chỉ bằng một cách khác nhau một cách tinh tế. Phương pháp ax.imshow:

  • tạo và trả về một hình ảnh đã được thêm vào các trục

Chức năng plt.imshow:

  • tạo và trả về một hình ảnh đã được thêm vào các trục hiện tại và đặt hình ảnh thành hình ảnh "hiện tại"/có thể đặt được (sau đó có thể được tự động chọn bởi hàm plt.colorbar).

Nếu bạn muốn để có thể sử dụng plt.colorbar (mà trong tất cả các trường hợp cực đoan nhất, bạn làm) với phương pháp ax.imshow, bạn sẽ cần phải vượt qua hình ảnh trở lại (đó là một thể hiện của một ScalarMappable) để plt.colorbar như là đối số đầu tiên:

plt.imshow(image_file) 
plt.colorbar() 

là tương đương (không sử dụng máy nhà nước) tới:

img = ax.imshow(image_file) 
plt.colorbar(img, ax=ax) 

Nếu rìu là hiện tại trục trong pyplot, sau đó kwarg ax=ax là không cần thiết.

+1

Có cách nào để truy cập hình ảnh từ chính đối tượng trục không?Giả sử bạn đang viết một hàm được truyền một đối tượng trục đã có một hình ảnh được vẽ vào nó, và bạn muốn hàm của bạn thêm một thanh màu. Tôi muốn làm một cái gì đó như plt.colorbar (ax.image, ax = axe). – Emma

+0

Bạn có thể sử dụng thuộc tính '' images'' trên các trục để có danh sách các ảnh trong các Trục. Ngoài ra, hình ảnh "hoạt động" trên trục có sẵn với '' gci'' (từ bộ nhớ). – pelson

-2

Add/chỉnh sửa các dòng sau vào code của bạn

plot = ax.imshow(data, interpolation='nearest', vmin=0.5, vmax=0.99) 
pl.colorbar(plot) 
+0

không trả lời câu hỏi – invictus

+0

@invictus Câu trả lời tương tự như những gì Gary đã đưa ra. Nó trả lời thỏa đáng nếu bạn đặt một số nỗ lực để TRY và EDIT mã bằng cách sử dụng bất cứ điều gì tôi đã viết. Mã của người hỏi không hoạt động vì pl.colorbar() được đưa ra trường hợp sai đối với lô. 'rìu' được định nghĩa trong mã là một cá thể cửa sổ theo mặc định. pl.colorbar() phải được chuyển hướng tới thể hiện cốt truyện. Trong trường hợp của tôi 'cốt truyện' là những gì được yêu cầu phải được trao cho pl.colorbar() mà là tương tự như 'cax' được đưa ra bởi Gary –

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