Ustaw znaczniki dla poszczególnych punktów na linii w Matplotlib

174

Użyłem Matplotlib do rysowania linii na figurze. Teraz chciałbym teraz ustawić styl, a konkretnie znacznik, dla poszczególnych punktów na linii. Jak mam to zrobic?

Aby wyjaśnić moje pytanie, chcę móc ustawić styl dla poszczególnych znaczników na linii, a nie dla każdego znacznika na tej linii.

dbmikus
źródło
2
Powiązane rozwiązanie dla odstępów między znacznikami długości łuku: stackoverflow.com/questions/17406758/ ...
Ioannis Filippidis

Odpowiedzi:

324

Podaj słowo kluczowe args linestylei / lub markerw wywołaniu plot.

Na przykład używając przerywanej linii i niebieskich kółek:

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

Skrót do tego samego:

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

Przykład 1

Oto lista możliwych stylów linii i znaczników:

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

edytuj: z przykładem zaznaczenia dowolnego podzbioru punktów, zgodnie z prośbą w komentarzach:

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

przykład2

Ten ostatni przykład użycia markeverykwarg jest możliwy od wersji 1.4+, ze względu na połączenie tej gałęzi funkcji . Jeśli utkniesz na starszej wersji matplotlib, nadal możesz osiągnąć wynik, nakładając wykres rozrzutu na wykres liniowy. Więcej informacji znajdziesz w historii zmian .

wim
źródło
2
Znam tę część. Chcę zaznaczyć tylko niektóre punkty. Biorąc pod uwagę twój przykład, jak na przykład umieściłbym znacznik tylko na 2 i 3 punkcie? Przepraszam, jeśli moje pytanie nie było wystarczająco jasne w tym aspekcie.
dbmikus
4
Można raz nazwać plot stylem „-”, a następnie ponownie wywołać plot, dla podzbioru punktów, stylem „o”.
wim
Czy po prostu powtórzyłbym wartości, które podałem do wykreślenia i po prostu wykonałbym odłączony wykres kropkowy ze znacznikami? A potem zostałyby umieszczone na górze poprzedniej linii? Czy jest na to czystszy sposób? Robię to dobrze w ten sposób, ale chciałbym to zakodować w najbardziej akceptowalny sposób.
dbmikus
1
Nie, nie używaj pętli, ponieważ na płótnie będzie zbyt wielu artystów, co może być naprawdę powolne. Użyj wycinka oryginalnego wejścia.
wim
@AbidRahmanK Możesz również wyświetlić wszystkie dostępne znaczniki za pośrednictwem matplotlib.markers.MarkerStyle.markers, co zwraca słownik podobny do tego, który opublikował powyżej wim.
joelostblom
54

Jest zdjęcie pokazujące nazwy i opisy wszystkich markerów, mam nadzieję, że ci to pomoże.

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

Przykład 1

Wubin Ding
źródło
14

Na przyszłość - Line2Dpowracający artysta plot()ma również set_markevery()metodę, która pozwala na ustawienie znaczników tylko w określonych punktach - patrz https://matplotlib.org/api/_as_gen/matplotlib.lines.Line2D.html#matplotlib.lines.Line2D. set_markevery

Stracony
źródło
2
To prawda, ale nie w arbitralnych punktach - to musi być początek: stop: krok, tak myślę, rodzaj podzbiorów ...
wim
Mam wrażenie, że oba powyższe posty odpowiadają na to pytanie. Powodem jest to, że dotyczą dwóch różnych kwestii. Termin „markery” zwykle odnosi się do stylu krzywej. Tak więc zakłada się regularną regułę (np. Co 10). Jeśli chcesz wyróżnić jakiś „arbitralny” podzbiór punktów, rozważ to jako oddzielną krzywą, a nie jako znaczniki na pierwotnej krzywej. To po prostu inna krzywa, która tak się składa, że ​​ma znaczniki. Więc oczekuje się, że będziesz musiał ręcznie wybierać punkty. Temat jest ciekawy i się pogłębia, więcej komentuję w przyszłym poście, po udostępnieniu odpowiedniego kodu.
Ioannis Filippidis
1
@wim Istnieje PR, który, miejmy nadzieję, dostanie się do wersji 1.4, który pozwoli ci oznaczyć dowolne punkty github.com/matplotlib/matplotlib/pull/2662
tacaswell
1

Prostą sztuczką do zmiany określonego kształtu, rozmiaru znacznika punktu ... jest najpierw narysowanie go ze wszystkimi innymi danymi, a następnie wykreślenie jeszcze jednego wykresu tylko z tym punktem (lub zestawem punktów, jeśli chcesz zmienić styl wielu punktów) . Załóżmy, że chcemy zmienić kształt znacznika drugiego punktu:

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

Wynik: Działka z wieloma znacznikami

Pankaj Joshi
źródło