Python 如何注释具有两个以上堆叠的堆叠条?

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

我有以下数据集,其中包含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', '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)
      

      • 归属: