Ustawianie znaczników dla poszczególnych punktów na linii w Matplotlib

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

Aby wyjaśnić moje pytanie, chcę być w stanie ustawić styl dla poszczególnych znaczników na linii, a nie każdy znacznik na tej linii.

Author: Georgy, 2011-12-07

5 answers

Określ słowo kluczowe args linestyle i/lub marker w wywołaniu plot.

Na przykład, używając znaczników linii przerywanej i niebieskiego koła:

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

Skrót wywołujący to samo:

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

przykład1

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

edit: z przykładowym oznaczeniem dowolnego podzbioru punktów, zgodnie z żądaniem 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 przy użyciu markevery kwarg jest możliwy od 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 na wykres punktowy wykres liniowy. Zobacz edytuj historię aby uzyskać więcej szczegółów.

 364
Author: wim,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:10:26

Jest zdjęcie pokazujące nazwę i opis 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ład1

 64
Author: Wubin Ding,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-03-05 08:02:54

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

 15
Author: lost,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-01 14:21:04

Prosta sztuczka, aby zmienić określony kształt, rozmiar znacznika punktowego... najpierw wykreślić go ze wszystkimi innymi danymi, a następnie wykreślić jeszcze jeden Wykres 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 jest: Wykres z wieloma znacznikami

Tutaj wpisz opis obrazka

 2
Author: Pankaj Joshi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2021-02-08 14:57:17

Witam jest przykład:

import numpy as np
import matplotlib.pyplot as ptl

def grafica_seno_coseno():
    x = np.arange(-4,2*np.pi, 0.3)
    y = 2*np.sin(x)
    y2 = 3*np.cos(x)
    ptl.plot(x, y,  '-gD')
    ptl.plot(x, y2, '-rD')
    for xitem,yitem in np.nditer([x,y]):
        etiqueta = "{:.1f}".format(xitem)
        ptl.annotate(etiqueta, (xitem,yitem), textcoords="offset points",xytext=(0,10),ha="center")
    for xitem,y2item in np.nditer([x,y2]):
        etiqueta2 = "{:.1f}".format(xitem)
        ptl.annotate(etiqueta2, (xitem,y2item), textcoords="offset points",xytext=(0,10),ha="center")
    ptl.grid(True)
    return ptl.show()
 0
Author: Ricardo Roa,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2021-01-23 18:35:55