# 划分区间 bins = [0,1,2,3,4,5,10,15,20,25,30,35,40,45,50,60,70,80,90,100,1220] data=data_forecast_is_stk_bs_rpt_zq_befor_big['本年比上一年归母倍数'] # 统计每个柱子的数据 hist, edges = pd.cut(data, bins=bins, right=False, include_lowest=True, retbins=True) counts = hist.value_counts() # 按照 bins 的顺序给每个柱子指定标签 labels = [f'{bins[i]}-{bins[i+1]}' for i in range(len(bins)-1)] labels_sorted = sorted(labels, key=lambda x: bins[labels.index(x)]) fig, ax = plt.subplots(figsize=(18, 6)) # 绘制柱形图 plt.bar(labels_sorted, counts.values) labels_sorted = sorted(labels, key=lambda x: bins[labels.index(x)]) plt.xticks(labels_sorted) # 添加数据标签 for i, v in enumerate(counts.values): plt.text(i, v, str(v), ha='center', va='bottom') # 设置图表标题和坐标轴标签 plt.title('Score Distribution') plt.xlabel('Range') plt.ylabel('Count') # 显示图表 plt.show() 图中x抽标签名和统计量不对应
时间: 2023-12-14 16:37:15 浏览: 65
关于pandas的离散化,面元划分详解
在你的代码中,你使用了 `pd.cut` 方法将数据划分到不同的区间中,并使用 `hist.value_counts()` 统计每个区间中数据的数量。然后,你使用 `labels` 列表来为每个区间指定标签。但是,在绘制柱形图时,你使用的是 `labels_sorted` 列表,这个列表并不是按照区间从小到大的顺序排列的,而是按照 `labels` 列表中的顺序排列的。因此,你需要将 `labels_sorted` 列表改为按照区间从小到大的顺序排列的。
你可以使用以下代码来对标签进行重新排序:
```
labels_sorted = [label for _, label in sorted(zip(bins, labels))]
```
这个代码将 `bins` 和 `labels` 列表打包成一个元组列表,然后按照 `bins` 中的元素从小到大进行排序,最后提取出排序后的标签列表。然后,你可以使用这个新的标签列表来绘制柱形图,如下所示:
```
fig, ax = plt.subplots(figsize=(18, 6))
plt.bar(labels_sorted, counts.values)
plt.xticks(labels_sorted)
for i, v in enumerate(counts.values):
plt.text(i, v, str(v), ha='center', va='bottom')
plt.title('Score Distribution')
plt.xlabel('Range')
plt.ylabel('Count')
plt.show()
```
这个代码会产生一个按照区间从小到大排列的柱形图,并且每个柱子上的标签和统计量都能正确对应。
阅读全文