Установить маркеры для отдельных точек на линии в Matplotlib

174

Я использовал Matplotlib для построения линий на фигуре. Теперь я хотел бы установить стиль, в частности маркер, для отдельных точек на линии. Как мне это сделать?

Чтобы прояснить мой вопрос, я хочу иметь возможность установить стиль для отдельных маркеров на линии, а не на каждый маркер на указанной линии.

dbmikus
источник
2
Связанное решение для разметки маркеров длины: stackoverflow.com/questions/17406758/…
Иоаннис Филиппидис

Ответы:

324

Укажите ключевое слово args linestyleи / или markerв своем звонке plot.

Например, используя пунктирную линию и маркеры синего круга:

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

Быстрый вызов для того же:

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

example1

Вот список возможных стилей линий и маркеров:

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

редактировать: с примером маркировки произвольного подмножества точек, как было запрошено в комментариях:

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

Этот последний пример использования markeverykwarg возможен начиная с версии 1.4+, благодаря слиянию этой ветви функций . Если вы застряли на старой версии matplotlib, вы все равно можете добиться результата, наложив график рассеяния на линейный график. Смотрите историю изменений для более подробной информации.

Wim
источник
2
Я знаю эту часть. Что я хочу сделать, это отметить только определенные моменты. Учитывая ваш пример, как бы я поставил маркер только на 2-й и 3-й точках, например? Извините, если мой вопрос не был достаточно ясен по этому аспекту.
dbmikus
4
Вы можете вызывать plot один раз в стиле '-', а затем вы можете вызывать plot снова в подмножестве точек со стилем 'o'.
Вим
Буду ли я просто перебирать значения, которые я предоставляю для построения графика, и создавать подпункт с отключенными точками с маркерами? И тогда они будут помещены поверх предыдущей строки? Или есть более чистый способ сделать это? Я хорошо делаю это таким образом, но я бы хотел написать наиболее приемлемый способ.
dbmikus
1
Нет, не используйте цикл, это будет слишком много художников на холсте, что может быть очень медленным. Используйте фрагмент исходного ввода.
Вим
@AbidRahmanK Вы также можете просмотреть все доступные маркеры через matplotlib.markers.MarkerStyle.markers, который возвращает словарь, аналогичный тому, который был опубликован выше.
Джоелостблом
55

Есть картинка, показывающая название и описание всех маркеров, надеюсь, она вам поможет.

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

Wubin Ding
источник
14

Для дальнейшего использования - у Line2Dхудожника, возвращаемого plot()также, есть set_markevery()метод, который позволяет вам устанавливать маркеры только в определенных точках - см. Https://matplotlib.org/api/_as_gen/matplotlib.lines.Line2D.html#matplotlib.lines.Line2D. set_markevery

потерянный
источник
2
Правда, но не в произвольных точках - это должно быть начало: стоп: шаг вроде подмножеств, я думаю ..
Вим
У меня сложилось впечатление, что оба вышеупомянутых поста отвечают на вопрос. Причина в том, что они решают две разные проблемы. Термин «маркеры» обычно относится к стилю кривой. Таким образом, подразумевается обычное правило (например, каждые 10). Если вы хотите выделить какое-то «произвольное» подмножество точек, пожалуйста, рассмотрите это как отдельную кривую, а не как маркеры на исходной кривой. Это просто другая кривая с маркерами. Таким образом, вы должны вручную выбрать точки. Эта тема интересна и идет глубже, более подробно прокомментирую в будущем посте, после выпуска соответствующего кода.
Иоаннис Филиппидис
1
@wim Существует PR, который, как мы надеемся, превратится в 1.4, который позволит вам отмечать произвольные точки github.com/matplotlib/matplotlib/pull/2662
tacaswell
1

Простой способ изменить конкретную форму маркера точки, ее размер ... состоит в том, чтобы сначала построить ее со всеми другими данными, а затем построить еще один график только с этой точкой (или набором точек, если вы хотите изменить стиль нескольких точек). , Предположим, мы хотим изменить форму маркера второй точки:

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

Результат: участок с несколькими маркерами

Панкадж Джоши
источник