Setzen Sie in Matplotlib Markierungen für einzelne Punkte auf einer Linie

174

Ich habe Matplotlib verwendet, um Linien auf einer Figur zu zeichnen. Jetzt möchte ich den Stil, insbesondere die Markierung, für einzelne Punkte auf der Linie festlegen. Wie mache ich das?

Um meine Frage zu klären, möchte ich den Stil für einzelne Markierungen in einer Zeile festlegen können, nicht für jede Markierung in dieser Zeile.

dbmikus
quelle
2
Verwandte Lösung für Bogenlängenmarkierungsabstand: stackoverflow.com/questions/17406758/…
Ioannis Filippidis

Antworten:

323

Geben Sie das Schlüsselwort args linestyleund / oder markerin Ihrem Aufruf an an plot.

Verwenden Sie beispielsweise eine gestrichelte Linie und blaue Kreismarkierungen:

plt.plot(range(10), linestyle='--', marker='o', color='b')

Ein Shortcut-Aufruf für dasselbe:

plt.plot(range(10), '--bo')

Beispiel 1

Hier ist eine Liste der möglichen Linien- und Markierungsstile:

================    ===============================
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
================    ===============================

Bearbeiten: mit einem Beispiel zum Markieren einer beliebigen Teilmenge von Punkten, wie in den Kommentaren gefordert:

import numpy as np
import matplotlib.pyplot as plt

xs = np.linspace(-np.pi, np.pi, 30)
ys = np.sin(xs)
markers_on = [12, 17, 18, 19]
plt.plot(xs, ys, '-gD', markevery=markers_on)
plt.show()

Beispiel2

Dieses letzte Beispiel mit dem markeverykwarg ist seit 1.4+ möglich, da dieser Feature-Zweig zusammengeführt wird . Wenn Sie auf einer älteren Version von matplotlib stecken bleiben, können Sie das Ergebnis dennoch erzielen, indem Sie ein Streudiagramm über das Liniendiagramm legen. Weitere Informationen finden Sie im Bearbeitungsverlauf .

wim
quelle
2
Ich kenne diesen Teil. Ich möchte nur bestimmte Punkte markieren. Wie würde ich in Ihrem Beispiel beispielsweise nur den 2. und 3. Punkt markieren? Entschuldigung, wenn meine Frage zu diesem Aspekt nicht klar genug war.
Dbmikus
4
Sie können Plot einmal mit dem Stil '-' aufrufen und dann Plot auf einer Teilmenge der Punkte erneut mit dem Stil 'o' aufrufen.
wim
Würde ich nur die Werte durchlaufen, die ich für das Plotten angegeben habe, und einfach ein getrenntes Punkt-Unterplot mit Markierungen erstellen? Und dann würden sie über der vorherigen Zeile platziert? Oder gibt es einen saubereren Weg, dies zu tun? Mir geht es gut so, aber ich würde es gerne auf die akzeptabelste Weise codieren.
Dbmikus
1
Nein, benutze keine Schleife, das sind zu viele Künstler auf der Leinwand, die sehr langsam sein können. Verwenden Sie einen Ausschnitt der ursprünglichen Eingabe.
wim
@AbidRahmanK Sie können auch alle verfügbaren Marker über anzeigen matplotlib.markers.MarkerStyle.markers, wodurch ein Wörterbuch zurückgegeben wird, das dem oben angegebenen ähnlich ist.
joelostblom
53

Es gibt ein Bild, das den Namen und die Beschreibung aller Marker zeigt. Ich hoffe, es wird Ihnen helfen.

import matplotlib.pylab as plt
markers=['.',',','o','v','^','<','>','1','2','3','4','8','s','p','P','*','h','H','+','x','X','D','d','|','_']
descriptions=['point', 'pixel', 'circle', 'triangle_down', 'triangle_up','triangle_left', 'triangle_right', 'tri_down', 'tri_up', 'tri_left','tri_right', 'octagon', 'square', 'pentagon', 'plus (filled)','star', 'hexagon1', 'hexagon2', 'plus', 'x', 'x (filled)','diamond', 'thin_diamond', 'vline', 'hline']
x=[]
y=[]
for i in range(5):
    for j in range(5):
        x.append(i)
        y.append(j)
plt.figure()
for i,j,m,l in zip(x,y,markers,descriptions):
    plt.scatter(i,j,marker=m)
    plt.text(i-0.15,j+0.15,s=m+' : '+l)
plt.axis([-0.1,4.8,-0.1,4.5])
plt.tight_layout()
plt.axis('off')
plt.show()  

Beispiel 1

Wubin Ding
quelle
14

Zum späteren Nachschlagen - der von zurückgegebene Line2DKünstler plot()verfügt auch über eine set_markevery()Methode, mit der Sie nur Markierungen für bestimmte Punkte setzen können - siehe https://matplotlib.org/api/_as_gen/matplotlib.lines.Line2D.html#matplotlib.lines.Line2D. set_markevery

hat verloren
quelle
2
Richtig, aber nicht in willkürlichen Punkten - es muss Start: Stopp: Schritt Art von Teilmengen sein, denke ich ..
wim
Mein Eindruck ist, dass beide oben genannten Beiträge die Frage beantworten. Der Grund ist, dass sie zwei verschiedene Probleme ansprechen. Der Begriff "Marker" bezieht sich normalerweise auf den Stil einer Kurve. Es wird also eine reguläre Regel (z. B. alle 10) impliziert. Wenn Sie eine "beliebige" Teilmenge von Punkten herausgreifen möchten, betrachten Sie dies bitte als separate Kurve, nicht als Markierungen auf der Originalkurve. Es ist nur eine andere Kurve, die zufällig Markierungen hat. Es wird also erwartet, dass Sie die Punkte manuell auswählen müssen. Dieses Thema ist interessant und geht tiefer, wird in einem zukünftigen Beitrag mehr kommentieren, nachdem relevanter Code veröffentlicht wurde.
Ioannis Filippidis
1
@wim Es gibt eine PR, die es hoffentlich in 1.4
schafft
1

Ein einfacher Trick zum Ändern einer bestimmten Punktmarkierungsform, -größe ... besteht darin, sie zuerst mit allen anderen Daten zu zeichnen und dann nur mit diesem Punkt ein weiteres Diagramm zu zeichnen (oder eine Reihe von Punkten, wenn Sie den Stil mehrerer Punkte ändern möchten). . Angenommen, wir möchten die Markierungsform des zweiten Punkts ändern:

x = [1,2,3,4,5]
y = [2,1,3,6,7]

plt.plot(x, y, "-o")
x0 = [2]
y0 = [1]
plt.plot(x0, y0, "s")

plt.show()

Ergebnis ist: Plotten mit mehreren Markern

Pankaj Joshi
quelle