web-dev-qa-db-fra.com

Existe-t-il une liste de styles de ligne dans matplotlib?

J'écris un script qui fera du complot. Je veux qu'il trace plusieurs séries de données, chacune avec son style de trait unique (pas de couleur). Je peux facilement parcourir une liste, mais une telle liste est-elle déjà disponible en python? 

61
Yotam

Selon le doc vous pourriez les trouver en faisant ceci: 

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

Vous pouvez faire la même chose avec marqueurs

EDIT: Dans les dernières versions , il existe toujours les mêmes styles, mais vous pouvez faire varier l’espace entre les points/lignes.

80
Cédric Julien

plot documentation

http://matplotlib.org/1.5.3/api/pyplot_api.html#matplotlib.pyplot.plot a une liste de styles de ligne + marqueur:

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

Comme cela fait partie de la docstring pyplot.plot, vous pouvez aussi le voir depuis le terminal avec:

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

D'après mon expérience, il est agréable d'avoir les couleurs et les marqueurs dans une liste afin que je puisse les parcourir lors du traçage.

Voici comment j'obtiens la liste de ces choses. Il a fallu creuser.

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

En python3, la méthode .keys() renvoie un objet dict_keys et non une list. Vous devez transmettre les résultats à list() pour pouvoir indexer le tableau comme vous le pouviez dans python2. par exemple. cette SO question

Vous pouvez donc utiliser quelque chose comme: pour créer des tableaux itératifs de lignes, de couleurs et de marqueurs.

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

Vous pouvez copier le dictionnaire à partir de l'exemple de style de ligne :

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

Vous pouvez ensuite parcourir les styles de lignes

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

Ou vous venez de prendre un style de ligne unique de ceux-ci,

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