matplotlib: markeringen voor afzonderlijke punten op een regel instellen

Ik heb matplotlib gebruikt om lijnen op een figuur te zetten. Nu zou ik nu de stijl, met name de markering, voor individuele punten op de lijn willen instellen. Hoe doe ik dit?

Bewerk: om mijn vraag te verduidelijken, die werd beantwoord, wil ik de stijl kunnen instellen voor individuele markeringen op een regel, niet voor elke markering op die regel.

107
Gerelateerde oplossing voor arctische markeringsafstand: stackoverflow.com/questions/17406758/…
toegevoegd de auteur Ioannis Filippidis, de bron

3 antwoord

Specificeer het trefwoord args linestyle en/of marker in uw aanroep naar plot .

Gebruik bijvoorbeeld een stippellijn en blauwe cirkelmarkeringen:

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

Een snelkoppeling voor hetzelfde:

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

example1

Hier is een lijst van de mogelijke lijn- en markeringsstijlen:

================    ===============================
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: with an example of marking an arbitrary subset of points, as requested in the comments:

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

example2

Dit laatste voorbeeld met de markevery kwarg is mogelijk sinds 1.4+, vanwege de samenvoeging van deze kenmerktak . Als u vastzit aan een oudere versie van matplotlib, kunt u het resultaat nog steeds bereiken door een spreidingsdiagram op de lijnplot te leggen. Zie de bewerkingsgeschiedenis voor meer informatie.

201
toegevoegd
Je zou een keer plot kunnen noemen met de stijl '-', en dan zou je opnieuw plot kunnen noemen, op een subset van de punten, met de stijl 'o'.
toegevoegd de auteur wim, de bron
Nee, gebruik geen lus, dat zijn teveel artiesten op het canvas die erg langzaam kunnen zijn. Gebruik een plak van de originele invoer.
toegevoegd de auteur wim, de bron
Ja, het zou moeten.
toegevoegd de auteur wim, de bron
Ik ken dat deel. Wat ik wil doen is alleen bepaalde punten markeren. Hoe zou ik bijvoorbeeld, gezien uw voorbeeld, een markering op het tweede en derde punt plaatsen? Sorry als mijn vraag niet duidelijk genoeg was over dit aspect.
toegevoegd de auteur dbmikus, de bron
Zou ik alleen de waarden herhalen die ik heb geleverd om te plotten en een ontkoppelde punt subplot maken met markeringen? En dan zouden ze bovenop de vorige regel worden geplaatst? Of is er een schonere manier om het te doen? Ik doe het goed op die manier, maar ik zou het op de meest acceptabele manier willen coderen.
toegevoegd de auteur dbmikus, de bron
+1 voor de lijst met markeringen.
toegevoegd de auteur Abid Rahman K, de bron
@AbidRahmanK U kunt ook alle beschikbare markeringen weergeven via matplotlib.markers.MarkerStyle.markers , die een woordenboek retourneert dat lijkt op wat hierboven is gepost.
toegevoegd de auteur Joel Ostblom, de bron
Wat als de the x-regel een lijst met datums is die wordt gelezen van een bestand met de indeling JJJJMMDD? Hoe kan ik de makers-op-lijst voor dit type gegevens maken?
toegevoegd de auteur weefwefwqg3, de bron
Moet dit werken voor Matplotlib 1.5?
toegevoegd de auteur M-T-A, de bron

Er is een afbeelding van de naam en beschrijving van alle markeringen, ik hoop dat het u zal helpen.

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

example1 Click here to see picture

17
toegevoegd
Dank je! Het is echt nuttig voor mij.
toegevoegd de auteur Minh Nguyen, de bron

For future reference - the Line2D artist returned by plot() also has a set_markevery() method which allows you to only set markers on certain points - see https://matplotlib.org/api/_as_gen/matplotlib.lines.Line2D.html#matplotlib.lines.Line2D.set_markevery

13
toegevoegd
Klopt, maar niet op arbitraire punten - het moet beginnen: stop: stap soort subsets denk ik ..
toegevoegd de auteur wim, de bron
Netjes. Voorbeelden zien er goed uit!
toegevoegd de auteur wim, de bron
@wim Er is een PR die hopelijk 1.4 zal worden, waarmee je willekeurige punten kunt markeren github. com/matplotlib/matplotlib/pull/2662
toegevoegd de auteur tacaswell, de bron
Mijn indruk is dat beide bovenstaande vragen de vraag beantwoorden. De reden is dat ze twee verschillende problemen aanpakken. De term "markeringen" verwijst meestal naar de stijl van een curve. Dus een vaste regel (bijvoorbeeld elke 10) is impliciet. Als u een of andere "willekeurige" subset van punten wilt selecteren, beschouw dat dan als een afzonderlijke curve, niet als markeringen op de oorspronkelijke curve. Het is gewoon een andere curve die toevallig markeringen heeft. Er wordt dus van u verwacht dat u de punten handmatig moet selecteren. Dit onderwerp is interessant en gaat dieper, zal meer commentaar geven in een volgende post, na het vrijgeven van relevante code.
toegevoegd de auteur Ioannis Filippidis, de bron