我在matplotlib中使用imshow()
时遇到了一些问题,特别是从中创建了一个pdf。
我正在处理500x500矩阵,为了这个问题,它只是随机值:
np.random.seed(1)
arr = np.array(np.random.random((500, 500)))
行和列都标有不同的名称,但为了这个问题,让我们简单一点:
labels = ["Big_Label" if x % 2 == 0 else "Bigger_Big_Label" for x in range(500)]
所以,我有以下代码来绘制该矩阵:
plt.rc('figure', figsize=(5,5), dpi=500)
fig = plt.figure()
ax = fig.add_subplot(111)
im = ax.imshow(arr)
# defining the same labels for rows and columns
ax.set_xticklabels([''] + labels)
ax.set_yticklabels([''] + labels)
# showing the labels for all the ticks
ax.xaxis.set_major_locator(ticker.MultipleLocator(1))
ax.yaxis.set_major_locator(ticker.MultipleLocator(1))
# personalising the ticks. In particular, labels on top
ax.tick_params(axis='both', which='both', labelsize=0.5, length=0)
ax.tick_params(axis='x',which='both', labelbottom='off', labeltop='on')
ax.tick_params(axis='both', pad=1)
# vertical labels
for label in im.axes.xaxis.get_ticklabels():
label.set_rotation(90)
plt.colorbar(im)
plt.title("Just a Big Title With Words")
# Removing outer lines because they hide part of the lines/columns
ax.spines['top'].set_visible(False)
ax.spines['right'].set_visible(False)
ax.spines['bottom'].set_visible(False)
ax.spines['left'].set_visible(False)
plt.savefig("fig.pdf")
plt.show()
第一个问题是标题,因为它位于xlabels之上:
第二个问题是,当缩放以查看ylabels和xlabels时,它们没有对齐。关于左侧标签,当我专门编码ax.tick_params(axis='both', pad=1)
时,它们之间的空格和绘图之间有不同的空格;如果我在IDE或终端中执行此python代码,则不会发生此问题(它们都接近图表)。所以我想将这个图像放入pdf时会发生什么事情?关于两个标签,您可以看到它们与实际的行和列不对齐;例如,顶部的第二个标签位于蓝色和橙色正方形的中间,当它应该与橙色正方形的中间对齐时:
最后,我尝试在fig.autofmt_xdate()
之前致电plt.savefig()
,但结果更糟,因为顶级标签完全没有对齐:
你能帮我解决这个问题吗?我知道你必须做一个大变焦来看标签,但对于我所拥有的真实矩阵是必要的。我也告诉我,我正在使用matplotlib 1.5;由于与其他工具的兼容性问题,我无法使用2.x
答案 0 :(得分:1)
有自动移动标题的PR。应该包含在v2.2(2月时间帧)https://github.com/matplotlib/matplotlib/pull/9498中,另一个用于标题填充https://github.com/matplotlib/matplotlib/pull/9816。所以我们正在努力。
至于PDF中的标签错位,如果labelsize
小于1.0,看起来标签对齐中存在错误,所以不要这样做:https://github.com/matplotlib/matplotlib/issues/9963这是一个错误,但我想象一个低优先级的。