使用matplotlib子图和seaborn时Y轴范围设置错误

4

我第一次使用seaborn,尝试使用matplotlib子图在不同的图表上绘制pandas数据框中的不同列。下面的简单代码生成了预期的图形,但是最后一个图没有适当的y范围(它似乎与数据框中的所有值的完整范围相关联)。 有人知道为什么会发生这种情况以及如何防止它吗?谢谢。

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

X = np.arange(0,10)
df = pds.DataFrame({'X': X, 'Y1': 4*X, 'Y2': X/2., 'Y3': X+3, 'Y4': X-7})

fig, axes = plt.subplots(ncols=2, nrows=2)
ax1, ax2, ax3, ax4 = axes.ravel()
sns.set(style="ticks")
sns.despine(fig=fig)

sns.regplot(x='X', y='Y1', data=df, fit_reg=False, ax=ax1)
sns.regplot(x='X', y='Y2', data=df, fit_reg=False, ax=ax2)
sns.regplot(x='X', y='Y3', data=df, fit_reg=False, ax=ax3)
sns.regplot(x='X', y='Y4', data=df, fit_reg=False, ax=ax4)

plt.show()

enter image description here

更新:我使用以下代码进行了修改:

fig, axes = plt.subplots(ncols=2, nrows=3)
ax1, ax2, ax3, ax4, ax5, ax6 = axes.ravel()

如果我在除了最后一个轴以外的任何轴上绘制数据,我就能得到我想要的结果:enter image description here 当然,我不想要空白框架。所有的图表都以类似的视觉效果呈现数据。当数据绘制在最后一个轴上时,它会获得一个范围太宽的 y 轴,就像第一个示例中一样。只有最后一个轴似乎有这个问题。有什么线索吗?

谢谢提供可复现的例子。如果您能指定预期的 y 轴范围,那将非常有帮助。 - Paul H
是的,抱歉我应该更具体一些。我编辑了我的帖子,并提供了一个有点可行的例子,创建了6个轴并仅使用其中4个。虽然很丑陋,但您会明白我在寻找什么。谢谢。 - Volty
1个回答

2
如果您希望所有轴上的刻度相同,可以使用以下命令创建子图:

如果您希望所有轴上的刻度相同,可以使用以下命令创建子图:

fig, axes = plt.subplots(ncols=2, nrows=2, sharey=True, sharex=True)

这将使所有图形共享相关轴:

enter image description here

如果您想手动更改特定ax的限制,可以在绘图命令末尾添加此行:

ax4.set_ylim(top=5) 

# or for both limits like this: 
# ax4.set_ylim([-2, 5])

这将会得到类似于以下的结果:

在此输入图片描述


感谢您的回复。第二张图就是我想要的,但我希望不必“手动”指定范围。奇怪的是,如果我创建第三行(或列)的轴,但只在前4或5个轴上绘制,我会得到我想要的图形(但有2个空轴)。只有最后一个轴具有更宽范围的y值。我编辑了我的帖子以反映这种行为。 - Volty
在这种情况下,“手动”意味着您可以使任何轴采用您喜欢的任何“好”的值范围。 您不必每次输入数字。 只需在代码中添加类似以下内容即可确保范围是“好”的:ax4.set_ylim([df.Y4.min() - 1, df.Y4.max() + 1]) - Primer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接