Créez un graphique empilé ** qui correspond aux directions positive et négative comme indiqué ci-dessous.
Créé et confirmé pour fonctionner avec Google Colab.
python version 3.6.9
numpy version 1.18.5
pandas version 1.1.2
matplotlib version 3.2.2
Permet au japonais d'être utilisé dans les graphiques matplotlib.
python
!pip install japanize_matplotlib
Chargez la bibliothèque.
python
%reset -f
import sys
import pandas as pd
import numpy as np
import japanize_matplotlib
import matplotlib
import matplotlib.pyplot as plt
import matplotlib.patheffects as pe
pv = '.'.join([ str(v) for v in sys.version_info[:3] ])
print(f'python version {pv}')
print(f'numpy version {np.__version__}')
print(f'pandas version {pd.__version__}')
print(f'matplotlib version {matplotlib.__version__}')
Préparez des exemples de données.
python
df = pd.DataFrame()
df['Classification']=['Élèves du collège','Lycéen','Étudiant du Collège']
df['Se mettre d'accord']=[10,20,30]
df['Si quelque chose, je suis d'accord']=[45,50,45]
df['Si quelque chose d'en face']=[30,20,20]
df['Opposition']=[15,10,5]
display(df)
Pour ces données, «d'accord» et «plutôt d'accord» sont empilés sur le côté gauche, et «plutôt pas d'accord» et «pas d'accord» sont empilés sur le côté droit.
python
def draw(df, y_column,x_columns,colors,x_range):
left_columns ,right_columns = x_columns
left_colors,right_colors = colors
#Créer un graphique 1 par 2
fig,ax = plt.subplots(nrows=1, ncols=2, figsize=(6,3), facecolor='white',sharey='row',dpi=150)
#Effacer la bordure
for a in ax:
for x in ['top','bottom','left','right']:
a.spines[x].set_visible(False)
a.tick_params(axis='y',left=False)
#Graphique à gauche
acc = np.zeros(len(df))
for colum,color in reversed(list(zip(left_columns ,left_colors))):
s = df[colum]
ax[0].barh(df[y_column],s,left=acc,color=color,label=colum)
for i in range(len(df)):
t = ax[0].text(acc[i]+s[i]/2,i,f'{s[i]}%', ha='center',va='center')
t.set_path_effects([pe.Stroke(linewidth=3, foreground='white'), pe.Normal()])
acc+=s
#Graphique à droite
acc = np.zeros(len(df))
for colum,color in zip(right_columns,right_colors):
s = df[colum]
ax[1].barh(df[y_column],s,left=acc,color=color,label=colum)
for i in range(len(df)):
t = ax[1].text(acc[i]+s[i]/2,i,f'{s[i]}%', ha='center',va='center')
t.set_path_effects([pe.Stroke(linewidth=3, foreground='white'), pe.Normal()])
acc+=s
#Guide d'utilisation
ha,la = ax[0].get_legend_handles_labels()
ax[0].legend(reversed(ha),reversed(la),bbox_to_anchor=(0.95, 1.05), loc='lower right',ncol=len(left_columns), borderaxespad=0,frameon=False)
ax[1].legend(bbox_to_anchor=(0.05, 1.05), loc='lower left',ncol=len(right_columns), borderaxespad=0,frameon=False)
#Tracez une ligne au centre
ax[1].axvline(x=0,ymin=0,ymax=1,clip_on=False,color='black',lw=1)
ax[0].set_xlim(x_range[0],0) #Le graphique de gauche fait basculer l'axe X
ax[1].set_xlim(0,x_range[1])
fig.subplots_adjust(wspace=0.0) #Définissez la distance entre les graphiques gauche et droit sur zéro
plt.savefig('test.png')
plt.show()
#Créer un graphique avec des exemples de données
draw(df,'Classification',
[['Se mettre d'accord','どちらかと言えばSe mettre d'accord'],['Si quelque chose d'en face','Opposition']],
[['tab:blue','tab:cyan'],['tab:pink','tab:red']],[80,80])