Ich habe das Buch "Jupyter [Übung] Einführung für Python-Benutzer" mitautorisiert.
Obwohl nicht im Titel enthalten, wird auch ausführlich erklärt, wie Pandas, Matplotlib und Bokeh verwendet werden. Was in diesem Artikel geschrieben wird, ist auch verständlicher geschrieben. Ich habe es mit dem Ziel geschrieben, ein Muss zu werden, wenn ich Jupyter, Pandas, Matplotlib und Bokeh benutze. Schauen Sie also bitte mal rein.
"Einführung in Jupyter [Übung] für Python-Benutzer" (Takahiro Ikeuchi, Kaoruko Katayanagi, Emma Iwao, @driller, Technical Review)
Dieser Artikel ist der Artikel zum 13. Tag von Python Advent Calendar 2015 --Adventer.
Seit ich mit der Datenanalyse in Python angefangen habe, möchte ich Diagramme für Papiere und Präsentationsmaterialien in Python erstellen. Es gibt verschiedene Zeichenwerkzeuge, aber ich bin zu dem Schluss gekommen, dass matplotlib als einfaches Diagramm für Drucksachen wie Papiere gut zu sein scheint, und ich habe verschiedene Zeichnungen mit matplotlib ausprobiert. Heute möchte ich vier Techniken vorstellen, die ich durch Versuch und Irrtum gelernt habe: 1) Zeichnen eines Überlagerungsbalkendiagramms, 2) Festlegen von Farben im Detail, 3) Platzieren der Legende außerhalb des Rahmens und 4) Einfügen der Figur in die Leinwand. Ich denke.
Windows7 + Anaconda(Python3.5)
Dieses Mal habe ich eine Demo mit numerischen Werten erstellt, die entsprechend verteilt sind. Numpys random.normal wird zum Generieren von Daten verwendet, mit denen Sie den Durchschnittswert, die Standardabweichung und die Anzahl der Generationen angeben können.
python
import numpy as np #Zur Generierung von Demo-Daten. Es hat nichts mit dem Hauptthema zu tun.
import matplotlib.pyplot as plt #2D-Plotbibliothek, die das Zentrum des heutigen Themas darstellt
import matplotlib.cm as cm #Klasse, um die für das Diagramm verwendete Farbe im Detail anzugeben
from IPython.display import Image #Klasse zum Importieren von Diagrammen in Notizbücher
plt.rcParams['font.size'] = 14 #Stellen Sie die Schriftgröße ein
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)
__Technik 1 Was ist beim Schreiben eines gestapelten Balkendiagramms zu tun? __ Wenn Sie mit matplotlib einfach nacheinander numerische Werte in einer Abbildung zeichnen, wird der zuvor gezeichnete Balken durch den später gezeichneten Balken überschrieben. Wenn daher n Werte (V1, V2, V3, ..., Vn) in Schichten gezeichnet werden, gilt V1 + V2 + ... + Vn, V1 + V2 + ... + Vn-1, .. Es ist notwendig, .. und integrierte Werte zu schaffen und in der Reihenfolge vom Größten zu zeichnen. Es gibt viele coolere Möglichkeiten zu schreiben, aber wenn Sie es einfach schreiben, erstellen Sie einen Zeichnungsdatensatz mit dem folgenden Gefühl.
#Erstellen Sie ein Dataset für Overlay-Balkendiagramme
dataset = {'dat1':(y1+y2+y3+y4+y5),
'dat2':(y2+y3+y4+y5),
'dat3':(y3+y4+y5),
'dat4':(y4+y5),
'dat5':y5}
__Technik 2 Festlegen eines feinen Farbsatzes __ Wenn Sie nur das grundlegende Rot (r), Grün (g) und Blau (b) schreiben, sieht das Diagramm etwas schlampig aus. Verwenden Sie daher die cm-Klasse von matplotlib, um es etwas modischer aussehen zu lassen. Ausführliche Farbinformationen finden Sie unter hier.
Dieses Mal habe ich die Farben verwendet, die aus mehreren Farbskalen extrahiert wurden.
#Farbset-Erstellung
colors = [cm.RdBu(0.85), cm.RdBu(0.7), cm.PiYG(0.7), cm.Spectral(0.38), cm.Spectral(0.25)]
Jetzt ist es Zeit zu zeichnen. In dieser Demo habe ich eine Funktion erstellt, um die Bedingungen zu ändern und wiederholt auszuführen.
#Zeichnungsfunktion erstellen
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')
#Legendenzeichnung(Positionsbezeichnung)
if bap == 999:
ax1.legend(bbox_to_anchor=(bbax, bbay))
else:
ax1.legend(bbox_to_anchor=(bbax, bbay), borderaxespad=bap)
#Größenanpassung
if adj != 0:
plt.subplots_adjust(left = adjl, right = adjr)
#Dateiausgabe
fname = 'fig' + str(bbax) + str(bbay) + str(bap) + str(adj) + str(adjl) + str(adjr) + '.png'
plt.savefig(fname, dpi = 300, format='png')
__Technik 3 Legendenpositionierung __
Die Position der Legende ist Kann platziert werden, aber hier wird die Ankerposition für die Positionierung angegeben. Wenn Sie die Position nicht angeben, wird die Legende zunächst in der oberen rechten Ecke angezeigt (siehe Abbildung unten).
Abb. 1 Standard-Legendenlayout
Daher wird der Anker der Legende von bbox_to_anchor angegeben. Mit diesem Code
ax1.legend(bbox_to_anchor=(bbax, bbay))
(In diesem Code wird 999 angegeben, wenn der später beschriebene Borderaxespad nicht angegeben ist.) Wenn Sie die Ankerposition als (0, 0), (0, 1), (1, 0), (1, 1) angeben und zeichnen, wird die Legende in der folgenden Positionsbeziehung angeordnet.
Abb. 2 Schematische Darstellung des Legendenlayouts
Mit anderen Worten, es gibt an, wo sich die obere rechte Ecke der Legende am Rand der Figur befindet. Übrigens gibt es eine subtile Lücke zwischen der Grenze und der Legende. Dies scheint eine kleine Lücke in den Standardeinstellungen zu sein. Verwenden Sie die Option borderaxepad, um diese Lücke anzupassen.
Vom Code
borderaxespad=bap
Es ist der Teil von. Durch Setzen von bap = 0 werden die subtilen Lücken in Abb. 2 beseitigt. Das schematische Diagramm zeigt die folgende Positionsbeziehung.
Abb. 3 Anordnung der Legende bei gesetztem borderaxepad = 0
Da ich diesmal baq = 0 angegeben habe, überlappen sich die Ecke des Rahmens und die Ecke der Legende genau, aber Sie können den Abstand vom Rand anpassen, indem Sie den Wert ändern. Durch Erhöhen der Anzahl wird die Ankerposition um den angegebenen Betrag entfernt.
Nachdem Sie die Positionsbeziehung zwischen der Legende und dem Rand der Figur erfasst haben, zeigt die folgende Abbildung die Positionsinformationen.
Abb. 4 Positionsinformationen des Diagramms
Das heißt, die Position des linken Randes ist x = 0, die Position des rechten Randes ist x = 1, die Unterseite ist y = 0 und die Oberseite ist y = 1. Mit anderen Worten, wenn Sie rechts außerhalb des Rahmens schreiben, können Sie den Wert von x größer als 1 machen.
Jetzt ist es Zeit, die Legende nach außen zu zeichnen. Dieses Mal habe ich bbox_to_anchor = (1.2, 1) gesetzt, um es nach rechts draußen zu bringen.
Jetzt können Sie die Legende draußen schreiben. Abb. 5 Die Figur mit der Legende auf der Außenseite
__Technik 4 Platzierung in der Leinwand __ Ich kann die Positionsbeziehung verstehen, ich kann die Legende perfekt arrangieren und ich fühle, dass ich damit zufrieden bin, aber natürlich endet sie hier nicht. Wie Sie in Abb. 5 sehen können, ist die Legende in zwei Hälften geschnitten. Wenn Sie das Diagramm in eine Datei ausgeben, sieht es folgendermaßen aus.
Dies liegt daran, dass die Grafik + Legende zu groß für die Leinwand ist, auf der die Grafik + Legende gezeichnet wird. Einfach ausgedrückt befindet sich der Rand der Leinwand an der blauen Linie in der folgenden Abbildung.
Abb. 6 Abbildung mit außen platzierter Legende (mit Rand)
Verwenden Sie die Option subplots_adjust, um dies anzupassen. Der folgende Teil des Codes.
plt.subplots_adjust(left = adjl, right = adjr)
Dieses Mal wird `` `subplots_adjust``` angewendet, wenn adj ungleich Null ist.
`subplots_adjust``` wird ebenfalls basierend auf den Positionsinformationen in Fig. 4 eingestellt. Mit anderen Worten, geben Sie an, wo der linke und der rechte Rand der Figur auf der Leinwand platziert werden sollen. Wie bei der Abbildung hat die Leinwand am linken Rand Null und am rechten Rand 1. Wenn
subplot_adust = (0, 1)
``, befindet sich der linke Rand an der Nullposition auf der Leinwand und der rechte Rand an der 1-Position. In der Abbildung befindet sich der linke Rand immer links vom rechten Rand, sodass der Wert am linken Rand nicht größer sein kann als der Wert am rechten Rand.
Stellen Sie die vorherige Abbildung so ein, dass sie auf die Leinwand passt. Diesmal setze ich `subplots_adjust = (0.1, 0.8)`
. Das Ausgabeergebnis ist wie folgt.
Abb.7 Subplots_adjusted figure (mit Rand)
Es passt gut.
Wie waren die 4 Techniken zum Erstellen von Diagrammen für Papiere und Präsentationsmaterialien mit matplotlib? Das Jupyter-Notizbuch, das ich für diesen Beitrag erstellt habe, wird später auf GitHub hochgeladen. Wenn Sie also interessiert sind, schauen Sie bitte auch dort nach.
2015/12/13 22:18 Jupyter Notebook wurde auf GitHub hochgeladen. https://github.com/nobolis/pydata_workbook/blob/master/matplotlib_tips/matplotlib_tips.ipynb
Recommended Posts