Gibt es eine Liste von Linienstilen in matplotlib?

76

Ich schreibe ein Skript, das etwas plotten wird. Ich möchte, dass mehrere Datenreihen mit jeweils einem einzigartigen Linienstil (nicht Farbe) gezeichnet werden. Ich kann eine Liste leicht durchlaufen, aber gibt es eine solche Liste bereits in Python?

Yotam
quelle
2
Ich weiß, es ist nicht wirklich das, wonach Sie suchen, aber ich habe eine Liste von ihnen in meiner Antwort hier
wim

Antworten:

93

Laut dem Dokument können Sie sie folgendermaßen finden:

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

Sie können dasselbe mit Markern tun

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

Cédric Julien
quelle
5
Die Syntax für Marker scheint etwas anders zu sein:from matplotlib import markers; markers.MarkerStyle.markers.keys()
Joelostblom
lines.lineMarkers.keys()Erzeugt in Version 2.1.2 das gleiche Ergebnis wie markers.MarkerStyle.markers.keys().
Matt Hancock
1
Schade, es gibt nur 4 Optionen, aber ich habe 5 Linien zu zeichnen.
GoingMyWay
38

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.plotDokumentzeichenfolge ist, können Sie es auch vom Terminal aus sehen mit:

import matplotlib.pyplot as plt
help(plt.plot)
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
quelle
1
Da die Linienstile in der Dokumentation für aufgeführt sind pyplot.plot(), können sie lokal angezeigt werden, indem Sie die Dokumentzeichenfolge dieser Funktion lesen : import matplotlib.pyplot as plt; ?plt.plot. Die Markierungs- und Linienstile sind gegen Ende im Abschnitt "Notizen" aufgeführt.
Joelostblom
8

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

So erhalte ich die Liste solcher Dinge. Es dauerte etwas zu graben.

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

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 über die Linienstile iterieren

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 du nimmst einfach einen einzigen Linestyle aus diesen heraus,

ax.plot([0,100], [0,1], linestyle=linestyles['loosely dashdotdotted'])
Wichtigkeit von BeErnest
quelle
3

In Python3 gibt die .keys()Methode ein dict_keysObjekt zurück und kein list. Sie müssen die Ergebnisse übergeben, list()um das Array wie in python2 indizieren zu können. zB diese SO Frage

Um iterierbare Arrays für Linien, Farben und Markierungen zu erstellen, können Sie so etwas wie 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())
Jason Neal
quelle
1

Ich beantworte die Frage des Zugriffs 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.

Erhöhen Sie die Breite Ihrer Linie und geben Sie ein benutzerdefiniertes Strichmuster an:

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

Die Dokumentation für matplotlib.lines.Line2D sagt dies über set_dashes(seq):

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

AKZEPTE: Reihenfolge der Ein / Aus-Tinte in Punkten

Ich denke, es hätte besser gesagt werden können: Während die Linie gemalt wird, gibt die Zahlenfolge an, wie viele Punkte entlang der Linie gemalt werden, wie viele Punkte ausgelassen werden (falls es zwei Zahlen gibt), wie viele gemalt werden, wie viele sind unbemalt (bei vier Zahlen in der Sequenz). Mit vier Zahlen können Sie eine gestrichelte Linie mit einem Strich ‒ erzeugen: [30, 5, 3, 5] ergibt einen 30 Punkte langen Strich, eine 5-Punkte-Lücke, einen 3-Punkte-Strich (einen Punkt) und eine 5 -Punktlücke. Dann wiederholt es sich.

Diese Seite der Dokumentation erläutert diese Möglichkeit. Suchen Sie hier nach zwei verschiedenen Möglichkeiten.

Bence Mélykúti
quelle