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?
python
matplotlib
Charles Brunet
quelle
quelle
Antworten:
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:
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 ".
quelle
lines["r:","k.","y-."]
funktioniert aberlines["r:","#aaaaaa.","y-."]
nicht#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 siecolor, lineformat = next(linecycler)
und die Verwendungcolor
Stichwort Farbe zur Verfügung zu stellen:plt.plot(x, y, lineformat, color=color)
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önnenplot(x, y, **next(cycler))
.**
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!quelle
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.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:
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.
quelle
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
quelle
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()
quelle
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
quelle
Ä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()
quelle