首页 > 解决方案 > python条形图不居中

问题描述

我正在尝试构建一个简单的直方图。出于某种原因,我的酒吧表现异常。正如您在这张图片中看到的,我的“3”上方的栏移到了右侧。我不确定是什么原因造成的。我做了 align='mid' 但它没有解决它。

这是我用来创建它的代码:

def createBarChart(colName):
    df[colName].hist(align='mid')
    plt.title(str(colName))
    RUNS = [1,2,3,4,5]
    plt.xticks(RUNS)
    plt.show()

    for column in colName:
        createBarChart(column)

这就是我得到的: bar 不以 3 为中心

要重新创建我的数据:

df = pd.DataFrame(np.random.randint(1,6,size=(100, 4)), columns=list('ABCD'))

谢谢您的帮助!

P/s:如果这个信息是相关的,idk,但我使用的是 seaborn-whitegrid 风格。我试图用样本数据重新创建一个图,它仍然出现。它是一个错误吗?

使用随机数据创建的 hist

标签: pythonmatplotlib

解决方案


hist函数的行为与预期的完全一样。默认情况下,它将您传递的数据分成 10 个 bin,第一个 bin 的左边缘为数据的最小值,最后一个 bin 的右边缘为最大值。下图显示了以这种方式分箱的随机生成的数据,用红色虚线标记了分箱的边缘。

显示 bin 边缘的直方图

解决此问题的方法是自己定义 bin 边缘,稍微调整最小值和最大值以使条形图在 x 轴刻度上居中。这可以通过 numpy 的linspace函数轻松完成(以随机生成的数据框中的 A 列为例):

bins = np.linspace(df["A"].min() - .5, df["A"].max() + .5, 6)
df["A"].hist(bins=bins)

我们要求 6 个值,因为我们正在定义 bin边缘,这将导致 5 个 bin,如下图所示:

带有 5 个 bin 的直方图

如果您想保持条之间的间隙,您可以将箱数增加到 9 并稍微调整偏移量,但这并非在所有情况下都有效(它在这里有效,因为每个值都是 1、2、3、4或 5)。

bins = np.linspace(df["A"].min() - .25, df["A"].max() + .25, 10)
df["A"].hist(bins=bins)

带空箱的直方图

最后,由于此数据包含离散值,并且您实际上是在绘制计数,您可以使用该value_counts函数创建一个系列,然后可以将其绘制为条形图:

df["A"].value_counts().sort_index().plot(kind="bar")
# Provide a 'color' argument if you need all of the bars to look the same.
df["A"].value_counts().sort_index().plot(kind="bar", color="steelblue")

使用 value_counts 创建的直方图


推荐阅读