wake-up-neo.net

Gibt es eine Liste von Linienstilen in Matplotlib?

Ich schreibe ein Skript, das einige Plots machen wird. Ich möchte, dass mehrere Datenreihen mit jeweils einzigartigem Linienstil (nicht Farbe) gezeichnet werden. Ich kann leicht eine Liste durchlaufen, aber ist eine solche Liste bereits in Python verfügbar? 

61
Yotam

Nach dem Dokument könnten Sie sie folgendermaßen finden: 

from matplotlib import lines
lines.lineStyles.keys()
>>> ['', ' ', 'None', '--', '-.', '-', ':']

Sie können dasselbe mit Markern

BEARBEITEN: In den neuesten Versionen gibt es immer noch dieselben Stile, aber Sie können den Abstand zwischen Punkten/Zeilen variieren.

80
Cédric Julien

plot Dokumentation

http://matplotlib.org/1.5.3/api/pyplot_api.html#matplotlib.pyplot.plot enthält eine Liste von Linien- und Markierungsstilen:

character description
'-'       solid line style
'--'      dashed line style
'-.'      dash-dot line style
':'       dotted line style
'.'       point marker
','       pixel marker
'o'       circle marker
'v'       triangle_down marker
'^'       triangle_up marker
'<'       triangle_left marker
'>'       triangle_right marker
'1'       tri_down marker
'2'       tri_up marker
'3'       tri_left marker
'4'       tri_right marker
's'       square marker
'p'       pentagon marker
'*'       star marker
'h'       hexagon1 marker
'H'       hexagon2 marker
'+'       plus marker
'x'       x marker
'D'       diamond marker
'd'       thin_diamond marker
'|'       vline marker
'_'       hline marker

Da dies Teil der pyplot.plot-Dokumentzeichenfolge ist, können Sie es auch vom Terminal aus sehen mit:

import matplotlib.pyplot as plt
help(plt.plot)

Aus meiner Erfahrung ist es schön, die Farben und Markierungen in einer Liste zu haben, damit ich sie beim Plotten durchlaufen kann.

So bekomme ich die Liste solcher Dinge. Es dauerte etwas Graben.

import matplotlib
colors_array = matplotlib.colors.cnames.keys()
markers_array = matplotlib.markers.MarkerStyle.markers.keys()
6
Russell Lego

In python3 gibt die .keys()-Methode ein dict_keys-Objekt und keine list..__ zurück. Sie müssen die Ergebnisse an list() übergeben, um das Array wie in python2 zu indizieren. z.B. diese SO Frage

Um iterierbare Arrays für Linien, Farben und Marker zu erstellen, können Sie so etwas verwenden.

import matplotlib
colors_array = list(matplotlib.colors.cnames.keys())
lines_array = list(matplotlib.lines.lineStyles.keys())
markers_array = list(matplotlib.markers.MarkerStyle.markers.keys())
2
Jason Neal

Ich beantworte die Frage nach dem Zugriff auf eine Liste nicht direkt, aber es ist nützlich, auf dieser Seite eine weitere Alternative zu haben: Es gibt eine zusätzliche Möglichkeit, gestrichelte Linienstile zu generieren.

Sie können Linien zwischen A und B mit Querstreifen wie erzeugen

A |||||||||||||||||||||||||||||||||||||||||||||||| B

A || || || || || || || || || || || || || || || || B

A | | | | | | | | | | | | | | | | | | | | | | | | B

durch Erhöhen der Breite Ihrer Linie und Festlegen eines benutzerdefinierten Strichmusters:

ax.plot(x, y, dashes=[30, 5, 10, 5])

Die Dokumentation zu matplotlib.lines.Line2Dsagt dies about set_dashes(seq):

Stellen Sie die Strichreihenfolge ein, die Folge von Strichen mit Ein-Aus-Tinte in Punkten. Wenn seq leer ist oder seq = (None, None), wird der Linienstil auf solid gesetzt.

ACCEPTS: Reihenfolge der Ein/Aus-Tinte in Punkten

Ich denke, es hätte besser gesagt werden können: Wenn die Linie gezeichnet wird, gibt die Zahlenfolge an, wie viele Punkte entlang der Linie gezeichnet werden, wie viele Punkte ausgelassen werden (falls es zwei Zahlen gibt), wie viele gezeichnet werden, wie viele sind unbemalt (bei vier Zahlen in der Reihenfolge). Mit vier Zahlen können Sie einen Strich mit einer gepunkteten Linie erzeugen: [30, 5, 3, 5] ergibt einen 30-Punkt-Strich, eine 5-Punkt-Lücke, einen 3-Punkt-Strich (ein Punkt) und eine 5 -Punkt Lücke. Dann wiederholt es sich.

Diese Seite der Dokumentation erklärt diese Möglichkeit. Schauen Sie hier für zwei verschiedene Arten, es zu tun.

1

Sie können das Wörterbuch aus dem Linestyle-Beispiel kopieren:

from collections import OrderedDict

linestyles = OrderedDict(
    [('solid',               (0, ())),
     ('loosely dotted',      (0, (1, 10))),
     ('dotted',              (0, (1, 5))),
     ('densely dotted',      (0, (1, 1))),

     ('loosely dashed',      (0, (5, 10))),
     ('dashed',              (0, (5, 5))),
     ('densely dashed',      (0, (5, 1))),

     ('loosely dashdotted',  (0, (3, 10, 1, 10))),
     ('dashdotted',          (0, (3, 5, 1, 5))),
     ('densely dashdotted',  (0, (3, 1, 1, 1))),

     ('loosely dashdotdotted', (0, (3, 10, 1, 10, 1, 10))),
     ('dashdotdotted',         (0, (3, 5, 1, 5, 1, 5))),
     ('densely dashdotdotted', (0, (3, 1, 1, 1, 1, 1)))])

Sie können dann die Linienstile durchlaufen

fig, ax = plt.subplots()

X, Y = np.linspace(0, 100, 10), np.zeros(10)
for i, (name, linestyle) in enumerate(linestyles.items()):
    ax.plot(X, Y+i, linestyle=linestyle, linewidth=1.5, color='black')

ax.set_ylim(-0.5, len(linestyles)-0.5)

plt.show()

Oder nehmen Sie einfach einen einzigen Linestyle daraus,

ax.plot([0,100], [0,1], linestyle=linestyles['loosely dashdotdotted'])