Встановіть маркери для окремих точок на лінії в Matplotlib


174

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

Щоб уточнити своє запитання, я хочу мати можливість встановлювати стиль для окремих маркерів на лінії, а не на кожному маркері на зазначеній лінії.


2
Пов'язані рішення для інтервалу довжиною дуги маркерів: stackoverflow.com/questions/17406758 / ...
Іоанніс Filippidis

Відповіді:


324

Вкажіть аргументи ключових слів linestyleта / або markerу своєму дзвінку до plot.

Наприклад, за допомогою пунктирної лінії та синіх кіл маркерів:

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

Заклик ярлика для того ж самого:

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

приклад1

Ось список можливих стилів рядка та маркера:

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

приклад2

Останній приклад використання markeverykwarg можливий з 1.4+, завдяки об'єднанню цієї функції . Якщо ви застрягли на більш старій версії matplotlib, ви все одно можете досягти результату, наклавши на схему лінії розсип. Докладніше див. В історії редагування .


2
Я знаю цю частину. Те, що я хочу зробити, це позначити лише певні моменти. Зважаючи на ваш приклад, як я можу поставити маркер лише на 2-й та 3-й точки, наприклад? Вибачте, якщо моє запитання було недостатньо зрозумілим щодо цього аспекту.
dbmikus

4
Ви можете зателефонувати сюжету один раз зі стилем '-', а потім ви зможете викликати сюжет ще раз, на підмножині точок, зі стилем 'o'.
Вім

Чи просто би я переглянув значення, які я подав для побудови графіку, і просто зробив би відключену підточку з маркерами? І тоді вони будуть розміщені поверх попереднього рядка? Або є чистіший спосіб зробити це? Я прекрасно роблю це саме так, але хотілося б зафіксувати це найбільш прийнятним чином.
dbmikus

1
Ні, не використовуйте цикл, що на полотні буде занадто багато художників, які можуть бути дуже повільними. Використовуйте фрагмент вихідного вводу.
wim

@AbidRahmanK Ви також можете переглянути всі доступні маркери через matplotlib.markers.MarkerStyle.markers, що повертає словник, аналогічний тому, що відмітка розміщена вище.
joelostblom

54

Є зображення, яке показує назву та опис усіх маркерів, я сподіваюся, що вам це допоможе.

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

приклад1


14

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


2
Щоправда, але не на довільних пунктах - це потрібно почати: stop: step sort підмножини, я думаю ..
wim

Моє враження, що обидва вищезазначені публікації відповідають на питання. Причина полягає в тому, що вони стосуються двох різних питань. Термін "маркери" зазвичай відноситься до стилю кривої. Отже, мається на увазі звичайне правило (наприклад, кожні 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()

Результат: Ділянка з декількома маркерами

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.