Thay đổi giá trị trên trục đồ thị matplotlib imshow ()


89

Giả sử tôi có một số dữ liệu đầu vào:

data = np.random.normal(loc=100,scale=10,size=(500,1,32))
hist = np.ones((32,20)) # initialise hist
for z in range(32):
    hist[z],edges = np.histogram(data[:,0,z],bins=np.arange(80,122,2))

Tôi có thể vẽ nó bằng cách sử dụng imshow():

plt.imshow(hist,cmap='Reds')

nhận được:

nhập mô tả hình ảnh ở đây

Tuy nhiên, các giá trị trục x không khớp với dữ liệu đầu vào (nghĩa là giá trị trung bình của 100, phạm vi từ 80 đến 122). Do đó, tôi muốn thay đổi trục x để hiển thị các giá trị trong edges.

Tôi đã thử:

ax = plt.gca()
ax.set_xlabel([80,122]) # range of values in edges
...
# this shifts the plot so that nothing is visible

ax.set_xticklabels(edges)
...
# this labels the axis but does not centre around the mean:

nhập mô tả hình ảnh ở đây

Bất kỳ ý tưởng nào về cách tôi có thể thay đổi các giá trị trục để phản ánh dữ liệu đầu vào mà tôi đang sử dụng?


Sử dụng pcolorthay vì imshownhư đã đề cập trong câu trả lời này .
Nirmal

Câu trả lời:


143

Tôi sẽ cố gắng tránh thay đổi xticklabelsnếu có thể, nếu không, nó có thể rất khó hiểu nếu bạn ghi chồng biểu đồ của mình với dữ liệu bổ sung chẳng hạn.

Xác định phạm vi lưới của bạn có lẽ là tốt nhất và với imshownó có thể được thực hiện bằng cách thêm extenttừ khóa. Bằng cách này, các trục được điều chỉnh tự động. Nếu bạn muốn thay đổi các nhãn tôi sẽ sử dụng set_xticksvới một số định dạng. Thay đổi nhãn trực tiếp nên là biện pháp cuối cùng.

fig, ax = plt.subplots(figsize=(6,6))

ax.imshow(hist, cmap=plt.cm.Reds, interpolation='none', extent=[80,120,32,0])
ax.set_aspect(2) # you may also use am.imshow(..., aspect="auto") to restore the aspect ratio

nhập mô tả hình ảnh ở đây


18
Nó cũng đáng lưu ý rằng nó interpolation="none"đã được sử dụng ở đây, một đại diện chính xác hơn nhiều của dữ liệu thực.
Hooked

4
Một câu trả lời hữu ích nhất; Tôi đã sử dụng nó để tạo biểu đồ màu của một hàm gồm hai biến (cụ thể là dữ liệu địa chấn). Tôi cũng đã thêm tùy chọn "khía cạnh = 'tự động'" trong imshow () để tôi có thể 'kéo dài và ép chặt' màn hình địa chấn.
Kurt Peek

10

Tôi đã gặp sự cố tương tự và google đã gửi cho tôi bài đăng này. Giải pháp của tôi hơi khác và ít gọn gàng hơn, nhưng hy vọng điều này có thể hữu ích cho ai đó.

Hiển thị hình ảnh của bạn bằng matplotlib.pyplot.imshow nói chung là một cách nhanh chóng để hiển thị dữ liệu 2D. Tuy nhiên, điều này theo mặc định sẽ gắn nhãn các trục với số lượng pixel. Nếu dữ liệu 2D bạn đang vẽ tương ứng với một số lưới thống nhất được xác định bởi các mảng x và y, thì bạn có thể sử dụng matplotlib.pyplot.xticks và matplotlib.pyplot.yticks để gắn nhãn các trục x và y bằng cách sử dụng các giá trị trong các mảng đó. Chúng sẽ liên kết một số nhãn, tương ứng với dữ liệu lưới thực tế, với số lượng pixel trên các trục. Và làm điều này nhanh hơn nhiều so với việc sử dụng một cái gì đó như pcolor chẳng hạn.

Đây là một nỗ lực về việc này với dữ liệu của bạn:

import matplotlib.pyplot as plt

# ... define 2D array hist as you did

plt.imshow(hist, cmap='Reds')
x = np.arange(80,122,2) # the grid to which your data corresponds
nx = x.shape[0]
no_labels = 7 # how many labels to see on axis x
step_x = int(nx / (no_labels - 1)) # step between consecutive labels
x_positions = np.arange(0,nx,step_x) # pixel count at label position
x_labels = x[::step_x] # labels you want to see
plt.xticks(x_positions, x_labels)
# in principle you can do the same for y, but it is not necessary in your case
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.