Definir marcadores para pontos individuais em uma linha no Matplotlib

174

Eu usei o Matplotlib para traçar linhas em uma figura. Agora eu gostaria de definir o estilo, especificamente o marcador, para pontos individuais na linha. Como eu faço isso?

Para esclarecer minha pergunta, quero poder definir o estilo de marcadores individuais em uma linha, nem todos os marcadores na linha.

dbmikus
fonte
2
Solução relacionada ao espaçamento entre marcadores de arclength: stackoverflow.com/questions/17406758/…
Ioannis Filippidis

Respostas:

323

Especifique a palavra-chave args linestylee / ou markerna sua chamada para plot.

Por exemplo, usando uma linha tracejada e marcadores de círculo azul:

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

Uma chamada de atalho para a mesma coisa:

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

Exemplo 1

Aqui está uma lista dos possíveis estilos de linha e marcador:

================    ===============================
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: com um exemplo de marcação de um subconjunto arbitrário de pontos, conforme solicitado nos comentários:

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

exemplo2

Este último exemplo usando o markeverykwarg é possível desde 1.4+, devido à mesclagem desse ramo de recurso . Se você estiver preso em uma versão mais antiga do matplotlib, ainda poderá obter o resultado sobrepondo um gráfico de dispersão no gráfico de linhas. Veja o histórico de edições para mais detalhes.

wim
fonte
2
Eu conheço essa parte. O que eu quero fazer é marcar apenas alguns pontos. Dado o seu exemplo, como eu colocaria um marcador apenas no 2º e 3º pontos, por exemplo? Desculpe se minha pergunta não foi clara o suficiente sobre esse aspecto.
precisa saber é o seguinte
4
Você poderia chamar plot uma vez com o estilo '-' e, em seguida, poderia chamar plot novamente, em um subconjunto de pontos, com o estilo 'o'.
Wim
Iria iterar sobre os valores que forneci para plotar e apenas fazer uma subparcela de pontos desconectada com marcadores? E então eles seriam colocados no topo da linha anterior? Ou existe uma maneira mais limpa de fazer isso? Estou bem em fazê-lo dessa maneira, mas gostaria de codificá-lo da maneira mais aceitável.
precisa saber é o seguinte
1
Não, não use um loop, pois haverá muitos artistas na tela que podem ser muito lentos. Use uma fatia da entrada original.
Wim
@AbidRahmanK Você também pode ver todos os marcadores disponíveis via matplotlib.markers.MarkerStyle.markers, que retorna um dicionário semelhante ao que foi publicado acima.
Joelostblom 27/05
53

Há uma imagem mostrando o nome e a descrição de todos os marcadores, espero que ajude você.

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

Exemplo 1

Wubin Ding
fonte
14

Para referência futura - o Line2Dartista retornado por plot()também possui um set_markevery()método que permite definir marcadores em determinados pontos - consulte https://matplotlib.org/api/_as_gen/matplotlib.lines.Line2D.html#matplotlib.lines.Line2D. set_markevery

perdido
fonte
2
É verdade, mas não em pontos arbitrários - que tem de ser iniciado: paragem: passo espécie de subconjuntos eu acho que ..
wim
Minha impressão é que ambas as postagens acima respondem à pergunta. A razão é que eles abordam duas questões diferentes. O termo "marcadores" geralmente se refere ao estilo de uma curva. Portanto, uma regra regular (por exemplo, a cada 10) está implícita. Se você deseja destacar algum subconjunto "arbitrário" de pontos, considere isso como uma curva separada, não como marcadores na curva original. É apenas uma curva diferente que passa a ter marcadores. Portanto, você deverá selecionar manualmente os pontos. Este assunto é interessante e vai mais fundo, comentará mais em uma publicação futura, depois de liberar o código relevante.
Ioannis Filippidis
1
@wim Há um PR que esperamos fazê-lo em 1,4 que lhe permitirá marcar pontos arbitrários github.com/matplotlib/matplotlib/pull/2662
tacaswell
1

Um truque simples para alterar a forma e o tamanho de um marcador de ponto em particular ... é plotá-lo primeiro com todos os outros dados e, em seguida, plotar mais um gráfico apenas com esse ponto (ou conjunto de pontos, se você quiser alterar o estilo de vários pontos) . Suponha que desejemos alterar a forma do marcador do segundo ponto:

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

O resultado é: Gráfico com vários marcadores

Pankaj Joshi
fonte