Python 如何注释具有两个以上堆叠的堆叠条?
我有以下数据集,其中包含4个不同级别的每周信息。我创建了一个堆叠条形图,每个堆叠代表一个级别,每个条形图一周。 如何添加图表上每种颜色对应的值Python 如何注释具有两个以上堆叠的堆叠条?,python,pandas,matplotlib,bar-chart,Python,Pandas,Matplotlib,Bar Chart,我有以下数据集,其中包含4个不同级别的每周信息。我创建了一个堆叠条形图,每个堆叠代表一个级别,每个条形图一周。 如何添加图表上每种颜色对应的值 import numpy as np import pandas as pd import matplotlib as plt plt.style.use('ggplot') %matplotlib inline rng=pd.date_range('2020-01-02', periods=10,freq='7D') level=['low', 'm
import numpy as np
import pandas as pd
import matplotlib as plt
plt.style.use('ggplot')
%matplotlib inline
rng=pd.date_range('2020-01-02', periods=10,freq='7D')
level=['low', 'medium', 'high', 'very_high']
values=np.random.randint(1, 100, size=(10, 4))
df=pd.DataFrame(index=rng, data=values, columns=level)
df.plot.bar(stacked=True,figsize=(15,10), alpha=0.6)
plt.legend(loc='upper right', bbox_to_anchor=(1.1, 1.05))
我试着用这个代码使用一个类似的问题,但它似乎不适用于4轴。此外,所有的条都应该等于1,而不是
res = df.div(df.sum(axis=1), axis=0)
fig = plt.figure(facecolor="white")
ax = fig.add_subplot(1, 1, 1)
bar_width = 3
bar_l = df.index
# tick_pos = [i + (bar_width / 2) for i in bar_l]
ax1 = ax.bar(bar_l, res['low'], width=bar_width, label="A", color="green")
ax2 = ax.bar(bar_l, res['medium'], bottom=res['low'], width=bar_width, label="medium", color="blue")
ax3 = ax.bar(bar_l, res['high'], bottom=res['low'], width=bar_width, label="high", color="yellow")
ax4 = ax.bar(bar_l, res['very_high'], bottom=res['low'], width=bar_width, label="very_high", color="red")
- 除非每行中的值之和等于1,否则堆叠条不会等于1。
- 我建议在DataFrame中添加具有“normed”值的列,然后绘制该列。这也将解决正确标记堆叠钢筋的问题
- 在这种情况下,将
替换为df
res=df.div(df.sum(axis=1),axis=0)
- 标签来自数据框中的值
将numpy导入为np
作为pd进口熊猫
将matplotlib.pyplot作为plt导入
资料
rng=pd.日期范围('2020-01-02',周期=10,频率=7D')
级别=[‘低’、‘中’、‘高’、‘甚高’]
np.随机种子(450)
values=np.random.randint(1100,size=(10,4))
df=pd.DataFrame(索引=rng,数据=value,列=level)
#显示(df)
低-中-高-甚高
2020-01-02 64 47 79 43
2020-01-09 50 56 24 71
2020-01-16 44 66 68 21
2020-01-23 16 52 77 12
2020-01-30 92 83 9 14
2020-02-06 89 5 92 58
2020-02-13 30 66 3 89
2020-02-20 59 15 93 22
2020-02-27 95 68 56 47
2020-03-05 88 58 59 20
水平堆积钢筋
plt.style.use('ggplot'))
ax=df.plot(叠加=True,kind='barh',figsize=(12,8))
ax.图例(bbox_to_anchor=(1.05,1),loc='左上角',borderaxespad=0。)
ax.set\u yticklabels(labels=df.index.date)
#.补丁是图表中的所有内容
对于ax.patches中的rect:
#找到所有东西的位置
高度=矩形。获取高度()
width=rect.get_width()
x=rect.get_x()
y=rect.get_y()
#条形图的宽度是数据值,可以用作标签
label_text=width#f'{width:.2f}如果标签中有十进制值
标签x=x+宽度/2
标签y=y+高度/2
ax.text(label_x,label_y,label_text,ha='center',va='center',fontsize=8)
垂直叠条
ax=df.plot(叠加=True,种类=bar',figsize=(12,8))
ax.图例(bbox_to_anchor=(1.05,1),loc='左上角',borderaxespad=0。)
ax.set\u xticklabels(标签=df.index.date)
#.补丁是图表中的所有内容
对于ax.patches中的rect:
#找到所有东西的位置
高度=矩形。获取高度()
width=rect.get_width()
x=rect.get_x()
y=rect.get_y()
#条形图的宽度是数据值,可以用作标签
label_text=f'{height}'#f'{height:.2f}',如果您将十进制值作为标签
标签x=x+宽度/2
标签y=y+高度/2
ax.text(label_x,label_y,label_text,ha='center',va='center',fontsize=8)
- 归属:
- 除非每行中的值之和等于1,否则堆叠条不会等于1。
- 我建议在DataFrame中添加具有“normed”值的列,然后绘制该列。这也将解决正确标记堆叠钢筋的问题
- 在这种情况下,将
替换为df
res=df.div(df.sum(axis=1),axis=0)
- 标签来自数据框中的值
将numpy导入为np
作为pd进口熊猫
将matplotlib.pyplot作为plt导入
资料
rng=pd.日期范围('2020-01-02',周期=10,频率=7D')
级别=[‘低’、‘中’、‘高’、‘甚高’]
np.随机种子(450)
values=np.random.randint(1100,size=(10,4))
df=pd.DataFrame(索引=rng,数据=value,列=level)
#显示(df)
低-中-高-甚高
2020-01-02 64 47 79 43
2020-01-09 50 56 24 71
2020-01-16 44 66 68 21
2020-01-23 16 52 77 12
2020-01-30 92 83 9 14
2020-02-06 89 5 92 58
2020-02-13 30 66 3 89
2020-02-20 59 15 93 22
2020-02-27 95 68 56 47
2020-03-05 88 58 59 20
水平堆积钢筋
plt.style.use('ggplot'))
ax=df.plot(叠加=True,kind='barh',figsize=(12,8))
ax.图例(bbox_to_anchor=(1.05,1),loc='左上角',borderaxespad=0。)
ax.set\u yticklabels(labels=df.index.date)
#.补丁是图表中的所有内容
对于ax.patches中的rect:
#找到所有东西的位置
高度=矩形。获取高度()
width=rect.get_width()
x=rect.get_x()
y=rect.get_y()
#条形图的宽度是数据值,可以用作标签
label_text=width#f'{width:.2f}如果标签中有十进制值
标签x=x+宽度/2
标签y=y+高度/2
ax.text(label_x,label_y,label_text,ha='center',va='center',fontsize=8)
垂直叠条
ax=df.plot(叠加=True,种类=bar',figsize=(12,8))
ax.图例(bbox_to_anchor=(1.05,1),loc='左上角',borderaxespad=0。)
ax.set\u xticklabels(标签=df.index.date)
#.补丁是图表中的所有内容
对于ax.patches中的rect:
#找到所有东西的位置
高度=矩形。获取高度()
width=rect.get_width()
x=rect.get_x()
y=rect.get_y()
#条形图的宽度是数据值,可以用作标签
label_text=f'{height}'#f'{height:.2f}',如果您将十进制值作为标签
标签x=x+宽度/2
标签y=y+高度/2
ax.text(label_x,label_y,label_text,ha='center',va='center',fontsize=8)
- 归属: