2 votes

100% Diagrammes à barres empilés et groupés utilisant matplotlib

Désolé si cette question fait double emploi car je n'ai pas trouvé de solution.

J'ai un cadre de données :

| sample_ids | perc_A | perc_B | perc_C |
|------------|--------|--------|--------|
| sample 1   | 0.75   | 0.18182| 0.42222|
| sample 2   | 0.66667| 0.24747| 0.15823|
| sample 3   | 0.70213| 0.28176| 0.17925|

J'aimerais ainsi tracer un diagramme à barres empilé et groupé à 100 % (comme illustré ci-dessous ; une image similaire est tirée de GitHub). enter image description here


Explication détaillée sur la base de la figure fournie :
Supposons que l'échantillon 1 soit Apples Ainsi, pour la barre A, 75 % seront en violet foncé (légende : True_perc_a) tandis que 25 % seront en violet clair (légende : False_perc_a) ; pour la barre B, 18,19 % seront en vert foncé (légende : True_perc_b) tandis que 81,81 % seront en vert clair (légende : False_perc_b) ; pour la barre C, 42,22 % seront en jaune foncé (légende : True_perc_c) tandis que 57,78 % seront en jaune clair (légende : False_perc_c). Les mêmes conditions s'appliquent à l'échantillon 2 et à l'échantillon 3.

J'ai pu traiter les données pour obtenir les percées vraies et fausses. Par exemple, j'ai pu traiter les données pour obtenir le vrai et le faux perc :

df['perc_A'] = (df['perc_A']*100).round(2)
df['perc_F_A'] = (100 - df['perc_A']).round(2)

Cependant, j'ai quelques difficultés à tracer la figure.

1voto

Michael S. Points 652

Comme nous savons que le pourcentage total sera de 100 %, nous pouvons simplement fixer la valeur "False" à 1. Ensuite, nous pouvons faire fondre le cadre de données dans la fenêtre sample_ids renommez les colonnes et multipliez le tout par 100 (pour obtenir des pourcentages). A partir de là, nous allons saisir les "faux" pourcentages en choisissant les valeurs dans la colonne percs qui contient une colonne F puis de la représenter graphiquement avec Seaborn afin de pouvoir régler la teinte sur la valeur perc nom. Réglez la palette sur les couleurs de votre choix, puis réglez l'alpha sur 0,5 afin de rendre la différence entre les vrais et les faux pourcentages plus apparente. Représentez ensuite les vrais pourcentages dans le graphique (en les plaçant devant les barres de faux pourcentages) et vous obtiendrez votre diagramme à barres empilées :

import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
plt.rcParams["figure.figsize"] = (20,10)

df = pd.DataFrame({'sample_ids':['sample1', 'sample2', 'sample3'], 
                   'perc_A':[0.75,0.66667,0.70213],
                   'perc_B':[0.18182,0.24747,0.28176],
                   'perc_C':[0.4222,0.15823,0.17925]})

df[['perc_F_A', 'perc_F_B', 'perc_F_C']] = 1

meltedDF = df.melt(id_vars=['sample_ids'], var_name='perc', value_name='percent')
meltedDF['percent']=meltedDF['percent']*100

sns.barplot(data=meltedDF[meltedDF.perc.str.contains('F')], x='sample_ids', y='percent', hue='perc', palette=['blue','green','red'], alpha=0.5)
sns.barplot(data=meltedDF[~meltedDF.perc.str.contains('F')], x='sample_ids', y='percent', hue='perc', palette=['blue','green','red'])
plt.show()

Graphique :

enter image description here

Soit dit en passant, une meilleure façon de générer vos "faux" pourcentages si vous souhaitez obtenir leur valeur réelle serait de procéder comme suit :

df = pd.DataFrame({'sample_ids':['sample1', 'sample2', 'sample3'], 
                   'perc_A':[0.75,0.66667,0.70213],
                   'perc_B':[0.18182,0.24747,0.28176],
                   'perc_C':[0.4222,0.15823,0.17925]})

df[['perc_F_A', 'perc_F_B', 'perc_F_C']] = df.groupby('sample_ids').apply(lambda x: 1-x)

Sortie :

   sample_ids   perc_A   perc_B     perc_C   perc_F_A   perc_F_B    perc_F_C
0   sample1     0.75000  0.18182    0.42220  0.25000    0.81818  0.57780
1   sample2     0.66667  0.24747    0.15823  0.33333    0.75253  0.84177
2   sample3     0.70213  0.28176    0.17925  0.29787    0.71824  0.82075

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X