Matplotlib imshow()问题:标题位于顶部xlabels之上,ylabels未在pdf

时间:2017-12-08 16:24:55

标签: python python-3.x matplotlib

我在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之上:

enter image description here

第二个问题是,当缩放以查看ylabels和xlabels时,它们没有对齐。关于左侧标签,当我专门编码ax.tick_params(axis='both', pad=1)时,它们之间的空格和绘图之间有不同的空格;如果我在IDE或终端中执行此python代码,则不会发生此问题(它们都接近图表)。所以我想将这个图像放入pdf时会发生什么事情?关于两个标签,您可以看到它们与实际的行和列不对齐;例如,顶部的第二个标签位于蓝色和橙色正方形的中间,当它应该与橙色正方形的中间对齐时:

enter image description here

最后,我尝试在fig.autofmt_xdate()之前致电plt.savefig(),但结果更糟,因为顶级标签完全没有对齐:

enter image description here

你能帮我解决这个问题吗?我知道你必须做一个大变焦来看标签,但对于我所拥有的真实矩阵是必要的。我也告诉我,我正在使用matplotlib 1.5;由于与其他工具的兼容性问题,我无法使用2.x

1 个答案:

答案 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这是一个错误,但我想象一个低优先级的。