matplotlib 向分组条形图添加数据标签[重复]

zlwx9yxi  于 2023-06-06  发布在  其他
关注(0)|答案(1)|浏览(131)

此问题已在此处有答案

How to plot and annotate a grouped bar chart(1个答案)
4天前关闭。
我设法找到并定制了一些matplotlib代码来创建分组条形图。但是,代码顶部没有标签。我试过几种方法,但我就是做不好。
我的最终目标是:
1.将数据标签添加到每个条形图的顶部
1.去掉外部周围的黑色边框和y轴标签
任何帮助(特别是#1)都非常感谢!
代码:

#Code adapted from:  
#https://chrisalbon.com/python/matplotlib_grouped_bar_plot.html
#matplotlib online

import pandas as pd
import matplotlib.pyplot as plt
import numpy as np

raw_data = {'plan_type': ['A1', 'A2', 'A3', 'A4', 'A5', 'A6'],
        'Group A':     [100, 0, 0, 0, 0, 0],
        'Group B':     [48, 16, 9, 22, 5, 0],
        'Group C':     [18, 28, 84, 34, 11, 0],
        'Group D': [49, 13, 7, 23, 6, 0],
        'Group E':          [57, 16, 9, 26, 3, 0]

    }
df = pd.DataFrame(raw_data, columns = ['plan_type', 'Group B', 'Group C', 'Group D', 'Group E'])

df2 =pd.DataFrame(raw_data, columns = ['plan_type', 'Group A'])


# Setting the positions and width for the bars
pos = list(range(len(df['Group B'])))
width = 0.2

# Plotting the bars
fig, ax = plt.subplots(figsize=(7, 2))

#This creates another y-axis that shares the same x-axis

# Create a bar with Group A data,
# in position pos + some width buffer,
plt.bar(pos,
    #using df['Group E'] data,
    df2['Group A'],
    # of width
    width*8,
    # with alpha 0.5
    alpha=1,
    # with color
    color='#E6E9ED',
    # with label the fourth value in plan_type
    label=df2['plan_type'][0])

# Create a bar with Group B data,
# in position pos,
plt.bar(pos,
    #using df['Group B'] data,
    df['Group B'],
    # of width
    width,
    # with alpha 1  
    alpha=1,
    # with color
    color='#900C3F',
    # with label the first value in plan_type
    label=df['plan_type'][0])

# Create a bar with Group C data,
# in position pos + some width buffer,
plt.bar([p + width for p in pos],
    #using df['Group C'] data,
    df['Group C'],
    # of width
    width,
    # with alpha 1
    alpha=1.0,
    # with color
    color='#C70039',
    # with label the second value in plan_type
    label=df['plan_type'][1])

# Create a bar with Group D data,
# in position pos + some width buffer,
plt.bar([p + width*2 for p in pos],
    #using df['Group D'] data,
    df['Group D'],
    # of width
    width,
    # with alpha 1
    alpha=1,
    # with color
    color='#FF5733',
    # with label the third value in plan_type
    label=df['plan_type'][2])

# Create a bar with Group E data,
# in position pos + some width buffer,
plt.bar([p + width*3 for p in pos],
    #using df['Group E'] data,
    df['Group E'],
    # of width
    width,
    # with alpha 1
    alpha=1,
    # with color
    color='#FFC300',
    # with label the fourth value in plan_type
    label=df['plan_type'][3])

# Set the y axis label
ax.set_ylabel('Percent')

# Set the chart's title
ax.set_title('A GRAPH - YAY!', fontweight = "bold")

# Set the position of the x ticks
ax.set_xticks([p + 1.5 * width for p in pos])

# Set the labels for the x ticks
ax.set_xticklabels(df['plan_type'])

# Setting the x-axis and y-axis limits
plt.xlim(min(pos)-width, max(pos)+width*5)
plt.ylim([0, 100] )
#plt.ylim([0, max(df['Group B'] + df['Group C'] + df['Group D'] + df['Group E'])] )

# Adding the legend and showing the plot.  Upper center location, 5 columns, 
Expanded to fit on one line.
plt.legend(['Group A','Group B', 'Group C', 'Group D', 'Group E'], loc='upper center', ncol=5, mode='expand', fontsize  ='x-small')

#plt.grid()  --> This would add a Grid, but I don't want that.

plt.show()
plt.savefig("PlanOffered.jpg")
li9yvcax

li9yvcax1#

答案与这个问题类似:Adding value labels on a matplotlib bar chart
然而,我为您提供了一个使用您自己类型的情节的例子,从而使其更容易理解。
为了获得条顶部的标签,一般的想法是在轴内的补丁上迭代,并用它们各自的高度来注解它们。

我简化了代码一点。

import pandas as pd
import matplotlib.pyplot as plt
import numpy as np

raw_data = {'plan_type': ['A1', 'A2', 'A3', 'A4', 'A5', 'A6'],
        'Group A':     [100, 0, 0, 0, 0, 0],
        'Group B':     [48, 16, 9, 22, 5, 0],
        'Group C':     [18, 28, 84, 34, 11, 0],
        'Group D': [49, 13, 7, 23, 6, 0],
        'Group E':          [57, 16, 9, 26, 3, 0]

    }
df2 =pd.DataFrame(raw_data, columns = ['plan_type', 'Group A'])
df = pd.DataFrame(raw_data, 
                  columns = ['plan_type', 'Group B', 'Group C', 'Group D', 'Group E'])

ax = df2.plot.bar(rot=0,color='#E6E9ED',width=1)
ax = df.plot.bar(rot=0, ax=ax, color=["#900C3F", '#C70039', '#FF5733', '#FFC300'], 
                 width = 0.8 )

for p in ax.patches[1:]:
    h = p.get_height()
    x = p.get_x()+p.get_width()/2.
    if h != 0:
        ax.annotate("%g" % p.get_height(), xy=(x,h), xytext=(0,4), rotation=90, 
                   textcoords="offset points", ha="center", va="bottom")

ax.set_xlim(-0.5, None)
ax.margins(y=0)
ax.legend(ncol=len(df.columns), loc="lower left", bbox_to_anchor=(0,1.02,1,0.08), 
          borderaxespad=0, mode="expand")
ax.set_xticklabels(df["plan_type"])
plt.show()

相关问题