2 votes

Changer la couleur du diagramme circulaire selon l'étiquette de la section (pandas/matplotlib)

Je travaille à partir d'un DataFrame appelé plot_df qui ressemble à ceci:

plot_df

                Country Visual Format                          $
0                 France       DEFAULT                    4.378900e+03
1                 France     DIGITAL3D                    1.170000e+02
2                 France        IMAX3D                    0.000000e+00
3              Hong Kong       DIGITAL                    1.061189e+07
4              Hong Kong     DIGITAL3D                    1.881850e+05
5                  India          DBOX                    1.137234e+06
6                  India       DIGIMAX                    2.653723e+06
7                  India       DIGITAL                    3.283665e+07
8                  Japan       DEFAULT                    5.819080e+07
9                  Japan       DIGIMAX                    8.193800e+06
10                Kuwait       DEFAULT                    6.130250e+04
11                Kuwait     DIGITAL3D                    1.099000e+03
12                Kuwait        IMAX3D                    1.057550e+04
13                Kuwait         MXP3D                    8.736000e+03
14              Malaysia       DIGIMAX                    2.941200e+04
15              Malaysia       DIGITAL                    2.590491e+06
16              Malaysia         MXP2D                    9.478000e+03
17                Mexico          4D3D                    3.806130e+06
18                Mexico     DIGIMAX3D                    0.000000e+00
19                Mexico       DIGITAL                    3.631979e+07
20                Mexico     DIGITAL3D                    7.510887e+06
21      Netherlands, The          4D3D                    4.435451e+04
22      Netherlands, The     DIGIMAX3D                    7.488704e+04
23      Netherlands, The       DIGITAL                    3.350028e+04
24      Netherlands, The     DIGITAL3D                    2.521642e+05
25      Netherlands, The         MXP3D                    3.298899e+04
26                  Peru       DIGITAL                    1.707998e+06
27                  Peru     DIGITAL3D                    1.030680e+05
28                  Peru         MXP2D                    3.961500e+04
29                  Peru         MXP3D                    4.077950e+04
30                  Peru           PLF                    1.310630e+05
31                 Spain     DIGIMAX3D                    7.717070e+03
32                 Spain       DIGITAL                    5.198949e+05
33                 Spain     DIGITAL3D                    2.494451e+04
34                 Spain         MXP3D                    1.025880e+04
35              Thailand       DIGITAL                    3.217920e+05
36                Turkey          4D3D                    5.433525e+04
37                Turkey       DIGITAL                    2.693310e+05
38                Turkey     DIGITAL3D                    6.161560e+05
39                Turkey         MXP3D                    4.168149e+04
40          UK & Ireland       DEFAULT                    1.170058e+06
41          UK & Ireland     DIGITAL3D                    1.755717e+05
42          UK & Ireland        IMAX3D                    1.065599e+05
43  United Arab Emirates       DEFAULT                    4.317666e+06
44  United Arab Emirates     DIGITAL3D                    2.808751e+04
45  United Arab Emirates        IMAX3D                    6.832500e+04

Je tente de créer _ nombre de sous-graphiques en camembert. Voici mon code jusqu'à présent:

fig, axes = plt.subplots(nrows=int(np.ceil(plot_df.index.get_level_values(0).nunique()/3)), 
                         ncols=3, 
                         figsize=(15,15))
fig.tight_layout()
axes_list = [item for sublist in axes for item in sublist] 

for country in plot_df.index.get_level_values(0).unique():
    ax = axes_list.pop(0)
    plot_df.loc[(country, slice(None))].plot(kind='pie', 
                                             subplots=True,
                                             legend=False, 
                                             autopct='%1.1f%%',
                                             ax=ax)
    ax.set_title(country, fontweight='bold')
    ax.tick_params(
        bottom=False
    )
    ax.set_ylabel(ylabel=None)

for ax in axes_list:
    ax.remove()

Mon résultat final ressemblera à quelque chose comme ceci:

end result

Ma question concerne les couleurs assignées à chaque format visuel. Chaque pays a un ensemble différent de formats, ce qui conduit à une assignation de couleurs incohérente aux étiquettes. (Par exemple, DIGITAL est BLEU à Hong Kong mais est VERT en Inde).

Y a-t-il un moyen de créer un dictionnaire, avec les formats visuels comme clés et les couleurs comme valeurs, et d'assigner ce dictionnaire au paramètre color du tracé de pandas? Merci.

1voto

busybear Points 3845

Vous pouvez utiliser le paramètre couleurs pour les graphiques circulaires. Comme cela prend un tableau, vous devrez créer un tableau qui correspond à vos données d'entrée pour chaque tracé.

cdict = {'DIGITAL': 'r', 'DIGIMAX3D': 'y', 'DIGITAL3D': 'b', ...}

for pays in plot_df.index.get_level_values(0).unique():
    ax = axes_list.pop(0)
    df = plot_df.loc[(pays, slice(None))]
    couleurs = [cdict[x] for x in df.index]  % couleurs basées sur l'index des données d'entrée
    df.plot(kind='pie', colors=couleurs, subplots=True, legend=False, autopct='%1.1f%%', ax=ax)

0voto

Quang Hoang Points 191

Une autre chose que vous pourriez faire est de remodeler les données et de les tracer avec pandas :

(df['$'].unstack(0,fill_value=0)
 .plot.pie(subplots=True, layout=(4,4), figsize=(12,12))
);

Sortie :

enter image description here

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