2017-04-22 2 views
1

Ich habe einen Matplotlib-Code gefunden und angepasst, um gruppierte Balkendiagramme zu erstellen. Der Code enthält jedoch keine Beschriftungen an der Spitze. Ich habe mehrere Ansätze ausprobiert, aber ich verstehe es einfach nicht richtig.Hinzufügen eines Datenlabels zu einem gruppierten Balkendiagramm in MatPlotLib

wird Ihr Endziel sein:

  1. Daten labels In den oberen Rand jeder Bar
  2. um die Außenseite der schwarzen Grenze Befreien Sie sich und die y-Achse Etiketten

Beliebig Hilfe (besonders bei # 1) wird sehr geschätzt!

Der Code:

#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") 

Antwort

1

Die Lösung ist ähnlich dem in dieser Frage: Adding value labels on a matplotlib bar chart

Jedoch biete ich Ihnen ein Beispiel, die eigene Art der Darstellung verwendet, und macht es somit leichter zu verstehen.

Die allgemeine Idee, um Beschriftungen über Balken zu erhalten, besteht darin, über die Patches innerhalb der Achsen zu iterieren und sie mit ihren jeweiligen Höhen zu kommentieren.

enter image description here

ich den Code ein wenig vereinfacht.

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() 
Verwandte Themen