Écrivons un «graphique circulaire» de personnes détestées par tout le monde en Python. De plus, écrivez un "graphique à double cercle" (double pie_chart) avec le sexe sur le graphique du cercle intérieur et la génération sur le graphique du cercle extérieur. Comme ça ↓ Comme d'habitude, les arguments de matplotlib sont déroutants, je vais donc les laisser sous forme de note.
Par exemple, supposons que vous ayez ce type de données JSON
Des données d'entrée
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: numéro de cluster (1 dans ce cas) --member_cnt: nombre de personnes dans tout le cluster --generation: la tranche d'âge et le nombre de personnes qui y appartiennent sont stockées dans le type dictionnaire (additionné au nombre de membres) --gender: le sexe et chaque nombre de personnes sont stockés dans le type de dictionnaire (ajouté au nombre de membres)
Comme un flux de dessin
Chargement et initialisation du module
# -*- coding: utf-8 -*-
#Pour notebook jupyter
from IPython.display import display, HTML
%matplotlib inline
# pie_Pour le graphique
import numpy as np
import matplotlib.pyplot as plt
#Spécifiez les couleurs à utiliser plus tard (spécifiez la couleur que vous aimez)
c_cycle=("#3498db","#51a62d","#1abc9c","#9b59b6","#f1c40f",
"#7f8c8d","#34495e","#446cb3","#d24d57","#27ae60",
"#663399","#f7ca18","#bdc3c7","#2c3e50","#d35400",
"#9b59b6","#ecf0f1","#ecef57","#9a9a00","#8a6b0e")
Corps du script
cluster_num = data['cluster']
member_cnt = data['member_cnt']
'''''''''''''''''''''''''''''''''
Créer un graphique circulaire extérieur pour la génération
'''''''''''''''''''''''''''''''''
generation_labels = list()
generation_values = list()
for gen_cat,cnt in sorted(data['generation'].items(),reverse=True,key=lambda x:x[1]): #Nombre de membres(cnt)Clé dans l'ordre décroissant de(gen_cat)Trier
generation_labels.append(gen_cat)
generation_values.append(cnt)
plt.figure(figsize=(10,8)) #Préparez une fenêtre de taille appropriée
x = np.array(generation_values) #Définissez la valeur sur np pour dessiner un graphique circulaire.Attribuer au type de tableau
plt.pie(x,
labels=generation_labels, #Spécifiez le libellé du graphique circulaire
colors=c_cycle, #Spécifiez la couleur du graphique circulaire (celle définie précédemment ci-dessus)
wedgeprops={'linewidth': 2,'edgecolor':"white"}, #Ajoutez une bordure blanche au graphique circulaire d'une épaisseur de 2
textprops={'color': "white", 'weight': "bold"}, #Couleur et épaisseur du texte
pctdistance=0.85, #85 entre le centre et la circonférence en fonction de la valeur du rapport de composition%Sortie à la position de (réglage fin de la position d'affichage du texte)
startangle=90, #Faire pivoter la direction du cercle de 90 degrés
counterclock=False, #Sortie dans le sens antihoraire avec faux
autopct=lambda p: '{:.1f}%'.format(p) if p >= 2.5 else '' #2.5%Les composants suivants masquent les valeurs numériques (décrites plus loin)
)
plt.axis('equal') #Requis pour produire un graphique circulaire sans distorsion. Si ce n'est pas spécifié, ce sera ovale
'''''''''''''''''''''''''''''
Créer un graphique de cercle intérieur pour le sexe
'''''''''''''''''''''''''''''
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,Attribution de couleur pour femme
wedgeprops={'linewidth': 2,'edgecolor':"white"}, #Ajouter une bordure blanche d'une épaisseur de 2
textprops={'color': "#2c3e50", 'weight': "bold"}, #Couleur et épaisseur du texte
radius=0.7, #70%Tracez un cercle de la taille de. Puisque le sexe est un graphique de cercle intérieur, il est un peu plus petit.
labeldistance=0.8, #La position d'affichage de l'étiquette est de 80 à partir de la circonférence%Affichage à la position de
autopct="%1.1f%%", #Sortie du rapport de composition avec un chiffre après la virgule décimale
pctdistance=0.6, #60 entre le centre et la circonférence du rapport de composition%Sortie à la position de
startangle=90, #Faire pivoter la direction du cercle de 90 degrés
counterclock=False #Sortie dans le sens antihoraire avec faux
)
plt.axis('equal') #Corrigez le rapport hauteur / largeur. Nécessaire pour produire un graphique circulaire sans distorsion
'''''''''''''''''''''''''''''
Dessinez un graphique circulaire blanc sur le côté le plus à l'intérieur (faites-le ressembler à un graphique circulaire en anneau)
'''''''''''''''''''''''''''''
center_circle = plt.Circle((0,0),0.4,color='white', fc='white',linewidth=1.25) #centre(0,0)À 40%Tracez un cercle de la taille de
fig = plt.gcf()
fig.gca().add_artist(center_circle)
# generation+Afficher la légende du genre
lgnd=plt.legend(bbox_to_anchor=(1.0, 0.25, 1.55, 0.5), loc="center left", borderaxespad=0.)
#Afficher le titre de la figure
plt.suptitle('cluster#%s (UU=%s)' % (cluster_num,member_cnt),fontsize=25)
#Enregistrer un graphique circulaire
# bbox~~S'il n'y a pas de tel paramètre, la légende dépassera de l'image enregistrée.
#plt.savefig('./hoge/pie_chart_#{}.png'.format(cluster_num),bbox_exstra_artists=(lgnd),bbox_inches='tight')
plt.show()
** Rendre la couleur à la mode **
plt.pie
semble gênante, donc ici, ici et [ici]( J'ai trouvé une belle couleur en me référant à http://colorpalettes.net/) et l'ai définie comme c_cycle
** En bref, mettez la valeur que vous voulez faire dans un graphe circulaire dans np.array et l'étiquette dans le type liste **
--Par exemple, dans le cas d'un graphe circulaire "génération"
--Pour les étiquettes, stockez-le dans un type de liste avec generation_labels.append (gen_cat)
--Pour la valeur, cela correspond à l'endroit où elle est une fois stockée dans le type de liste avec generation_values.append (cnt)
puis convertie en type de tableau avec x = np.array (generation_values)
.
** Il semble que la fonction camembert de matplotlib.pyplot convertit automatiquement les données en valeurs de pourcentage **
data
dans le type tableau (sans traitement pour calculer le rapport) et la passez comme argument de plt.pie, elle sera décrite comme une valeur de rapport. Il semble
――Ensuite, que se passe-t-il si vous souhaitez dessiner un graphique circulaire avec la valeur d'entrée telle quelle sans en faire un rapport? → Je suis désolé, je ne l'ai pas examiné. .. ..** Cacher les éléments avec une petite proportion pour améliorer l'apparence **
\ # 2,5% correspondent au traitement de la pièce où la valeur numérique est cachée
.
――Le texte de la valeur se chevauche autour de l'élément avec un petit rapport et il semble mauvais.
―― J'ai essayé d'afficher le texte pour qu'il ne se chevauche pas, mais je n'ai pas trouvé de bonne méthode, donc je cache l'élément avec un rapport plus petit (ici, il est correctement réglé à 2,5% ou moins)Pour les autres paramètres plt.pie, vous pouvez le comprendre en lisant le commentaire dans le code ou en commentant la partie pertinente et en voyant comment la description change.
Quand j'écris un graphe circulaire de "génération", si je change "blanc" de textprops = {'color':" white ", 'weight':" bold "}
en "noir", cela ressemble en fait à ceci. Masu ↓
J'aimerais bien afficher ou supprimer cette étiquette qui se chevauche, mais comme il ne s'agit que de données de chaîne de caractères, elle ne peut pas être masquée avec des conditions telles que "Masquer 2,5% ou moins" ci-dessus (" Je n'ai pas trouvé de bon moyen). Si quelqu'un connaît un bon moyen de le faire, faites-le moi savoir ... Donc, pour le moment, cette partie est transformée en lettres blanches et fondue en arrière-plan pour tricher.
Recommended Posts