Erstellen Sie ein gestapeltes Diagramm **, das sowohl der positiven als auch der negativen Richtung entspricht (siehe unten).
Erstellt und bestätigt für die Arbeit mit Google Colab.
python version 3.6.9
numpy version 1.18.5
pandas version 1.1.2
matplotlib version 3.2.2
Ermöglicht die Verwendung von Japanisch in Matplotlib-Diagrammen.
python
!pip install japanize_matplotlib
Laden Sie die Bibliothek.
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__}')
Bereiten Sie Beispieldaten vor.
python
df = pd.DataFrame()
df['Einstufung']=['Mittelschüler','Schüler','Student']
df['Zustimmen']=[10,20,30]
df['Wenn überhaupt, stimme ich zu']=[45,50,45]
df['Wenn überhaupt etwas Gegenteiliges']=[30,20,20]
df['Opposition']=[15,10,5]
display(df)
Für diese Daten sind auf der linken Seite "zustimmen" und "etwas zustimmen" und auf der rechten Seite "etwas nicht zustimmen" und "nicht zustimmen" gestapelt.
python
def draw(df, y_column,x_columns,colors,x_range):
left_columns ,right_columns = x_columns
left_colors,right_colors = colors
#Erstellen Sie ein 1-mal-2-Diagramm
fig,ax = plt.subplots(nrows=1, ncols=2, figsize=(6,3), facecolor='white',sharey='row',dpi=150)
#Löschen Sie den Rand
for a in ax:
for x in ['top','bottom','left','right']:
a.spines[x].set_visible(False)
a.tick_params(axis='y',left=False)
#Grafik links
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
#Grafik rechts
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
#Gebrauchsanweisung
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)
#Zeichnen Sie eine Linie in der Mitte
ax[1].axvline(x=0,ymin=0,ymax=1,clip_on=False,color='black',lw=1)
ax[0].set_xlim(x_range[0],0) #Das Diagramm links kippt die X-Achse
ax[1].set_xlim(0,x_range[1])
fig.subplots_adjust(wspace=0.0) #Setzen Sie den Abstand zwischen dem linken und dem rechten Diagramm auf Null
plt.savefig('test.png')
plt.show()
#Erstellen Sie ein Diagramm mit Beispieldaten
draw(df,'Einstufung',
[['Zustimmen','どちらかと言えばZustimmen'],['Wenn überhaupt etwas Gegenteiliges','Opposition']],
[['tab:blue','tab:cyan'],['tab:pink','tab:red']],[80,80])
Recommended Posts