Kann ich in matplotlib durch Linienstile blättern?

73

Ich weiß, wie man eine Liste von Farben in matplotlib durchläuft. Aber ist es möglich, mit Linienstilen (einfach, gepunktet, gestrichelt usw.) etwas Ähnliches zu tun? Ich müsste das tun, damit meine Grafiken beim Drucken leichter zu lesen sind. Irgendwelche Vorschläge, wie das geht?

Charles Brunet
quelle

Antworten:

105

So etwas könnte den Trick machen:

import matplotlib.pyplot as plt
from itertools import cycle
lines = ["-","--","-.",":"]
linecycler = cycle(lines)
plt.figure()
for i in range(10):
    x = range(i,i+10)
    plt.plot(range(10),x,next(linecycler))
plt.show()

Ergebnis: Geben Sie hier die Bildbeschreibung ein

Für neuere Version bearbeiten (v2.22)

import matplotlib.pyplot as plt
from cycler import cycler
#
plt.figure()
for i in range(5):
    x = range(i,i+5)
    linestyle_cycler = cycler('linestyle',['-','--',':','-.'])
    plt.rc('axes', prop_cycle=linestyle_cycler)
    plt.plot(range(5),x)
    plt.legend(['first','second','third','fourth','fifth'], loc='upper left', fancybox=True, shadow=True)
plt.show()

Weitere Informationen finden Sie im matplotlib-Tutorial zum Thema "Styling mit Cycler".
Um die Ausgabe anzuzeigen, klicken Sie auf " Abbildung anzeigen ".

Avaris
quelle
Ist das für eine nicht triviale Farblinienkombination möglich? lines["r:","k.","y-."]funktioniert aber lines["r:","#aaaaaa.","y-."]nicht
Louis Cypher
2
@louiscypher: Das liegt daran, dass #aaaaaa.es sich nicht um eine gültige Formatzeichenfolge handelt. Wenn Sie Hex - Farben wie das brauchen, schlage ich sie als separate [("r", ":"),("#aaaaaa","."),("y","-.")], Auspacken Gebrauch , um sie color, lineformat = next(linecycler)und die Verwendung colorStichwort Farbe zur Verfügung zu stellen:plt.plot(x, y, lineformat, color=color)
Avaris
Danke, ich habe es schon so benutzt. Aber da ich den Cycler in jeder Handlung benutze, wollte ich die Dinge einfach halten (nur ein Argument). Ich denke, ich sollte versuchen, ein Touple im Cycler zu verwenden.
Louis Cypher
6
@louiscypher: Eine andere Möglichkeit ist die Verwendung von a dict. Das macht es zu einer einzigen Zeile. styles = [{'color':'r', 'ls':'--', 'marker':'o'}, ...]Dann machen Sie einen Cycler daraus und Sie werden es tun können plot(x, y, **next(cycler)).
Avaris
Das klingt gut. Ich habe das schon versucht, aber ich habe die**
Louis Cypher
25

Die kommende matplotlib v1.5 wird color_cycle für die neue prop_cycler-Funktion ablehnen: http://matplotlib.org/devdocs/users/whats_new.html?highlight=prop_cycle#added-axes-prop-cycle-key-to-rcparams

plt.rcParams['axes.prop_cycle'] = ("cycler('color', 'rgb') +" "cycler('lw', [1, 2, 3])") Dann erstellen Sie Ihre Achsen und Diagramme!

Ben Root
quelle
Beachten Sie, dass dies plt.errorbar()aufgrund eines Fehlers nicht funktioniert . github.com/matplotlib/matplotlib/issues/7074 . Bei Verwendung von Errobar wird die Antwort von Avaris weiterhin benötigt. Ansonsten ist dies wahrscheinlich sauberer.
EL_DON
10

Wenn die Änderung automatisch erfolgen soll, können Sie diese beiden Zeilen in die Datei axes.py von matplotlib einfügen: Suchen Sie nach dieser Zeile:

   self.color_cycle = itertools.cycle(clist)

und fügen Sie die folgende Zeile darunter hinzu:

   self.line_cycle = itertools.cycle(["-",":","--","-.",])

Und suchen Sie nach der Linie:

   kw['color'] = self.color_cycle.next()

und fügen Sie die Zeile hinzu:

   kw['linestyle'] = self.line_cycle.next()

Ich denke, Sie können das gleiche für Marker tun.

JMA
quelle
5
Ich finde es seltsam, dass solche "niedrig hängenden Früchte" nicht in der Bibliothek implementiert sind ... Gibt es einen bestimmten Grund?
Herrfz
Ich habe vor ein paar Jahren tatsächlich mit einer solchen Implementierung begonnen, mich aber dagegen entschieden, weil sie unter der Haube sehr kompliziert und chaotisch wurde. Warum dort aufhören, warum nicht auch marker_cycle einschließen? hatch_cycle? etc ...
Ben Root
9

Hier sind einige Beispiele für die Verwendung der Radfahrer zur Entwicklung von Stilen

Cycler können hinzugefügt werden, um Zusammensetzungen zu ergeben (rot mit '-', blau mit '-', ...)

plt.rc('axes', prop_cycle=(cycler('color', list('rbgk')) +
                           cycler('linestyle', ['-', '--', ':', '-.'])))

direkter Einsatz auf Achsen:

ax1.set_prop_cycle(cycler('color', ['c', 'm', 'y', 'k']) +
                   cycler('lw', [1, 2, 3, 4]))

Radfahrer können multipliziert werden ( http://matplotlib.org/cycler/ ), um eine größere Auswahl an einzigartigen Stilen zu erhalten

for ax in axarr:
    ax.set_prop_cycle(cycler('color', list('rbgykcm')) *
                      cycler('linestyle', ['-', '--']))

Siehe auch: http://matplotlib.org/examples/color/color_cycle_demo.html

Ziggy Eunicien
quelle
4

Normalerweise verwende ich eine Kombination aus Grundfarben und Linienstilen, um verschiedene Datensätze darzustellen. Angenommen, wir haben 16 Datensätze, von denen jeder vier zu einer Gruppe gehört (einige Eigenschaften gemeinsam haben). Dann ist es einfach zu visualisieren, wenn wir jede Gruppe mit einer gemeinsamen Farbe darstellen, aber ihre Mitglieder mit unterschiedlichen Linienstilen.

import numpy as np
import matplotlib.pyplot as plt

models=['00','01', '02', '03', '04', '05', '06', '07', '08', '09', '10',\
    '11', '12', '13', '14', '15', '16']

fig = plt.figure()
ax  = fig.add_subplot(111)

x = np.linspace(-1,1,100)
y = np.sin(x)

clrs_list=['k','b','g','r'] # list of basic colors
styl_list=['-','--','-.',':'] # list of basic linestyles

for i in range(0,16):
    clrr=clrs_list[i // 4]
    styl=styl_list[i % 4]
    modl=models[i+1]
    frac=(i+1)/10.0
    ax.plot(x,y+frac,label=modl,color=clrr,ls=styl)

plt.legend()
plt.show()

Geben Sie hier die Bildbeschreibung ein

srinivasu u
quelle
3

Ich verwende ähnlichen Code, um durch verschiedene Linienstile zu blättern. Standardmäßig wiederholen sich die Farben nach 7 Plots.

idx = 0
for ds in datasets:
    if idx < 7:
        plot(ds)
    elif idx < 14:
        plot(ds, linestyle='--')
    else:
        plot(ds, linestyle=':')
    idx += 1
ebo
quelle
1

Ähnlich wie Avaris-Grafiken, aber unterschiedlich ....

import matplotlib.pyplot as plt
import numpy as np

#set linestyles (for-loop method)
colors=('k','y','m','c','b','g','r','#aaaaaa')
linestyles=('-','--','-.',':')
styles=[(color,linestyle) for linestyle in linestyles for color in colors]

#-- sample data
numLines=30
dataXaxis=np.arange(0,10)
dataYaxis=dataXaxis+np.array([np.arange(numLines)]).T


plt.figure(1)

#-----------
# -- array oriented method but I cannot set the line color and styles
# -- without changing Matplotlib code
plt.plot(datax[:,np.newaxis],datay.T)
plt.title('Default linestyles - array oriented programming')
#-----------

#-----------
# -- 'for loop' based approach to enable colors and linestyles to be specified

plt.figure(2)

for num in range(datay.sh![enter image description here][1]ape[0]):
    plt.plot(datax,datay[num,:],color=styles[num][0],ls=styles[num][1])
plt.title('User defined linestyles using for-loop programming')
#-----------

plt.show()
DougR
quelle