Python matplotlib/seaborn:热图图一半中的第一行和最后一行

Python matplotlib/seaborn:热图图一半中的第一行和最后一行,python,matplotlib,seaborn,Python,Matplotlib,Seaborn,当使用seaborn绘制热图(以及使用matplotlib绘制相关矩阵)时,第一行和最后一行被切成两半。 当我运行我在网上找到的这个最小代码示例时,也会发生这种情况 将熊猫作为pd导入 导入seaborn作为sns 将matplotlib.pyplot作为plt导入 数据=pd.read\u csv('https://raw.githubusercontent.com/resbaz/r-novice-gapminder-files/master/data/gapminder-FiveYearDa

当使用seaborn绘制热图(以及使用matplotlib绘制相关矩阵)时,第一行和最后一行被切成两半。 当我运行我在网上找到的这个最小代码示例时,也会发生这种情况

将熊猫作为pd导入
导入seaborn作为sns
将matplotlib.pyplot作为plt导入
数据=pd.read\u csv('https://raw.githubusercontent.com/resbaz/r-novice-gapminder-files/master/data/gapminder-FiveYearData.csv')
plt.图(figsize=(10,5))
sns.heatmap(data.corr())
plt.show()
y轴上的标签位于正确的位置,但行不完全在那里

几天前,它按预期工作。从那时起,我安装了texlive xetex,所以我再次删除了它,但它并没有解决我的问题


你知道我可能遗漏了什么吗?

不幸的是matplotlib 3.1.1;一般来说,带有固定刻度的反向轴。
这在当前的开发版本中是固定的;因此,你可以

  • 恢复到matplotlib 3.1.0
  • 使用matplotlib 3.1.2或更高版本
  • 手动设置热图限制(
    ax.set_ylim(底部,顶部)#将ylim设置为底部,顶部

使用上述方法和手动设置热图限制进行修复

首先

使用检查当前轴

ax.get_ylim()
(5.5, 0.5)
固定

ax.set_ylim(6.0, 0)

在3.1.0和3.1.1之间的matplotlib回归中有一个bug 您可以通过以下方式更正此问题:

import seaborn as sns
df_corr = someDataFrame.corr()
ax = sns.heatmap(df_corr, annot=True) #notation: "annot" not "annote"
bottom, top = ax.get_ylim()
ax.set_ylim(bottom + 0.5, top - 0.5)

这发生在matplotlib版本3.1.1中,正如

下面解决了我的问题

pip安装matplotlib==3.1.0

matplotlib 3.1.2已退出- 它可以通过conda forge在Anaconda云中获得,但我无法通过conda install安装它。 手动替代方案有效: 从github下载matplotlib 3.1.2并通过pip安装

 % curl https://codeload.github.com/matplotlib/matplotlib/tar.gz/v3.1.2 --output matplotlib-3.1.2.tar.gz
 % pip install matplotlib-3.1.2.tar.gz

rustyDev对conda forge的看法是正确的,但我不需要从github下载进行手动pip安装。对我来说,在Windows上,它直接起作用。情节也很好

可选点,答案不需要:

之后,我尝试了其他步骤,但它们不是必需的:在conda提示符中:conda search matplotlib--info显示没有新版本信息,最新的信息是3.1.1。因此,我使用
pip install matplotlib==3.1.2
尝试了pip,但pip说“需求已经满足”

然后根据medium.com/@rakshithvasudev/..
python-import-matplotlib-matplotlib获取版本。\uuu version\uuu
显示3.1.2已成功安装


顺便说一句,我在将Spyder更新到v4.0.0后直接遇到了这个错误。错误出现在混乱矩阵图中。几个月前已经提到了这一点。stackoverflow.com/questions/57225 685/…已经链接到这个seaborn问题。

我通过在代码中添加这一行来解决它,使用
matplotlib==3.1.1

ax.set\u ylim(已排序(ax.get\u xlim(),reverse=True))

注意。这项工作的唯一原因是x轴没有改变,因此在将来的mpl版本中使用时,请自行承担风险

对我有效:

b, t = plt.ylim()
b += 0.5
t -= 0.5
custom_ylim = (b, t)
plt.setp(axes, ylim=custom_ylim)

降级您的matplotlib

!pip install matplotlib==3.1.0
并将此行添加到绘图代码中:

ax[i].set_ylim(sorted(ax[i].get_xlim(), reverse=True))
 

正如@ImportanceOfBeingErnest所提到的,此问题是由于matplotlib特定版本中的seaborn热图损坏造成的,因此解决此问题的简单方法是升级matplotlib,如下所示:

pip install --upgrade matplotlib

你能提供实际数据吗?它看起来很小一般来说,我们的像素边界是-0.5到大小+0.5。看起来水平轴限制设置正确,但垂直轴限制设置不正确。你在任何地方搞乱了ylim吗?我已经看到了这个问题,但不知道如何恢复到matplotlib 3.1.0或手动设置热图限制(尝试了这个,但仍然被截断),并且迫不及待地等待3.1.2。如何恢复到matplotlib 3.1.0?这取决于您如何安装matplotlib。via pip see.是的,我对PyCharm还是新手。现在就知道了,谢谢。@talha06不,我是说情节限制。如果
ax=sns.heatmap(…)
,请将
ax.set_-ylim(…)
设置为您需要的任何限制。对于7个级别,我必须使用
ax.set_-ylim(0,7)
。仅使用ax.set_ylim(7)将一行减半。例如,这对我不起作用。但公平地说,我的问题是不同的,一整排热图都不见了。对我来说,恢复版本是唯一的出路,正如我在上面的评论中所提到的,它是有效的,尽管它看起来不合逻辑。为什么
bottom
要比
top
大?这对我很有用。plt.figure(figsize=(5,3))ax=sn.heatmap(cm,annot=True,fmt='')bottom,top=ax.get_ylim()ax.set_ylim(bottom+0.5,top-0.5)plt.xlabel('Prediction')plt.ylabel('Truth')plt.title('混乱矩阵')我无法更新包。我收到了这个错误:<代码>错误:由于环境环境无法安装包:[C\\\\用户\\WoBoo\\AnOnDa3\\Lbb站点包[\MatpTLIb\\Be后端\\BaseDeNo.AGG.CP37.WiNYAMD64 .PYD ]考虑使用--USER选项或检查权限。< /代码>在MACOS中进行了上述尝试。不熟悉Windows场景,但这似乎是本地权限问题。感谢您的回复。我最后安装了旧版本(matplotlib-3.1.0)。这会给线程增加什么呢?看看@ImportanceOfBeingErnest提出的三个解决方案,首先恢复到较低版本不是件好事。第三个需要更改代码,这在本例中是不必要的,第二个解决方案需要读者考虑安装哪个版本。最后也是最重要的一点,人们不想在这里阅读冗长的解释,他们只想跳到解决方案/代码部分。这个答案直接解决了这个问题。我希望这能解释我很乐意删除的其他原因。我不知道“使用matplotlib 3.1.2或更高版本”有什么不清楚的地方,我也不同意“人们不想在这里阅读冗长的解释,他们只想跳到解决方案/代码部分。”
ax[i].set_ylim(sorted(ax[i].get_xlim(), reverse=True))
 
pip install --upgrade matplotlib