Pandas 绘图 hist sharex=False 的行为不符合预期

作者:编程家 分类: pandas 时间:2025-09-11

使用Pandas绘图时,有一个参数hist的选项sharex,用于控制是否共享x轴。然而,经过测试发现,在某些情况下,该参数的行为与预期不符合。

案例代码:

首先,我们导入所需的库并生成一个简单的示例数据集。

python

import pandas as pd

import numpy as np

import matplotlib.pyplot as plt

np.random.seed(0)

data = np.random.randn(1000)

df = pd.DataFrame(data, columns=['Value'])

接下来,我们使用Pandas绘制直方图,并设置sharex参数为False。

python

fig, axes = plt.subplots(nrows=2, ncols=1, sharex=False)

df['Value'].plot.hist(ax=axes[0])

df['Value'].plot.hist(ax=axes[1])

plt.show()

问题描述:

我们期望得到两个独立的直方图,因为我们显式地将sharex参数设置为False。然而,实际上,两个直方图的x轴依然是共享的。

原因分析:

这种行为出现的原因是Pandas在绘图时使用了matplotlib库。在matplotlib中,如果没有明确指定x轴对象,那么默认情况下,所有的子图将共享同一个x轴。

解决方案:

要解决这个问题,我们可以使用matplotlib的面向对象方式来绘制图形,并显式地指定每个子图的x轴对象。

代码修改:

python

fig, axes = plt.subplots(nrows=2, ncols=1, sharex=False)

df['Value'].plot.hist(ax=axes[0])

df['Value'].plot.hist(ax=axes[1])

# 显式地指定每个子图的x轴对象

axes[0].get_shared_x_axes().join(axes[0], axes[1])

axes[1].autoscale()

axes[1].set_xlabel('Value')

plt.show()

解决效果:

通过显式地指定每个子图的x轴对象,我们成功地解决了hist的sharex参数行为不符合预期的问题。现在,两个直方图的x轴完全独立,每个子图都有自己的x轴刻度和标签。

在本文中,我们探讨了Pandas绘图中hist的sharex参数行为不符合预期的问题,并提供了一个解决方案。我们通过使用matplotlib的面向对象方式,并显式地指定每个子图的x轴对象,成功地解决了这个问题。这个解决方案可以确保每个子图的x轴刻度和标签都是独立的,从而得到我们期望的绘图结果。