在matplotlib pcolor图上设置正确对齐的轴标签

时间:2016-01-21 15:57:02

标签: python matplotlib plot

我有一个简单的matplotlib pcolor图,可以使用以下MWE进行复制:

import pandas as pd
import matplotlib.pyplot as plt 
import seaborn as sns
import numpy as np

test_data = np.array([[-0.00842278, -0.03332517, -0.01478557, -0.00275494],
       [ 0.16338327,  0.08383871,  0.03093892,  0.03380778],
       [-0.02246485, -0.1490697 , -0.14918824, -0.12745594],
       [ 0.02477743,  0.1537171 ,  0.13111042,  0.11950057],
       [-0.15408288, -0.04697411, -0.0068787 , -0.01576426],
       [ 0.03508095,  0.19434805,  0.13647802,  0.11276903],
       [-0.16683297,  0.05313956,  0.0283734 ,  0.01179509],
       [-0.08839198, -0.02095752, -0.00573671,  0.00360559],
       [ 0.15476156, -0.06324123, -0.04798161, -0.03844384],
       [-0.056892  , -0.09804484, -0.09506561, -0.08506755],
       [ 0.2318552 , -0.02209629, -0.04530164, -0.02950514],
       [-0.11914883,  0.00965362, -0.02431899, -0.0203009 ],
       [ 0.16025558,  0.02234824, -0.01480751, -0.01487853],
       [ 0.17345419, -0.04348332, -0.07625766, -0.05771962]])

test_df = pd.DataFrame(1 - abs(test_data))
test_df.columns = ['3', '6', '9', '12']
test_df.index = ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '15', '20', '25', '30']
plt.pcolor(test_df, cmap=plt.cm.RdYlGn, vmin=0, vmax=1)
plt.show()

产生这个:

plot without aligned axis labels

从上面可以看出,轴标签不正确,也没有与图的彩色矩形正确对齐。

我可以使用以下代码在x轴上创建预期的轴标记:

ax = plt.gca()
labels = [u'', u'3', u'', u'6', u'', u'9', u'', u'12', u'']
ax.set_xticklabels(labels)

产生这个:

second plot corrected x axis

我的问题是我无法在y轴上重现这一点,因为标签与矩形的中心不一致。

有没有办法让x和y轴标签正确,如数据框标题和索引中所述?确保标签的中心位于矩形上,而不是边缘上。

2 个答案:

答案 0 :(得分:2)

这样做并不好(你将tick标签与数据分离),但你可以这样做:

fig,ax = plt.subplots()

ax.pcolor(test_df, cmap=plt.cm.RdYlGn, vmin=0, vmax=1)

ax.set_yticks(np.arange(len(test_df.index))+0.5)
ax.set_yticklabels(test_df.index)

ax.set_xticks(np.arange(len(test_df.columns))+0.5)
ax.set_xticklabels(test_df.columns)

我们将每个0.5, 1.5, 2.5(以它们为中心)等设置为滴答,然后设置dataframe索引和列中的刻度标签。

enter image description here

答案 1 :(得分:1)

我发现使用127.0.0.1 localhost testproject.dev # later on for mulisite sub domains 127.0.0.1 localhost.com 127.0.0.1 subdomain.localhost.com

,我认为另一种解决方案更直接
sns

正如您将注意到的,它绘制完全相同的内容,但直接使用索引和列作为标签。

另一个不同之处在于它使用import pandas as pd import matplotlib.pyplot as plt import seaborn as sns %matplotlib # magic command for sns to use matplotlib test_data = np.array([[-0.00842278, -0.03332517, -0.01478557, -0.00275494], [ 0.16338327, 0.08383871, 0.03093892, 0.03380778], [-0.02246485, -0.1490697 , -0.14918824, -0.12745594], [ 0.02477743, 0.1537171 , 0.13111042, 0.11950057], [-0.15408288, -0.04697411, -0.0068787 , -0.01576426], [ 0.03508095, 0.19434805, 0.13647802, 0.11276903], [-0.16683297, 0.05313956, 0.0283734 , 0.01179509], [-0.08839198, -0.02095752, -0.00573671, 0.00360559], [ 0.15476156, -0.06324123, -0.04798161, -0.03844384], [-0.056892 , -0.09804484, -0.09506561, -0.08506755], [ 0.2318552 , -0.02209629, -0.04530164, -0.02950514], [-0.11914883, 0.00965362, -0.02431899, -0.0203009 ], [ 0.16025558, 0.02234824, -0.01480751, -0.01487853], [ 0.17345419, -0.04348332, -0.07625766, -0.05771962]]) Cols = ['3', '6', '9', '12'] Index = ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '15', '20', '25', '30'] test_df = pd.DataFrame(1 - abs(test_data),index=Index, columns=Cols) sns.heatmap(test_df,cmap=plt.cm.RdYlGn,vmin=0,vmax=1,cbar=True) 的原始索引,因此您的图表不像matplotlib解决方案那样颠倒。

请注意,在我的电脑上,我必须放大窗口以查看颜色条,否则它会被隐藏。