Tetapkan penanda untuk masing-masing poin pada sebuah baris di Matplotlib

174

Saya telah menggunakan Matplotlib untuk menggambar garis pada gambar. Sekarang saya ingin mengatur gaya, khususnya penanda, untuk setiap poin di telepon. Bagaimana saya melakukan ini?

Untuk memperjelas pertanyaan saya, saya ingin dapat mengatur gaya untuk masing-masing penanda pada suatu garis, tidak setiap penanda pada garis tersebut.

dbmikus
sumber
2
Solusi terkait untuk penspasian spasi arclength: stackoverflow.com/questions/17406758/…
Ioannis Filippidis

Jawaban:

324

Tentukan argumen kata kunci linestyledan / atau markerdalam panggilan Anda untuk plot.

Misalnya, menggunakan garis putus-putus dan penanda lingkaran biru:

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

Panggilan pintas untuk hal yang sama:

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

Contoh 1

Berikut adalah daftar kemungkinan gaya garis dan marker:

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

sunting: dengan contoh menandai subset poin yang berubah-ubah, seperti yang diminta dalam komentar:

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

contoh2

Contoh terakhir ini menggunakan markeverykwarg dimungkinkan sejak 1.4+, karena penggabungan cabang fitur ini . Jika Anda terjebak pada versi matplotlib yang lebih lama, Anda masih bisa mencapai hasilnya dengan menumpangkan sebar sebaran di plot garis. Lihat riwayat edit untuk detail lebih lanjut.

wim
sumber
2
Saya tahu bagian itu. Yang ingin saya lakukan adalah menandai hanya poin-poin tertentu. Diberikan contoh Anda, bagaimana saya menempatkan penanda hanya pada poin ke-2 dan ke-3, misalnya? Maaf jika pertanyaan saya tidak cukup jelas tentang aspek ini.
dbmikus
4
Anda bisa memanggil plot sekali dengan gaya '-', dan kemudian Anda bisa memanggil plot lagi, pada subset poin, dengan gaya 'o'.
wim
Apakah saya hanya mengulangi nilai-nilai yang saya berikan untuk plot dan hanya membuat subplot dot terputus dengan spidol? Dan kemudian mereka akan ditempatkan di atas garis sebelumnya? Atau ada cara yang lebih bersih untuk melakukannya? Saya baik-baik saja melakukannya dengan cara itu, tetapi saya ingin mengkodekannya dengan cara yang paling dapat diterima.
dbmikus
1
Tidak, jangan gunakan loop, itu akan terlalu banyak artis di atas kanvas yang bisa sangat lambat. Gunakan sepotong input asli.
wim
@AbidRahmanK Anda juga dapat melihat semua penanda yang tersedia melalui matplotlib.markers.MarkerStyle.markers, yang mengembalikan kamus mirip dengan apa yang diposting di atas.
joelostblom
54

Ada gambar yang menunjukkan nama dan deskripsi semua spidol, saya harap ini akan membantu Anda.

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

Contoh 1

Wubin Ding
sumber
14

Untuk referensi di masa mendatang - Line2Dartis yang dikembalikan oleh plot()juga memiliki set_markevery()metode yang memungkinkan Anda untuk hanya menetapkan penanda pada titik-titik tertentu - lihat https://matplotlib.org/api/_as_gen/matplotlib.lines.Line2D.html#matplotlib.lines.Line2D. set_markevery

kalah
sumber
2
Benar, tetapi tidak pada poin yang sewenang-wenang - harus dimulai: berhenti: langkah semacam himpunan bagian saya pikir ..
wim
Kesan saya adalah bahwa kedua posting di atas menjawab pertanyaan. Alasannya adalah bahwa mereka menangani dua masalah yang berbeda. Istilah "penanda" biasanya mengacu pada gaya kurva. Jadi aturan reguler (misalnya setiap 10) tersirat. Jika Anda ingin memilih beberapa subset poin "sewenang-wenang", harap pertimbangkan itu sebagai kurva terpisah, bukan sebagai penanda pada kurva asli. Hanya saja kurva berbeda yang kebetulan memiliki spidol. Jadi Anda diharapkan harus memilih titik secara manual. Subjek ini menarik dan masuk lebih dalam, akan berkomentar lebih banyak di posting mendatang, setelah merilis kode yang relevan.
Ioannis Filippidis
1
@wim Ada PR yang mudah-mudahan akan menjadi 1.4 yang akan memungkinkan Anda menandai titik sewenang-wenang github.com/matplotlib/matplotlib/pull/2662
tacaswell
1

Trik sederhana untuk mengubah bentuk penanda titik, ukuran ... adalah dengan terlebih dahulu memplotnya dengan semua data lainnya, lalu plot satu plot lagi hanya dengan titik itu (atau kumpulan poin jika Anda ingin mengubah gaya beberapa titik) . Misalkan kita ingin mengubah bentuk marker dari titik kedua:

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

Hasilnya adalah: Plot dengan banyak spidol

Pankaj Joshi
sumber