web-dev-qa-db-fra.com

Graphique à barres groupées Pandas

J'ai une table dans un pandas DataFrame nommé df:

+--- -----+------------+-------------+----------+------------+-----------+
|avg_views| avg_orders | max_views   |max_orders| min_views  |min_orders |
+---------+------------+-------------+----------+------------+-----------+
| 23       | 123       |   135       | 500      |    3       |    1      |
+---------+------------+-------------+----------+------------+-----------+ 

Ce que je recherche maintenant, c'est de tracer un graphique à barres groupé qui me montre (moyenne, max, min) des vues et des commandes dans un seul graphique à barres.

c'est-à-dire que sur l'axe des x, il y aurait des vues et des commandes séparées par une distance et 3 barres de (moyenne, max, min) pour les vues et de même pour les commandes.

J'ai joint un exemple d'image de graphique à barres, juste pour savoir à quoi devrait ressembler le graphique à barres.

just sample: green color should be for avg, yellow for max and pin La couleur verte doit être pour moy, jaune pour max et rose pour moy.

J'ai pris le code suivant de définition de l'espacement entre les graphiques à barres groupés dans matplotlib mais cela ne fonctionne pas pour moi:

plt.figure(figsize=(13, 7), dpi=300)

groups = [[23, 135, 3], [123, 500, 1]]
group_labels = ['views', 'orders']
num_items = len(group_labels)
ind = np.arange(num_items)
margin = 0.05
width = (1. - 2. * margin) / num_items

s = plt.subplot(1, 1, 1)
for num, vals in enumerate(groups):
    print 'plotting: ', vals
    # The position of the xdata must be calculated for each of the two data 
    # series.
    xdata = ind + margin + (num * width)
    # Removing the "align=center" feature will left align graphs, which is 
    # what this method of calculating positions assumes.
    gene_rects = plt.bar(xdata, vals, width)
s.set_xticks(ind + 0.5)
s.set_xticklabels(group_labels)

traçage: [23, 135, 3] ... ValueError: incompatibilité de forme: les objets ne peuvent pas être diffusés sur une seule forme

11
Shubham

Utilisation de pandas:

import pandas as pd

groups = [[23,135,3], [123,500,1]]
group_labels = ['views', 'orders']

# Convert data to pandas DataFrame.
df = pd.DataFrame(groups, index=group_labels).T

# Plot.
pd.concat(
    [df.mean().rename('average'), df.min().rename('min'), 
     df.max().rename('max')],
    axis=1).plot.bar()

Result plot

18
IanS