Schreiben wir ein "Kreisdiagramm" von Menschen, die von allen in Python gehasst werden. Schreiben Sie außerdem ein "Doppelkreisdiagramm" (double pie_chart) mit Geschlecht im inneren Kreisdiagramm und Generierung im äußeren Kreisdiagramm. So ↓ Wie üblich sind die Argumente von matplotlib verwirrend, daher werde ich sie als Notiz hinterlassen.
Angenommen, Sie haben diese Art von JSON-Daten
Eingabedaten
data={
"cluster": 1,
"member_cnt": 21343,
"generation": {"11-15": 284, "81-85": 216, "0-5": 10,
"76-80": 486, "16-20": 840, "56-60": 1938,
"unknown": 558, "61-65": 1561, "86-90": 51,
"51-55": 2504, "46-50": 2639, "6-10": 18,
"31-35": 1501, "41-45": 2410, "36-40": 1954,
"66-70": 1486, "91 over": 23, "26-30": 989,
"21-25": 976, "71-75": 899},
"gender": {"M": 11652, "F": 9691}
}
--cluster: Clusternummer (in diesem Fall 1) --member_cnt: Anzahl der Personen im gesamten Cluster --generation: Die Altersgruppe und die Anzahl der dazugehörigen Personen werden im Wörterbuchtyp gespeichert (addiert zur Anzahl der Mitglieder). --gender: Geschlecht und jede Anzahl von Personen werden im Wörterbuchtyp gespeichert (addiert zur Anzahl der Mitglieder)
Als Zeichnungsfluss
Laden und Initialisieren des Moduls
# -*- coding: utf-8 -*-
#Für Jupyter Notebook
from IPython.display import display, HTML
%matplotlib inline
# pie_Für Diagramm
import numpy as np
import matplotlib.pyplot as plt
#Geben Sie die Farben an, die später verwendet werden sollen (geben Sie die gewünschte Farbe an).
c_cycle=("#3498db","#51a62d","#1abc9c","#9b59b6","#f1c40f",
"#7f8c8d","#34495e","#446cb3","#d24d57","#27ae60",
"#663399","#f7ca18","#bdc3c7","#2c3e50","#d35400",
"#9b59b6","#ecf0f1","#ecef57","#9a9a00","#8a6b0e")
Skriptkörper
cluster_num = data['cluster']
member_cnt = data['member_cnt']
'''''''''''''''''''''''''''''''''
Erstellen Sie ein Diagramm für den äußeren Kreis zur Generierung
'''''''''''''''''''''''''''''''''
generation_labels = list()
generation_values = list()
for gen_cat,cnt in sorted(data['generation'].items(),reverse=True,key=lambda x:x[1]): #Anzahl der Mitglieder(cnt)Geben Sie die absteigende Reihenfolge von ein(gen_cat)Sortieren
generation_labels.append(gen_cat)
generation_values.append(cnt)
plt.figure(figsize=(10,8)) #Bereiten Sie ein Fenster geeigneter Größe vor
x = np.array(generation_values) #Setzen Sie den Wert zum Zeichnen eines Kreisdiagramms auf np.Dem Array-Typ zuweisen
plt.pie(x,
labels=generation_labels, #Geben Sie die Beschriftung des Kreisdiagramms an
colors=c_cycle, #Geben Sie die Farbe des Kreisdiagramms an (die zuvor oben festgelegte).
wedgeprops={'linewidth': 2,'edgecolor':"white"}, #Fügen Sie dem Kreisdiagramm einen weißen Rand mit einer Dicke von 2 hinzu
textprops={'color': "white", 'weight': "bold"}, #Textfarbe und -stärke
pctdistance=0.85, #85 zwischen dem Zentrum und dem Umfang basierend auf dem Wert des Zusammensetzungsverhältnisses%Ausgabe an die Position von (Feineinstellung der Position der Textanzeige)
startangle=90, #Drehen Sie die Richtung des Kreises um 90 Grad
counterclock=False, #Mit false gegen den Uhrzeigersinn ausgeben
autopct=lambda p: '{:.1f}%'.format(p) if p >= 2.5 else '' #2.5%Die folgenden Komponenten verbergen numerische Werte (später beschrieben)
)
plt.axis('equal') #Erforderlich, um ein kreisförmiges Diagramm ohne Verzerrung auszugeben. Wenn dies nicht angegeben ist, ist es oval
'''''''''''''''''''''''''''''
Erstellen Sie ein inneres Kreisdiagramm für das Geschlecht
'''''''''''''''''''''''''''''
gender_labels = list()
gender_values = list()
for gender,cnt in data['gender'].items():
gender_labels.append(gender)
gender_values.append(cnt)
y = np.array(gender_values)
plt.pie(y,
labels=gender_labels,
colors=("#00a2ad","#ffcccc"), # Male,Farbzuordnung für weiblich
wedgeprops={'linewidth': 2,'edgecolor':"white"}, #Fügen Sie einen weißen Rand mit einer Dicke von 2 hinzu
textprops={'color': "#2c3e50", 'weight': "bold"}, #Textfarbe und -stärke
radius=0.7, #70%Zeichnen Sie einen Kreis von der Größe von. Da das Geschlecht ein innerer Kreisgraph ist, wird es etwas kleiner ausgegeben.
labeldistance=0.8, #Die Anzeigeposition des Etiketts beträgt 80 vom Umfang%Anzeige an der Position von
autopct="%1.1f%%", #Geben Sie das Kompositionsverhältnis mit einer Ziffer nach dem Dezimalpunkt aus
pctdistance=0.6, #60 zwischen dem Zentrum und dem Umfang des Zusammensetzungsverhältnisses%Ausgabe an die Position von
startangle=90, #Drehen Sie die Richtung des Kreises um 90 Grad
counterclock=False #Mit false gegen den Uhrzeigersinn ausgeben
)
plt.axis('equal') #Korrigieren Sie das Seitenverhältnis. Erforderlich, um ein kreisförmiges Diagramm ohne Verzerrung auszugeben
'''''''''''''''''''''''''''''
Zeichnen Sie ein weißes Kreisdiagramm auf der innersten Seite (lassen Sie es wie ein Donutkreisdiagramm aussehen).
'''''''''''''''''''''''''''''
center_circle = plt.Circle((0,0),0.4,color='white', fc='white',linewidth=1.25) #Center(0,0)Bis 40%Zeichnen Sie einen Kreis mit der Größe von
fig = plt.gcf()
fig.gca().add_artist(center_circle)
# generation+Anzeige der Legende des Geschlechts
lgnd=plt.legend(bbox_to_anchor=(1.0, 0.25, 1.55, 0.5), loc="center left", borderaxespad=0.)
#Anzeige des Titels der Figur
plt.suptitle('cluster#%s (UU=%s)' % (cluster_num,member_cnt),fontsize=25)
#Speichern eines Kreisdiagramms
# bbox~~Wenn es keinen solchen Parameter gibt, ragt die Legende aus dem gespeicherten Bild heraus.
#plt.savefig('./hoge/pie_chart_#{}.png'.format(cluster_num),bbox_exstra_artists=(lgnd),bbox_inches='tight')
plt.show()
** Mach die Farbe modisch **
plt.pie
scheint unangenehm zu sein, also hier, hier und [hier]( Ich fand eine schöne Farbe unter Bezugnahme auf http://colorpalettes.net/) und stellte sie als "c_cycle" ein** Kurz gesagt, fügen Sie den Wert, den Sie erstellen möchten, in ein Kreisdiagramm in np.array und die Beschriftung in den Listentyp ein **
generation_labels.append (gen_cat)
--Für Werte entspricht es der Stelle, an der es einmal im Listentyp mit "generation_values.append (cnt)" gespeichert und dann mit "x = np.array (generation_values)" in den Array-Typ konvertiert wurde** Es scheint, dass die Kuchenfunktion von matplotlib.pyplot Daten automatisch in Prozentwerte konvertiert **
** Verstecke Elemente mit einem kleinen Anteil, um das Aussehen zu verbessern **
Für andere plt.pie-Parameter können Sie dies verstehen, indem Sie den Kommentar im Code auslesen oder den relevanten Teil tatsächlich auskommentieren und sehen, wie sich die Beschreibung ändert.
Wenn ich ein Kreisdiagramm der "Generation" schreibe und "Weiß" von "Textprops = {'Farbe':" Weiß "," Gewicht ":" Fett "}" in "Schwarz" geändert wird, sieht es tatsächlich so aus. Masu ↓
Ich möchte diese überlappende Beschriftung gut anzeigen oder löschen, aber da es sich nur um Zeichenkettendaten handelt, kann sie unter Bedingungen wie "2,5% oder weniger ausblenden" oben ("nicht ausgeblendet werden). Ich konnte keinen guten Weg finden. Wenn jemand einen guten Weg dazu kennt, lass es mich wissen ... Daher wird dieser Teil vorerst in weiße Buchstaben umgewandelt und im Hintergrund geschmolzen, um zu betrügen.
Recommended Posts