web-dev-qa-db-fra.com

Seaborn Barplot - Affichage des valeurs

J'essaie de voir comment faire deux choses dans Seaborn avec l'utilisation d'un graphique à barres pour afficher les valeurs qui se trouvent dans le cadre de données, mais pas dans le graphique.

1) Je cherche à afficher les valeurs d'un champ dans une image tout en représentant graphiquement un autre. Par exemple, ci-dessous, je présente un graphique "astuce", mais j'aimerais placer la valeur de "total_bill" centrée au-dessus de chacune des barres (par exemple, 325,88 au-dessus de vendredi, 1778,40 au-dessus de samedi, etc.).

2) Existe-t-il un moyen de redimensionner les couleurs des barres, la valeur la plus faible de "total_bill" étant la plus claire (dans ce cas, vendredi) et la valeur la plus élevée de "total_bill" ayant la plus sombre. Évidemment, je collerais avec une couleur (c’est-à-dire le bleu) lorsque je ferais la mise à l’échelle.

Merci! Je suis sûr que c'est facile, mais ça me manque ..

Alors que je vois que d’autres pensent que c’est un doublon d’un autre problème (ou deux), il me manque la partie de la façon dont j’utilise une valeur qui ne figure pas dans le graphique comme base pour la résolution. étiquette ou l'ombrage. Comment puis-je dire, utilisez total_bill comme base. Je suis désolé, mais je ne peux tout simplement pas comprendre en fonction de ces réponses.

En commençant par le code suivant,

import pandas as pd
import seaborn as sns
%matplotlib inline
df=pd.read_csv("https://raw.githubusercontent.com/wesm/pydata-    book/master/ch08/tips.csv", sep=',')
groupedvalues=df.groupby('day').sum().reset_index()
g=sns.barplot(x='day',y='tip',data=groupedvalues)

J'obtiens le résultat suivant:

enter image description here

Solution provisoire:

for index, row in groupedvalues.iterrows():
    g.text(row.name,row.tip, round(row.total_bill,2), color='black', ha="center")

enter image description here

Sur le ombrage, en utilisant l'exemple ci-dessous, j'ai essayé ce qui suit:

import pandas as pd
import seaborn as sns
%matplotlib inline
df=pd.read_csv("https://raw.githubusercontent.com/wesm/pydata-book/master/ch08/tips.csv", sep=',')
groupedvalues=df.groupby('day').sum().reset_index()

pal = sns.color_palette("Greens_d", len(data))
rank = groupedvalues.argsort().argsort() 
g=sns.barplot(x='day',y='tip',data=groupedvalues)

for index, row in groupedvalues.iterrows():
    g.text(row.name,row.tip, round(row.total_bill,2), color='black', ha="center")

Mais cela m'a donné l'erreur suivante:

AttributeError: l'objet 'DataFrame' n'a pas d'attribut 'argsort'

J'ai donc essayé une modification:

import pandas as pd
import seaborn as sns
%matplotlib inline
df=pd.read_csv("https://raw.githubusercontent.com/wesm/pydata-book/master/ch08/tips.csv", sep=',')
groupedvalues=df.groupby('day').sum().reset_index()

pal = sns.color_palette("Greens_d", len(data))
rank=groupedvalues['total_bill'].rank(ascending=True)
g=sns.barplot(x='day',y='tip',data=groupedvalues,palette=np.array(pal[::-1])[rank])

et cela me laisse avec

IndexError: l'index 4 est hors limites pour l'axe 0 de taille 4

Fonctionne avec un seul axe ou avec une matrice de hache (sous-parcelles)

from matplotlib import pyplot as plt
import numpy as np

def show_values_on_bars(axs):
    def _show_on_single_plot(ax):        
        for p in ax.patches:
            _x = p.get_x() + p.get_width() / 2
            _y = p.get_y() + p.get_height()
            value = '{:.2f}'.format(p.get_height())
            ax.text(_x, _y, value, ha="center") 

    if isinstance(axs, np.ndarray):
        for idx, ax in np.ndenumerate(axs):
            _show_on_single_plot(ax)
    else:
        _show_on_single_plot(axs)

fig, ax = plt.subplots(1, 2)
show_values_on_bars(ax)
10
Sharon Soussan

Juste au cas où si quelqu'un est intéressé par l'étiquetage graphique de la barre horizontale , j'ai modifié réponse de Sharon comme ci-dessous:

def show_values_on_bars(axs, h_v="v", space=0.4):
    def _show_on_single_plot(ax):
        if h_v == "v":
            for p in ax.patches:
                _x = p.get_x() + p.get_width() / 2
                _y = p.get_y() + p.get_height()
                value = int(p.get_height())
                ax.text(_x, _y, value, ha="center") 
        Elif h_v == "h":
            for p in ax.patches:
                _x = p.get_x() + p.get_width() + float(space)
                _y = p.get_y() + p.get_height()
                value = int(p.get_width())
                ax.text(_x, _y, value, ha="left")

    if isinstance(axs, np.ndarray):
        for idx, ax in np.ndenumerate(axs):
            _show_on_single_plot(ax)
    else:
        _show_on_single_plot(axs)

Deux paramètres expliqués:

h_v - Le barplot est horizontal ou vertical. "h" représente le barplot horizontal, "v" représente le diagramme en barres vertical.

space - L'espace entre le texte de la valeur et le bord supérieur de la barre. Ne fonctionne que pour le mode horizontal.

Exemple:

show_values_on_bars(sns_t, "h", 0.3)

enter image description here

3
Secant Zhang

J'espère que cela vous aidera pour le point 2: a) Vous pouvez trier par facture totale puis réinitialiser l'index à cette colonne b) Utilisez la palette = "Bleu" pour utiliser cette couleur afin de faire passer votre graphique du bleu clair au bleu foncé bleu clair, utilisez palette = "Blues_d")

import pandas as pd
import seaborn as sns
%matplotlib inline

df=pd.read_csv("https://raw.githubusercontent.com/wesm/pydata-book/master/ch08/tips.csv", sep=',')
groupedvalues=df.groupby('day').sum().reset_index()
groupedvalues=groupedvalues.sort_values('total_bill').reset_index()
g=sns.barplot(x='day',y='tip',data=groupedvalues, palette="Blues")
2