matplotlib: các thanh màu và nhãn văn bản của nó


108

Tôi muốn tạo một chú giải colorbarcho a heatmap, sao cho các nhãn nằm ở trung tâm của mỗi màu rời rạc. Ví dụ mượn từ đây :

import matplotlib.pyplot as plt
import numpy as np
from matplotlib.colors import ListedColormap

#discrete color scheme
cMap = ListedColormap(['white', 'green', 'blue','red'])

#data
np.random.seed(42)
data = np.random.rand(4, 4)
fig, ax = plt.subplots()
heatmap = ax.pcolor(data, cmap=cMap)

#legend
cbar = plt.colorbar(heatmap)
cbar.ax.set_yticklabels(['0','1','2','>3'])
cbar.set_label('# of contacts', rotation=270)

# put the major ticks at the middle of each cell
ax.set_xticks(np.arange(data.shape[1]) + 0.5, minor=False)
ax.set_yticks(np.arange(data.shape[0]) + 0.5, minor=False)
ax.invert_yaxis()

#labels
column_labels = list('ABCD')
row_labels = list('WXYZ')
ax.set_xticklabels(column_labels, minor=False)
ax.set_yticklabels(row_labels, minor=False)

plt.show()

Điều này tạo ra âm mưu sau:

âm mưu pmesh

Lý tưởng nhất là tôi muốn tạo ra một thanh huyền thoại trong đó có bốn màu sắc và đối với mỗi màu sắc, một nhãn ở trung tâm của nó: 0,1,2,>3. Làm thế nào điều này có thể đạt được?

Câu trả lời:


113
import matplotlib.pyplot as plt
import numpy as np
from matplotlib.colors import ListedColormap

#discrete color scheme
cMap = ListedColormap(['white', 'green', 'blue','red'])

#data
np.random.seed(42)
data = np.random.rand(4, 4)
fig, ax = plt.subplots()
heatmap = ax.pcolor(data, cmap=cMap)

#legend
cbar = plt.colorbar(heatmap)

cbar.ax.get_yaxis().set_ticks([])
for j, lab in enumerate(['$0$','$1$','$2$','$>3$']):
    cbar.ax.text(.5, (2 * j + 1) / 8.0, lab, ha='center', va='center')
cbar.ax.get_yaxis().labelpad = 15
cbar.ax.set_ylabel('# of contacts', rotation=270)


# put the major ticks at the middle of each cell
ax.set_xticks(np.arange(data.shape[1]) + 0.5, minor=False)
ax.set_yticks(np.arange(data.shape[0]) + 0.5, minor=False)
ax.invert_yaxis()

#labels
column_labels = list('ABCD')
row_labels = list('WXYZ')
ax.set_xticklabels(column_labels, minor=False)
ax.set_yticklabels(row_labels, minor=False)

plt.show()

Bạn đã ở rất gần. Khi bạn có tham chiếu đến trục thanh màu, bạn có thể làm những gì bạn muốn, bao gồm cả việc đặt nhãn văn bản ở giữa. Bạn có thể muốn sử dụng định dạng để hiển thị rõ hơn.

bản giới thiệu


6

Để thêm vào câu trả lời của tacaswell , colorbar()hàm có một caxđầu vào tùy chọn mà bạn có thể sử dụng để chuyển một trục mà thanh màu sẽ được vẽ trên đó. Nếu bạn đang sử dụng đầu vào đó, bạn có thể trực tiếp đặt nhãn bằng trục đó.

import matplotlib.pyplot as plt
from mpl_toolkits.axes_grid1 import make_axes_locatable

fig, ax = plt.subplots()
heatmap = ax.imshow(data)
divider = make_axes_locatable(ax)
cax = divider.append_axes('bottom', size='10%', pad=0.6)
cb = fig.colorbar(heatmap, cax=cax, orientation='horizontal')

cax.set_xlabel('data label')  # cax == cb.ax

1
Tôi nghĩ rằng nó nên được axes_grid1thay vì axes.grid1.
rvf
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.