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.


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.


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


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


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

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.