Ecrire un graphique à secteurs en Python

É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.

pie_chart_#1.png

Données pour créer un graphique circulaire

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)

Terrain

Comme un flux de dessin

  1. Créer un graphique circulaire extérieur (génération)
  2. Créer un graphique de cercle intérieur (génération)
  3. Créez un cercle blanc du côté le plus interne C'est comme ça.

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()

La description

** Rendre la couleur à la mode **

** 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 **

** Cacher les éléments avec une petite proportion pour améliorer l'apparence **

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.

Un peu sournois

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 ↓

pie_chart2_#1.png

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.

référence

Recommended Posts

Ecrire un graphique à secteurs en Python
Ecrire une dichotomie en Python
Ecrire des algorithmes A * (A-star) en Python
Ecrire le plugin vim en Python
Écrire une recherche de priorité en profondeur en Python
Ecrire le test dans la docstring python
Ecrire une courte définition de propriété en Python
Ecrire un programme de chiffrement Caesar en Python
Ecrire une méthode de cupidité simple en Python
Ecrire un plugin Vim simple en Python 3
Dessinez un joli graphique circulaire avec matplotlib
Ecrire Python dans MySQL
Prendre une capture d'écran en Python
Ecrire des filtres Pandec en Python
Créer une fonction en Python
Créer un dictionnaire en Python
Écrire une distribution bêta en Python
Ecrire python dans Rstudio (réticulé)
Créer un bookmarklet en Python
course de graphique à barres en python
Dessinez un cœur en Python
Ecrire un programme de dynamique moléculaire super simple en python
Je veux écrire en Python! (2) Écrivons un test
Ecrire un histogramme à l'échelle logarithmique sur l'axe des x en python
Probablement dans un serpent Nishiki (Titre original: Peut-être en Python)
Ecrire un test piloté par table en C
[python] Gérer les fonctions dans une liste
Appuyez sur une commande en Python (Windows)
Ecrire un schéma JSON avec Python DSL
Ecrire un serveur HTTP / 2 en Python
Dessinez une matrice de diagramme de dispersion avec python
ABC166 en Python A ~ C problème
Créer un fichier binaire en Python
Ecrire le code de test du sélénium en python
Résoudre ABC036 A ~ C avec Python
Implémentation d'un algorithme simple en Python 2
Résoudre ABC037 A ~ C avec Python
Exécutez un algorithme simple en Python
Dessinez un diagramme CNN en Python
Créer une chaîne aléatoire en Python
Ecrire un test unitaire de langage C en Python
Ecrire un script batch avec Python3.5 ~
Lors de l'écriture d'un programme en Python
Écrire de la documentation dans Sphinx avec Python Livereload
Générer une collection de première classe en Python
Livre en spirale en Python! Python avec un livre en spirale! (Chapitre 14 ~)
Résoudre ABC175 A, B, C avec Python
Utiliser l'impression dans l'expression lambda Python2
Un client HTTP simple implémenté en Python
Faites une visite Euler non récursive en Python
J'ai fait un programme de gestion de la paie en Python!
Précautions lors du décapage d'une fonction en python
Afficher une liste d'alphabets en Python 3
Essayez d'envoyer un paquet SYN en Python
Essayez de dessiner une animation simple en Python
Créer une application GUI simple en Python
Dessiner un cœur avec Python Partie 2 (SymPy Edition)