# 划分区间 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)] fig, ax = plt.subplots(figsize=(18, 6)) # 绘制柱形图 plt.bar(counts.index.astype(str), counts.values) # 添加数据标签 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轴的显示顺序能不能按bins的顺序,目前是按柱子的统计量排序
时间: 2023-12-14 21:36:49 浏览: 56
是可以按照 bins 的顺序来显示 x 轴的。你可以先将 labels 按照 bins 的顺序排序,然后再将 x 轴标签设置为排序后的 labels。代码示例:
```
# 将 labels 按照 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)])
# 绘制柱形图并设置 x 轴标签
plt.bar(labels_sorted, counts.values)
plt.xticks(labels_sorted)
# 其他代码不变
plt.title('Score Distribution')
plt.xlabel('Range')
plt.ylabel('Count')
plt.show()
```
相关问题
# 划分区间 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['本年比上一年归母倍数'] data1 = data_forecast_is_stk_bs_rpt_cw_befor_big['本年比上一年归母倍数'] # 统计每个柱子的数据 hist, edges = pd.cut(data, bins=bins, right=False, include_lowest=True, retbins=True) hist1, edges1 = pd.cut(data1, bins=bins, right=False, include_lowest=True, retbins=True) counts = hist.value_counts() counts1 = hist1.value_counts() # 按照 hist 的顺序重新排序 counts counts = counts.reindex(hist.cat.categories) counts1 = counts1.reindex(hist1.cat.categories) # 按照 bins 的顺序给每个柱子指定标签 labels = counts.index.astype(str) labels1 = counts1.index.astype(str) fig, ax = plt.subplots(figsize=(18, 6)) # 绘制柱形图 #plt.bar(labels, counts) plt.bar(labels, counts, width=0.4, align='center', label='Data 1') plt.bar(labels1, counts1, width=0.4, align='center', label='Data 2') 2个柱子合并了能不能分开
可以分开绘制,只需要将绘制柱状图的代码分别写在两个子图中即可。可以参考如下代码:
```
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(18, 6))
# 绘制第一个子图
hist, edges = pd.cut(data, bins=bins, right=False, include_lowest=True, retbins=True)
hist1, edges1 = pd.cut(data1, bins=bins, right=False, include_lowest=True, retbins=True)
counts = hist.value_counts()
counts1 = hist1.value_counts()
counts = counts.reindex(hist.cat.categories)
counts1 = counts1.reindex(hist1.cat.categories)
labels = counts.index.astype(str)
labels1 = counts1.index.astype(str)
ax1.bar(labels, counts, width=0.4, align='center', label='Data 1')
ax1.set_title('Data 1')
# 绘制第二个子图
ax2.bar(labels1, counts1, width=0.4, align='center', label='Data 2')
ax2.set_title('Data 2')
# 添加图例
fig.legend(loc='upper right')
plt.show()
```
这里使用了 `subplots` 函数创建了两个子图,并将绘制柱状图的代码分别写在了两个子图中。同时,为了方便区分两个子图,我在每个子图的标题中添加了不同的数据标识。最后,通过 `fig.legend` 函数添加了图例。
import pandas as pd import matplotlib.pyplot as plt # 划分区间 bins = [0, 1, 2, 3, 4, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 60, 70, 80, 90, 100, 1220] # 获取数据 data1 = data_forecast_is_stk_bs_rpt_zq_befor_big['本年比上一年归母倍数'] data2 = data_forecast_is_stk_bs_rpt_cw_befor_big['本年比上一年归母倍数'] # 统计每个柱子的数据 hist1, edges1 = pd.cut(data1, bins=bins, right=False, include_lowest=True, retbins=True) hist2, edges2 = pd.cut(data2, bins=bins, right=False, include_lowest=True, retbins=True) counts1 = hist1.value_counts() counts2 = hist2.value_counts() # 按照 bins 的顺序给每个柱子指定标签 labels = counts1.index.astype(str) # 创建 Figure 对象和两个子图对象 fig, (ax1, ax2) = plt.subplots(nrows=1, ncols=2, figsize=(18, 6)) # 在第一个子图上绘制柱形图 ax1.bar(labels, counts1) for i, v in enumerate(counts1.values): ax1.text(i, v, str(v), ha='center', va='bottom') ax1.set_title('准确数据-本年小于前一年归母倍数(证券)') ax1.set_xlabel('Range') ax1.set_ylabel('Count') # 在第二个子图上绘制柱形图 ax2.bar(labels, counts2) for i, v in enumerate(counts2.values): ax2.text(i, v, str(v), ha='center', va='bottom') ax2.set_title('准确数据-本年小于前一年归母倍数(财务)') ax2.set_xlabel('Range') ax2.set_ylabel('Count') # 调整子图的位置和间距 fig.tight_layout() # 显示图表 plt.show() 是左右2个图要合成一个对比图
可以将两个子图合并成一个对比图,方法如下:
1. 首先将创建 Figure 对象的代码修改为 `fig, ax = plt.subplots(nrows=1, ncols=2, figsize=(18, 6))`,这样就只创建一个 Figure 对象和一个包含两个子图的 ax 对象。
2. 然后在第二个子图上绘制柱形图时,将 `ax2.bar(labels, counts2)` 改为 `ax.bar(labels, counts2, alpha=0.5)`,这样就可以在同一个子图上绘制两个柱形图,并使它们半透明重叠显示。
3. 最后在第一个子图上添加一个图例,代码如下:
```
ax1.bar(labels, counts1, label='证券', alpha=0.5)
ax1.legend()
```
这样就可以给第一个柱形图添加一个图例,用以表示该柱形图代表的是证券数据。
完整代码如下:
```
import pandas as pd
import matplotlib.pyplot as plt
# 划分区间
bins = [0, 1, 2, 3, 4, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 60, 70, 80, 90, 100, 1220]
# 获取数据
data1 = data_forecast_is_stk_bs_rpt_zq_befor_big['本年比上一年归母倍数']
data2 = data_forecast_is_stk_bs_rpt_cw_befor_big['本年比上一年归母倍数']
# 统计每个柱子的数据
hist1, edges1 = pd.cut(data1, bins=bins, right=False, include_lowest=True, retbins=True)
hist2, edges2 = pd.cut(data2, bins=bins, right=False, include_lowest=True, retbins=True)
counts1 = hist1.value_counts()
counts2 = hist2.value_counts()
# 按照 bins 的顺序给每个柱子指定标签
labels = counts1.index.astype(str)
# 创建 Figure 对象和一个包含两个子图的 ax 对象
fig, ax = plt.subplots(nrows=1, ncols=2, figsize=(18, 6))
# 在第一个子图上绘制柱形图,并添加图例
ax1 = ax[0]
ax1.bar(labels, counts1, label='证券', alpha=0.5)
ax1.legend()
for i, v in enumerate(counts1.values):
ax1.text(i, v, str(v), ha='center', va='bottom')
ax1.set_title('准确数据-本年小于前一年归母倍数(证券)')
ax1.set_xlabel('Range')
ax1.set_ylabel('Count')
# 在第二个子图上绘制柱形图
ax2 = ax[1]
ax.bar(labels, counts2, label='财务', alpha=0.5)
for i, v in enumerate(counts2.values):
ax2.text(i, v, str(v), ha='center', va='bottom')
ax2.set_title('准确数据-本年小于前一年归母倍数(财务)')
ax2.set_xlabel('Range')
ax2.set_ylabel('Count')
# 调整子图的位置和间距
fig.tight_layout()
# 显示图表
plt.show()
```
这样就可以得到一个包含两个柱形图的对比图,其中一个柱形图代表证券数据,另一个柱形图代表财务数据。
阅读全文