[PYTHON] Je veux créer un graphique avec des lignes ondulées au milieu avec matplotlib (je veux manipuler l'impression)

Aperçu

En raison de diverses circonstances adultes, vous pouvez ** omettre le milieu du graphique avec une ligne ondulée **. Ceci est une explication de la façon de créer un tel graphe en utilisant matplotlib.

f.png

Environnement d'exécution

Nous avons confirmé l'exécution et le fonctionnement avec Python 3.6.9 (Google Colab. Environment).

Environnement d'exécution


japanize-matplotlib      1.0.5          
matplotlib               3.1.3          
matplotlib-venn          0.11.5         

Préparation à l'utilisation du japonais dans les graphiques

Pour rendre matplotlib ** japonais compatible ** dans l'environnement Google Colab, procédez comme suit.

Préparation à l'utilisation du japonais dans le graphique


!pip install japanize-matplotlib
import japanize_matplotlib

Créer un graphique à barres normalement

Tout d'abord, dessinons un graphique à barres normalement.

Créer un graphique à barres normalement


left   = np.array(['Fukushima', 'Aichi', 'Kanagawa', 'Osaka', 'Tokyo'])
height = np.array([160, 220, 280, 360, 1820])

plt.figure(figsize=(3,4), dpi=160)
plt.bar(left,height) #graphique à barres
plt.yticks(np.arange(0,1800+1,200))    #Échelle de l'axe X de 0 à 1900 par incréments de 200
plt.gcf().patch.set_facecolor('white') #Réglez la couleur d'arrière-plan sur "blanc"

Le résultat de l'exécution est le suivant. La saillie de Tokyo est très perceptible.

f1.png

Créer un graphique à barres avec des lignes ondulées omises au milieu

Étape 1 Organisez les mêmes graphiques à barres de haut en bas dans le sous-graphique

Step.1


import numpy as np
import matplotlib.pyplot as plt
import matplotlib.patches as mpatches
from matplotlib.path import Path

left   = np.array(['Fukushima', 'Aichi', 'Kanagawa', 'Osaka', 'Tokyo'])
height = np.array([160, 220, 280, 360, 1820])

#Sous-tracé Préparez un sous-tracé 2 par 1
fig, ax = plt.subplots(nrows=2, figsize=(3,4), dpi=160, sharex='col',
                       gridspec_kw={'height_ratios': (1,2)} )

fig.patch.set_facecolor('white') #Réglez la couleur d'arrière-plan sur "blanc"

ax[0].bar(left,height) #Rangée supérieure
ax[1].bar(left,height) #Rangée inférieure

gridspec_kw = {'height_ratios': (1,2)} est défini de sorte que le rapport de hauteur du haut et du bas soit de 1: 2 $. Le résultat de l'exécution est le suivant.

f2.png

Étape 2 Collez les graphiques du haut et du bas ensemble

Il y a un espace entre les sous-graphiques supérieurs et inférieurs, je vais donc l'effacer.

Step.2


#Définir l'espacement vertical entre les sous-tracés sur zéro
fig.subplots_adjust(hspace=0.0)  

Le résultat de l'exécution est le suivant.

f3.png

Étape 3 Effacez la ligne de démarcation et définissez la plage de l'axe Y individuellement en haut et en bas

Masque les bordures des graphiques supérieur et inférieur (= le bas du sous-tracé supérieur, le haut du sous-tracé inférieur). Il définit également la plage et l'échelle d'affichage de l'axe Y pour chaque sous-tracé. À ce stade, assurez-vous que le ** rapport de plage d'affichage de l'axe Y ** entre les sous-graphiques est le même que le `` ratio_hauteur ': (1,2) `spécifié à l'étape 1.

Step.3


#Sous-tracé inférieur
ax[1].set_ylim(0,400)  #Largeur de section 400
ax[1].set_yticks(np.arange(0,300+1,100))

#Sous-tracé supérieur
ax[0].set_ylim(1750,1950)  #Largeur de section 200
ax[0].set_yticks((1800,1900))

#Masquer le bord supérieur de la zone de tracé inférieure
ax[1].spines['top'].set_visible(False)

#Masquer le bas de la zone de tracé supérieure, masquer l'échelle de l'axe X et l'étiquette
ax[0].spines['bottom'].set_visible(False)
ax[0].tick_params(axis='x', which='both', bottom=False, labelbottom=False) 

Le résultat de l'exécution est le suivant. f4.png

Étape 4 Tracez une ligne Nyoro

Je vais dessiner un Nyoro (ligne ondulée) indiquant que la section du milieu est omise.

Step.4


d1 = 0.02 #Quantité de saillie sur l'axe X
d2 = 0.03 #Hauteur des vagues de Nyoro
wn = 21   #Nombre d'ondes de Nyoro (spécifiez une valeur impaire)

pp = (0,d2,0,-d2)
px = np.linspace(-d1,1+d1,wn)
py = np.array([1+pp[i%4] for i in range(0,wn)])
p = Path(list(zip(px,py)), [Path.MOVETO]+[Path.CURVE3]*(wn-1))

line1 = mpatches.PathPatch(p, lw=4, edgecolor='black',
                          facecolor='None', clip_on=False,
                          transform=ax[1].transAxes, zorder=10)

line2 = mpatches.PathPatch(p,lw=3, edgecolor='white',
                           facecolor='None', clip_on=False,
                           transform=ax[1].transAxes, zorder=10,
                           capstyle='round')

a = ax[1].add_patch(line1)
a = ax[1].add_patch(line2)

Le résultat de l'exécution est le suivant.

f5.png

Si vous définissez les paramètres de dessin comme d1 = 0,1, wn = 41, vous obtenez:

f6.png

Code entier

Code entier


%reset -f
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.patches as mpatches
from matplotlib.path import Path

left   = np.array(['Fukushima', 'Aichi', 'Kanagawa', 'Osaka', 'Tokyo'])
height = np.array([160, 220, 280, 360, 1820])

#Sous-tracé Préparez un sous-tracé 2 par 1
fig, ax = plt.subplots(nrows=2, figsize=(3,4), dpi=160, sharex='col',
                       gridspec_kw={'height_ratios': (1,2)} )

fig.patch.set_facecolor('white') #Réglez la couleur d'arrière-plan sur "blanc"

ax[0].bar(left,height) #Rangée supérieure
ax[1].bar(left,height) #Rangée inférieure

#Définir l'espacement vertical entre les sous-tracés sur zéro
fig.subplots_adjust(hspace=0.0)  

#Sous-tracé inférieur
ax[1].set_ylim(0,400)  #Largeur de section 400
ax[1].set_yticks(np.arange(0,300+1,100))

#Sous-tracé supérieur
ax[0].set_ylim(1750,1950)  #Largeur de section 200
ax[0].set_yticks((1800,1900))

#Masquer le bord supérieur de la zone de tracé inférieure
ax[1].spines['top'].set_visible(False)

#Masquer le bas de la zone de tracé supérieure, masquer l'échelle de l'axe X et l'étiquette
ax[0].spines['bottom'].set_visible(False)
ax[0].tick_params(axis='x', which='both', bottom=False, labelbottom=False) 

##Dessin au trait Nyoro
d1 = 0.02 #Quantité de saillie sur l'axe X
d2 = 0.03 #Hauteur des vagues de Nyoro
wn = 21   #Nombre d'ondes de Nyoro (spécifiez une valeur impaire)

pp = (0,d2,0,-d2)
px = np.linspace(-d1,1+d1,wn)
py = np.array([1+pp[i%4] for i in range(0,wn)])
p = Path(list(zip(px,py)), [Path.MOVETO]+[Path.CURVE3]*(wn-1))

line1 = mpatches.PathPatch(p, lw=4, edgecolor='black',
                          facecolor='None', clip_on=False,
                          transform=ax[1].transAxes, zorder=10)

line2 = mpatches.PathPatch(p,lw=3, edgecolor='white',
                           facecolor='None', clip_on=False,
                           transform=ax[1].transAxes, zorder=10,
                           capstyle='round')

a = ax[1].add_patch(line1)
a = ax[1].add_patch(line2)

Recommended Posts

Je veux créer un graphique avec des lignes ondulées au milieu avec matplotlib (je veux manipuler l'impression)
Je souhaite créer manuellement une légende avec matplotlib
Je veux faire la transition avec un bouton sur le ballon
Je veux travailler avec un robot en python.
Je souhaite créer une API qui retourne un modèle avec une relation récursive dans Django REST Framework
[Visualisation] Je veux dessiner un beau graphique avec Plotly
Je veux créer un Dockerfile pour le moment.
Je veux voir le graphique en 3D! Je peux réaliser un tel rêve.
Je veux créer un système pour éviter d'oublier de serrer la clé 1
Je veux créer un fichier pip et le refléter dans le menu fixe
Je veux créer un histogramme et superposer la courbe de distribution normale dessus. édition matplotlib
Je veux imprimer dans la notation d'inclusion
Je veux intégrer Matplotlib dans PySimpleGUI
Créer un graphique avec des bordures supprimées avec matplotlib
Lors de la génération d'un grand nombre de graphiques avec matplotlib, je ne souhaite pas afficher le graphique à l'écran (environnement jupyter)
Je veux changer la couleur en cliquant sur le point de dispersion dans matplotlib
Je souhaite trier une liste dans l'ordre des autres listes
J'ai essayé d'afficher la valeur d'altitude du DTM dans un graphique
Je souhaite résoudre le problème de fuite de mémoire lors de la sortie d'un grand nombre d'images avec Matplotlib
Je veux faire de matplotlib un thème sombre
Je souhaite créer facilement un modèle de bruit
Je souhaite afficher plusieurs images avec matplotlib.
Je souhaite créer un type d'implémentation pouvant être branché
Je veux écrire dans un fichier avec Python
Je veux afficher la progression en Python!
Je souhaite afficher uniquement différentes lignes du fichier texte avec diff
Je souhaite créer une file d'attente prioritaire pouvant être mise à jour avec Python (2.7)
Pour générer une valeur au milieu d'une cellule avec Jupyter Notebook
Créez un graphique empilé correspondant aux directions positives et négatives avec matplotlib
Je souhaite définir un cycle de vie dans la définition de tâche d'ECS
Je souhaite voir une liste de fichiers WebDAV dans le module Requêtes
Créez un filtre pour obtenir un jeton d'accès avec l'API Graph (Flask)
J'ai essayé de créer un modèle avec l'exemple d'Amazon SageMaker Autopilot
Je voulais connaître le nombre de lignes dans plusieurs fichiers et j'ai essayé de l'obtenir avec une commande
J'ai essayé de représenter graphiquement les packages installés en Python
Je souhaite intégrer une variable dans une chaîne Python
Je veux facilement implémenter le délai d'expiration en python
[Python] Comment dessiner un graphique linéaire avec Matplotlib
Essayez de créer une table d'enregistrement de bataille avec matplotlib à partir des données de "Schedule-kun"
Je veux escalader une montagne avec l'apprentissage par renforcement
Je veux écrire en Python! (2) Écrivons un test
J'ai créé un graphique à barres empilées avec matplotlib de Python et ajouté une étiquette de données
Je veux échantillonner au hasard un fichier avec Python
Je veux hériter de l'arrière avec la classe de données python
Je veux diviser une chaîne de caractères avec hiragana
Je souhaite créer une base de données de déjeuners [EP1] Django pour la première fois
Je souhaite créer une base de données de déjeuner [EP1-4] Django pour la première fois
Je veux écrire en Python! (3) Utiliser des simulacres
Impossible de manipuler l'iframe dans la page avec Selenium
[Python] Comment créer un histogramme bidimensionnel avec Matplotlib
Je souhaite extraire uniquement les pods avec l'étiquette spécifiée à l'aide du sélecteur d'étiquettes dans Client-go
J'ai essayé de créer une classe pour rechercher des fichiers avec la méthode Glob de Python dans VBA
Je veux utiliser le jeu de données R avec python
Je veux faire fonctionner un ordinateur quantique avec Python
Je veux manipuler des chaînes dans Kotlin comme Python!
Je veux lier une variable locale avec lambda
Notez ce que vous voulez faire à l'avenir avec Razpai
J'ai créé une classe pour obtenir le résultat de l'analyse par MeCab dans ndarray avec python