Există o listă de stiluri de linie în matplotlib? (Programare, Python, Matplotlib, Linestyle)

Yotam a intrebat.

Scriu un script care va face niște trasee. Vreau ca acesta să traseze mai multe serii de date, fiecare cu stilul său unic de linie (nu de culoare). Pot itera cu ușurință printr-o listă, dar există o astfel de listă deja disponibilă în python?

Comentarii

  • știu că nu este chiar ceea ce căutați, dar am o listă în răspunsul meu de aici –  > Por wim.
6 răspunsuri
Cédric Julien

În conformitate cu documentul ai putea să le găsești făcând asta :

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

Puteți face același lucru cu markere

EDIT: În ultimele versiuni, există în continuare aceleași stiluri, dar puteți varia spațiul dintre puncte/linii.

Comentarii

  • Sintaxa pentru markere pare să fie ușor diferită: from matplotlib import markers; markers.MarkerStyle.markers.keys() –  > Por joelostblom.
  • În versiunea 2.1.2, lines.lineMarkers.keys() produce același rezultat ca și markers.MarkerStyle.markers.keys(). –  > Por Matt Hancock.
  • Ce păcat, există doar 4 opțiuni, dar am 5 linii de trasat. –  > Por GoingMyWay.
Ciro Santilli新疆棉花TRUMP BAN BAD

plot documentație

http://matplotlib.org/1.5.3/api/pyplot_api.html#matplotlib.pyplot.plot are o listă de stiluri de linii + marker:

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

Deoarece acest lucru face parte din pyplot.plot docstring, o puteți vedea și din terminal cu:

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

Comentarii

  • Deoarece stilurile de linie sunt listate în documentația pentru pyplot.plot(), acestea pot fi vizualizate la nivel local prin citirea docstring-ului acelei funcții: import matplotlib.pyplot as plt; ?plt.plot. Stilurile de marcaj și de linie sunt listate în secțiunea „Notes” spre sfârșit. –  > Por joelostblom.
Russell Lego

Din experiența mea, este plăcut să am culorile și marcatorii într-o listă, astfel încât să pot trece prin ele atunci când fac o reprezentare grafică.

Iată cum obțin lista cu astfel de lucruri. A fost nevoie de ceva săpături.

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

ImportanceOfBeingErnest

Puteți copia dicționarul de la exemplul Linestyle:

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)))])

Puteți apoi să iterați peste stilurile de linie

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()

Sau pur și simplu luați un singur stil de linie din acestea,

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

Jason Neal

În python3, se utilizează .keys() returnează un dict_keys și nu un obiect list.Trebuie să treceți rezultatele la list() pentru a putea indexa matricea, așa cum ați putea face în python2. De exemplu, această întrebare SO

Deci, pentru a crea array-uri iterabile pentru linii, culori și markeri puteți folosi ceva de genul.

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

Bence Mélykúti

Nu răspund direct la întrebarea de accesare a unei liste, dar este util să mai aveți o alternativă pe această pagină: există o modalitate suplimentară de a genera stiluri de linii punctate.

Puteți genera linii între A și B cu dungi transversale de tipul

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

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

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

prin creșterea lățimii liniei dvs. și specificând un model personalizat de liniuțe:

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

Documentația pentru matplotlib.lines.Line2D spune acest lucru despre set_dashes(seq):

Setați secvența de liniuțe, secvența de liniuțe cu cerneală on off în puncte. Dacă secvența este goală sau dacă secvența = (None, None), stilul liniei va fi setat la solid.

ACCEPTĂ: secvență de cerneală on/off în puncte

Cred că s-ar fi putut spune mai bine: pe măsură ce pictează linia, secvența de numere specifică câte puncte sunt pictate de-a lungul liniei, apoi câte puncte sunt lăsate în afara (în cazul în care sunt două numere), câte sunt pictate, câte sunt nevopsite (în cazul în care sunt patru numere în secvență). Cu patru numere, puteți genera o linie punctată cu liniuțe: [30, 5, 5, 3, 5] dă o liniuță lungă de 30 de puncte, un interval de 5 puncte, o liniuță de 3 puncte (un punct) și un interval de 5 puncte. Apoi se repetă.

Această pagină din documentație explică această posibilitate. Uitați-vă aici pentru două moduri diferite de a face acest lucru.