[PYTHON] 4 techniques de création de diagrammes pour papiers et supports de présentation avec matplotlib

9 septembre 2017 Avis de publication de «Introduction to Jupyter [Practice] for Python Users» (Ajouté le 29/08/2017)

En relation avec cela, j'ai co-écrit le livre "Jupyter [Practice] Introduction for Python Users".

Bien que non inclus dans le titre, il explique également en détail comment utiliser les pandas, Matplotlib et Bokeh. Ce qui est écrit dans cet article est également écrit d'une manière plus compréhensible. Je l'ai écrit dans le but de devenir un livre incontournable lors de l'utilisation de Jupyter, pandas, Matplotlib et Bokeh, alors jetez un œil.

"Introduction à Jupyter [Pratique] pour les utilisateurs de Python" (Takahiro Ikeuchi, Kaoruko Katayanagi, Emma Iwao, @driller, Revue technique)


Cet article est l'article du 13ème jour de Python Advent Calendar 2015 --Adventer.

introduction

Depuis que j'ai commencé l'analyse de données en Python, j'en suis venu à vouloir créer des diagrammes pour les articles et les supports de présentation en Python. Il existe divers outils de dessin, mais je suis arrivé à la conclusion que matplotlib semble être un bon graphique simple utilisé pour des imprimés tels que des papiers, et j'ai essayé différents dessins avec matplotlib. Aujourd'hui, je voudrais présenter quatre techniques que j'ai apprises à la suite d'essais et d'erreurs: 1) dessiner un graphique à barres de superposition, 2) spécifier les couleurs en détail, 3) placer la légende en dehors du cadre et 4) mettre la figure dans la toile. Je pense.

environnement

Windows7 + Anaconda(Python3.5)

Créer un jeu de données de démonstration

Cette fois, j'ai fait une démo en utilisant des valeurs numériques correctement distribuées. Utilisez le random.normal de Numpy, qui vous permet de spécifier la valeur moyenne, l'écart type et le nombre de données générées.

python


import numpy as np  #Pour la génération de données de démonstration. Cela n'a rien à voir avec le sujet principal.
import matplotlib.pyplot as plt  #Bibliothèque de traçage 2D qui est le centre du sujet d'aujourd'hui
import matplotlib.cm as cm  #Classe pour spécifier la couleur utilisée pour le graphique en détail
from IPython.display import Image  #Classe pour importer des diagrammes dans des blocs-notes

plt.rcParams['font.size'] = 14 #Définir la taille de la police

x = np.array(range(1, 25))
y1 = np.random.normal(20, 5, 24)
y2 = np.random.normal(30, 5, 24)
y3 = np.random.normal(40, 5, 24)
y4 = np.random.normal(50, 5, 24)
y5 = np.random.normal(60, 5, 24)

__Technique 1 Que faire lors de l'écriture d'un graphique à barres empilées __ Si vous dessinez simplement des valeurs numériques dans une figure l'une après l'autre avec matplotlib, la barre dessinée plus tôt sera écrasée par la barre dessinée plus tard. Par conséquent, lors du dessin de n valeurs (V1, V2, V3, ..., Vn) en couches, V1 + V2 + ... + Vn, V1 + V2 + ... + Vn-1, .. Il faut créer .. et intégrer des valeurs et dessiner dans l'ordre des plus grandes. Il existe de nombreuses façons plus cool d'écrire, mais si vous l'écrivez simplement, vous créerez un jeu de données de dessin avec le sentiment suivant.

#Créer un jeu de données pour les graphiques à barres superposés
dataset = {'dat1':(y1+y2+y3+y4+y5), 
           'dat2':(y2+y3+y4+y5), 
           'dat3':(y3+y4+y5), 
           'dat4':(y4+y5), 
           'dat5':y5}

__Technique 2 Spécification d'un jeu de couleurs fin __ Si vous n'écrivez que le rouge (r), le vert (g) et le bleu (b) de base, le graphique aura l'air un peu bâclé, utilisez donc la classe cm de matplotlib pour le rendre un peu plus à la mode. Veuillez consulter ici pour des informations détaillées sur les couleurs.

Cette fois, j'ai utilisé les couleurs extraites de plusieurs échelles de couleurs.

#Création de jeux de couleurs
colors = [cm.RdBu(0.85), cm.RdBu(0.7), cm.PiYG(0.7), cm.Spectral(0.38), cm.Spectral(0.25)]

Dessin graphique

Il est maintenant temps de commencer à dessiner. Dans cette démo, j'ai créé une fonction pour changer les conditions et l'exécuter à plusieurs reprises.

 #Créer une fonction de dessin
def plot(bbax, bbay, bap, adj, adjl, adjr):
    
    fig, ax1 = plt.subplots(1, 1, figsize=(12, 5))

    ax1.bar(x, dataset['dat1'], color=colors[0], edgecolor='w', align='center', label='Data1')
    ax1.bar(x, dataset['dat2'], color=colors[1], edgecolor='w', align='center', label='Data2')
    ax1.bar(x, dataset['dat3'], color=colors[2], edgecolor='w', align='center', label='Data3')
    ax1.bar(x, dataset['dat4'], color=colors[3], edgecolor='w', align='center', label='Data4')
    ax1.bar(x, dataset['dat5'], color=colors[4], edgecolor='w', align='center', label='Data5')
    
    #Dessin de légende(Désignation du poste)
    if bap == 999:
        ax1.legend(bbox_to_anchor=(bbax, bbay))
    else:
        ax1.legend(bbox_to_anchor=(bbax, bbay), borderaxespad=bap)

    #Réglage de la taille
    if adj != 0:
        plt.subplots_adjust(left = adjl, right = adjr)

    #Sortie de fichier
    fname = 'fig' + str(bbax) + str(bbay) + str(bap) + str(adj) + str(adjl) + str(adjr) + '.png'
    plt.savefig(fname, dpi = 300, format='png')

__Technique 3 Positionnement de la légende __ La position de la légende est Vous pouvez aussi la mettre en place, mais ici nous prenons la méthode de positionnement en spécifiant la position de l'ancre. Tout d'abord, si vous ne spécifiez pas la position, la légende apparaîtra dans le coin supérieur droit, comme illustré dans la figure ci-dessous. Fig. 1
Fig.1 Disposition de la légende par défaut

Par conséquent, l'ancre de la légende est spécifiée par bbox_to_anchor. Avec ce code,

    ax1.legend(bbox_to_anchor=(bbax, bbay))

(Dans ce code, 999 est spécifié si le pad borderaxes décrit plus tard n'est pas spécifié). Si vous spécifiez la position d'ancrage comme (0, 0), (0, 1), (1, 0), (1, 1) et dessinez, la légende sera organisée dans la relation de position suivante.

Fig. 2
  Fig.2 Schéma de principe de la disposition de la légende

En d'autres termes, il spécifie où se trouve le coin supérieur droit de la légende dans la bordure de la figure. Soit dit en passant, il y a un écart subtil entre la frontière et la légende. Cela semble être un petit écart dans les paramètres par défaut. Utilisez l'option borderaxepad pour ajuster cet écart.

Du code

borderaxespad=bap

C'est la partie de. Le réglage bap = 0 élimine les lacunes subtiles de la figure 2. Le diagramme schématique montre la relation de position suivante.

Fig. 3

Fig.3 Disposition de la légende lorsque borderaxepad = 0 est défini

Depuis que j'ai spécifié baq = 0 cette fois, le coin de la bordure et le coin de la légende se chevauchent exactement, mais vous pouvez ajuster la distance de la bordure en modifiant la valeur. L'augmentation du nombre s'éloignera de la position d'ancrage du montant spécifié.

Maintenant que vous avez saisi la relation de position entre la légende et la bordure de la figure, la figure ci-dessous montre les informations de position.

graph_anchor.png Fig.4 Informations de position du graphique

Autrement dit, la position de la bordure gauche est x = 0, la position de la bordure droite est x = 1, le bas est y = 0 et le haut est y = 1. En d'autres termes, si vous écrivez à droite à l'extérieur de la bordure, vous pouvez rendre la valeur de x supérieure à 1.

Il est maintenant temps de dessiner la légende à l'extérieur. Cette fois, j'ai mis bbox_to_anchor = (1.2, 1) pour l'amener à droite à l'extérieur.

Vous pouvez maintenant écrire la légende à l'extérieur. fig1.210000.png Fig.5 La figure avec la légende placée à l'extérieur

__Technique 4 Placement dans la toile __ Je peux comprendre la relation positionnelle, je peux parfaitement arranger la légende et je sens que je suis content de cela, mais bien sûr cela ne s'arrête pas là. Comme vous pouvez le voir sur la figure 5, la légende est coupée en deux. Si vous sortez le graphique dans un fichier, il ressemblera à ceci.

En effet, le graphique + la légende est trop grand pour le canevas sur lequel le graphique + la légende est dessiné. Pour faire simple, le bord de la toile est situé au niveau de la ligne bleue dans la figure ci-dessous.

Fig. 6 Fig.6 Schéma avec la légende placée à l'extérieur (avec bordure)

Utilisez l'option subplots_adjust pour ajuster cela. La partie suivante du code.

 plt.subplots_adjust(left = adjl, right = adjr)

Cette fois, subplots_adjust``` est appliqué lorsque adj est différent de zéro.

subplots_adjust``` est également défini sur la base des informations de position de la figure 4. En d'autres termes, spécifiez où placer les bordures gauche et droite de la figure sur le canevas. Comme pour la figure, le canevas a zéro sur le bord gauche et 1 sur le bord droit. Si subplot_adust = (0, 1) '' ``, le bord gauche sera à la position zéro sur le canevas et le bord droit sera à la position 1. Dans la figure, le bord gauche est toujours à gauche du bord droit, de sorte que la valeur du bord gauche ne peut pas être supérieure à la valeur du bord droit.

Alors, définissez la figure précédente pour qu'elle tienne sur la toile. Cette fois, j'ai mis subplots_adjust = (0.1, 0.8) ''. Le résultat de sortie est le suivant.

Fig. 7 Fig.7 Subplots_adjusted figure (avec bordure)

Cela va bien.

en conclusion

Comment se sont déroulées les 4 techniques de création de diagrammes pour articles et supports de présentation avec matplotlib? Le bloc-notes Jupyter que j'ai créé pour cet article sera téléchargé sur GitHub plus tard, donc si vous êtes intéressé, jetez-y également un œil.

2015/12/13 22:18 Le bloc-notes Jupyter a été téléchargé sur GitHub. https://github.com/nobolis/pydata_workbook/blob/master/matplotlib_tips/matplotlib_tips.ipynb

Recommended Posts

4 techniques de création de diagrammes pour papiers et supports de présentation avec matplotlib
Tracez des graphiques en noir et blanc adaptés aux papiers avec matplotlib ou pylab
Premiers pas avec le dessin avec matplotlib: création de diagrammes à partir de fichiers de données
Commandes lors de la création de SNS avec Django
Explication de la création d'une application pour afficher des images et dessiner avec Python
Paramètres japonais pour les axes matplotlib et Seaborn
sélénium: attendre l'élément avec ET / OU
Carte thermique pour la recherche de grille avec Matplotlib
[matplotlib] Fonction d'exemple de création de graphique pour les articles scientifiques
Graphiques de fonctions triangulaires avec numpy et matplotlib
Mémo d'apprentissage Python pour l'apprentissage automatique par Chainer Chapitres 11 et 12 Introduction à Pandas Matplotlib