python - 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
函数的行为与预期的完全一样。默认情况下,它将您传递的数据分成 10 个 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,如下图所示:
如果您想保持条之间的间隙,您可以将箱数增加到 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")
推荐阅读
- botframework - 如何在自适应卡片中放置可操作的图标
- excel - Excel 中的可搜索下拉列表
- elasticsearch - 如何将复合聚合与单个存储桶一起使用
- cocoapods - VialerPJSIP PJSIP “Pods-”目标具有传递依赖关系,包括静态链接的二进制文件:
- autohotkey - 如何在自动热键中重新映射 alt+tab?
- escaping - 如何使用 aws route53 list-resource-record-sets cli
- javascript - 添加的每个新项目都显示相同的日期时间
- java - java8 - 可选 - 如何正确使用?
- r - CRS(x) 中的 R 错误:PROJ4 参数-值对必须以 + 开头
- swift - 导航看起来像幻灯片