python条形图不居中

时间:2018-05-24 04:16:10

标签: python matplotlib

我正在尝试构建一个简单的直方图。出于某种原因,我的酒吧表现异常。正如你在这张照片中所看到的,我的酒吧超过" 3"移到右侧。我不确定是什么造成的。我做了对齐=' 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 is not centered over 3

要重新创建我的数据:

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

感谢您的帮助!

P / s:如果此信息相关,则为idk,但我使用的是seaborn-whitegrid样式。我试图重新创建一个包含样本数据的图表,但它仍然显示出来。这是一个错误吗?

hist created using random data

2 个答案:

答案 0 :(得分:1)

hist函数的行为完全符合预期。默认情况下,它会将您传递的数据拆分为10个区间,第一个区域的左边缘位于数据的最小值,最后一个区域的右边缘位于最大值。下图显示了以这种方式分组的随机生成的数据,用红色虚线标记了分档的边缘。

Histogram showing bin edges

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

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

我们要求6个值,因为我们正在定义bin edge ,这将产生5个bin,如下图所示:

Histogram with 5 bins

如果你想保持条形之间的间隙,你可以将区间数增加到9并略微调整偏移量,但这并不适用于所有情况(因为每个值都是1,所以这里有效) 2,3,4或5)。

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

Histogram with empty 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")

Histogram created with value_counts

答案 1 :(得分:0)

尝试在代码中使用类似的东西来创建所有直方图条到同一个地方。

plt.hist("Your data goes here", bins=range(1,7), align='left', rwidth=1, normed=True)

将数据放在您的数据到此处

的位置