[PYTHON] Ich möchte mit matplotlib ein Diagramm mit Wellenlinien in der Mitte erstellen (ich möchte den Eindruck manipulieren).

Überblick

Aufgrund verschiedener Umstände bei Erwachsenen möchten Sie möglicherweise ** die Mitte des Diagramms mit einer Wellenlinie ** weglassen **. Eine Beschreibung, wie ein solches Diagramm mit matplotlib erstellt wird.

f.png

Ausführungsumgebung

Wir haben die Ausführung und den Betrieb mit Python 3.6.9 (Google Colab. Environment) bestätigt.

Ausführungsumgebung


japanize-matplotlib      1.0.5          
matplotlib               3.1.3          
matplotlib-venn          0.11.5         

Vorbereitung für die Verwendung von Japanisch in Grafiken

Gehen Sie wie folgt vor, um matplotlib ** Japanisch kompatibel ** in der Google Colab-Umgebung zu machen.

Vorbereitung für die Verwendung von Japanisch in der Grafik


!pip install japanize-matplotlib
import japanize_matplotlib

Erstellen Sie normal ein Balkendiagramm

Lassen Sie uns zunächst normal ein Balkendiagramm zeichnen.

Erstellen Sie normal ein Balkendiagramm


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

plt.figure(figsize=(3,4), dpi=160)
plt.bar(left,height) #Balkendiagramm
plt.yticks(np.arange(0,1800+1,200))    #X-Achsenskala von 0 bis 1900 in 200 Schritten
plt.gcf().patch.set_facecolor('white') #Stellen Sie die Hintergrundfarbe auf "Weiß"

Das Ausführungsergebnis ist wie folgt. Der Vorsprung von Tokio ist sehr auffällig.

f1.png

Erstellen Sie ein Balkendiagramm mit Wellenlinien in der Mitte

Schritt 1 Ordnen Sie die gleichen Balkendiagramme im Unterplot nach oben und unten an

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', 'Tokio'])
height = np.array([160, 220, 280, 360, 1820])

#Untergrund Bereiten Sie einen 2-mal-1-Untergrund vor
fig, ax = plt.subplots(nrows=2, figsize=(3,4), dpi=160, sharex='col',
                       gridspec_kw={'height_ratios': (1,2)} )

fig.patch.set_facecolor('white') #Stellen Sie die Hintergrundfarbe auf "Weiß"

ax[0].bar(left,height) #Obere Reihe
ax[1].bar(left,height) #Untere Reihe

gridspec_kw = {'height_ratios': (1,2)} wird so eingestellt, dass das Höhenverhältnis von oben und unten $ 1: 2 $ beträgt. Das Ausführungsergebnis ist wie folgt.

f2.png

Schritt 2 Kleben Sie die oberen und unteren Grafiken zusammen

Es gibt eine Lücke zwischen der oberen und der unteren Nebenhandlung, daher werde ich sie löschen.

Step.2


#Setzen Sie den vertikalen Abstand zwischen den Teilplots auf Null
fig.subplots_adjust(hspace=0.0)  

Das Ausführungsergebnis ist wie folgt.

f3.png

Schritt 3 Löschen Sie die Grenzlinie und stellen Sie den Bereich der Y-Achse oben und unten einzeln ein

Blendet die Ränder des oberen und unteren Diagramms aus (= der untere Rand des oberen Teilplots, der obere Rand des unteren Teilplots). Außerdem werden der Anzeigebereich und die Skalierung der Y-Achse für jede Unterzeichnung festgelegt. Stellen Sie zu diesem Zeitpunkt sicher, dass das ** Y-Achsen-Anzeigebereichsverhältnis ** zwischen den Unterplots dem in Schritt 1 angegebenen "height_ratios": (1,2) "entspricht.

Step.3


#Untere Nebenhandlung
ax[1].set_ylim(0,400)  #Querschnittsbreite 400
ax[1].set_yticks(np.arange(0,300+1,100))

#Obere Nebenhandlung
ax[0].set_ylim(1750,1950)  #Querschnittsbreite 200
ax[0].set_yticks((1800,1900))

#Blenden Sie die Oberkante des unteren Grundstücksbereichs aus
ax[1].spines['top'].set_visible(False)

#Blenden Sie den unteren Rand des oberen Plotbereichs aus, verbergen Sie die X-Achsen-Skala und die Beschriftung
ax[0].spines['bottom'].set_visible(False)
ax[0].tick_params(axis='x', which='both', bottom=False, labelbottom=False) 

Das Ausführungsergebnis ist wie folgt. f4.png

Schritt 4 Zeichnen Sie eine Nyoro-Linie

Ich werde eine Nyoro (Wellenlinie) zeichnen, die anzeigt, dass der Mittelteil weggelassen wird.

Step.4


d1 = 0.02 #X-Achsen-Vorsprung
d2 = 0.03 #Nyoro Wellenhöhe
wn = 21   #Anzahl der Nyoro-Wellen (geben Sie einen ungeraden Wert an)

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)

Das Ausführungsergebnis ist wie folgt.

f5.png

Wenn Sie die Zeichenparameter auf "d1 = 0,1", "wn = 41" einstellen, erhalten Sie:

f6.png

Ganzer Code

Ganzer Code


%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', 'Tokio'])
height = np.array([160, 220, 280, 360, 1820])

#Untergrund Bereiten Sie einen 2-mal-1-Untergrund vor
fig, ax = plt.subplots(nrows=2, figsize=(3,4), dpi=160, sharex='col',
                       gridspec_kw={'height_ratios': (1,2)} )

fig.patch.set_facecolor('white') #Stellen Sie die Hintergrundfarbe auf "Weiß"

ax[0].bar(left,height) #Obere Reihe
ax[1].bar(left,height) #Untere Reihe

#Setzen Sie den vertikalen Abstand zwischen den Teilplots auf Null
fig.subplots_adjust(hspace=0.0)  

#Untere Nebenhandlung
ax[1].set_ylim(0,400)  #Querschnittsbreite 400
ax[1].set_yticks(np.arange(0,300+1,100))

#Obere Nebenhandlung
ax[0].set_ylim(1750,1950)  #Querschnittsbreite 200
ax[0].set_yticks((1800,1900))

#Blenden Sie die Oberkante des unteren Grundstücksbereichs aus
ax[1].spines['top'].set_visible(False)

#Blenden Sie den unteren Rand des oberen Plotbereichs aus, verbergen Sie die X-Achsen-Skala und die Beschriftung
ax[0].spines['bottom'].set_visible(False)
ax[0].tick_params(axis='x', which='both', bottom=False, labelbottom=False) 

##Nyoro Strichzeichnung
d1 = 0.02 #X-Achsen-Vorsprung
d2 = 0.03 #Nyoro Wellenhöhe
wn = 21   #Anzahl der Nyoro-Wellen (geben Sie einen ungeraden Wert an)

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

Ich möchte mit matplotlib ein Diagramm mit Wellenlinien in der Mitte erstellen (ich möchte den Eindruck manipulieren).
Ich möchte manuell eine Legende mit matplotlib erstellen
Ich möchte mit einem Knopf am Kolben übergehen
Ich möchte mit einem Roboter in Python arbeiten.
Ich möchte eine API erstellen, die ein Modell mit einer rekursiven Beziehung im Django REST Framework zurückgibt
[Visualisierung] Ich möchte mit Plotly ein schönes Diagramm zeichnen
Ich möchte vorerst eine Docker-Datei erstellen.
Ich möchte die Grafik in 3D sehen! Ich kann einen solchen Traum wahr werden lassen.
Ich möchte ein System erstellen, um zu verhindern, dass vergessen wird, den Schlüssel 1 festzuziehen
Ich möchte eine Pipfile erstellen und im Docker wiedergeben
Ich möchte ein Histogramm erstellen und die Normalverteilungskurve darauf überlagern. matplotlib edition
Ich möchte in der Einschlussnotation drucken
Ich möchte Matplotlib in PySimpleGUI einbetten
Erstellen Sie ein Diagramm mit Rändern, die mit matplotlib entfernt wurden
Wenn ich mit matplotlib eine große Anzahl von Diagrammen generiere, möchte ich das Diagramm nicht auf dem Bildschirm anzeigen (Jupyter-Umgebung).
Ich möchte die Farbe ändern, indem ich auf den Streupunkt in matplotlib klicke
Ich möchte eine Liste in der Reihenfolge anderer Listen sortieren
Ich habe versucht, den Höhenwert von DTM in einem Diagramm anzuzeigen
Ich möchte das Problem des Speicherverlusts bei der Ausgabe einer großen Anzahl von Bildern mit Matplotlib lösen
Ich möchte Matplotlib zu einem dunklen Thema machen
Ich möchte einfach ein Rauschmodell erstellen
Ich möchte mehrere Bilder mit matplotlib anzeigen.
Ich möchte eine Art von Implementierung erstellen, die angeschlossen werden kann
Ich möchte mit Python in eine Datei schreiben
Ich möchte den Fortschritt in Python anzeigen!
Ich möchte nur verschiedene Zeilen der Textdatei mit diff anzeigen
Ich möchte eine Prioritätswarteschlange erstellen, die mit Python (2.7) aktualisiert werden kann.
So geben Sie mit Jupyter Notebook einen Wert in der Mitte einer Zelle aus
Erstellen Sie mit matplotlib ein gestapeltes Diagramm, das sowohl der positiven als auch der negativen Richtung entspricht
Ich möchte einen Lebenszyklus in der Aufgabendefinition von ECS festlegen
Ich möchte eine Liste der WebDAV-Dateien im Modul Anfragen anzeigen
Erstellen Sie einen Filter, um ein Zugriffstoken mit der Graph-API (Flask) zu erhalten.
Ich habe versucht, ein Modell mit dem Beispiel von Amazon SageMaker Autopilot zu erstellen
Ich wollte die Anzahl der Zeilen in mehreren Dateien wissen und versuchte, sie mit einem Befehl abzurufen
Ich habe versucht, die in Python installierten Pakete grafisch darzustellen
Ich möchte eine Variable in einen Python-String einbetten
Ich möchte Timeout einfach in Python implementieren
[Python] Wie zeichnet man mit Matplotlib ein Liniendiagramm?
Versuchen Sie, mit matplotlib aus den Daten von "Schedule-kun" eine Kampfaufzeichnungstabelle zu erstellen.
Ich möchte mit verstärkendem Lernen einen Berg besteigen
Ich möchte in Python schreiben! (2) Schreiben wir einen Test
Ich habe ein gestapeltes Balkendiagramm mit matplotlib von Python erstellt und eine Datenbeschriftung hinzugefügt
Ich möchte eine Datei mit Python zufällig testen
Ich möchte mit Python-Datenklasse nach hinten erben
Ich möchte eine Zeichenkette mit Hiragana teilen
Ich möchte zum ersten Mal eine Django-Studie zur Mittagsdatenbank [EP1] erstellen
Ich möchte zum ersten Mal eine Django-Studie zum Mittagessen [EP1-4] erstellen
Ich möchte in Python schreiben! (3) Verwenden Sie Mock
Iframe in Seite mit Selenium kann nicht bearbeitet werden
[Python] So erstellen Sie mit Matplotlib ein zweidimensionales Histogramm
Ich möchte nur Pods mit dem angegebenen Label mit Label Selector in Client-go extrahieren
Ich habe versucht, eine Klasse für die Suche nach Dateien mit der Glob-Methode von Python in VBA zu erstellen
Ich möchte R-Datensatz mit Python verwenden
Ich möchte einen Quantencomputer mit Python betreiben
Ich möchte Strings in Kotlin wie Python manipulieren!
Ich möchte eine lokale Variable mit Lambda binden
Notieren Sie sich, was Sie in Zukunft mit Razpai machen möchten
Ich habe eine Klasse erstellt, um das Analyseergebnis von MeCab in ndarray mit Python zu erhalten