ตั้งเครื่องหมายสำหรับแต่ละจุดบนบรรทัดใน Matplotlib


174

ฉันใช้ Matplotlib เพื่อพล็อตบรรทัดบนรูป ตอนนี้ฉันต้องการตั้งค่าสไตล์โดยเฉพาะเครื่องหมายสำหรับแต่ละจุดในบรรทัด ฉันจะทำสิ่งนี้ได้อย่างไร

เพื่อชี้แจงคำถามของฉันฉันต้องการที่จะสามารถกำหนดรูปแบบสำหรับเครื่องหมายแต่ละตัวในบรรทัดไม่ใช่ตัวทำเครื่องหมายบนบรรทัดดังกล่าว


2
โซลูชันที่เกี่ยวข้องสำหรับระยะห่างของตัวทำเครื่องหมาย arclength: stackoverflow.com/questions/17406758/…
Ioannis Filippidis

คำตอบ:


324

ระบุ args คำหลักlinestyleและ / หรือในการเรียกร้องให้markerplot

ตัวอย่างเช่นการใช้เส้นประและเครื่องหมายวงกลมสีน้ำเงิน:

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 รุ่นเก่ากว่าคุณยังสามารถบรรลุผลลัพธ์ได้โดยการวางตารางกระจายบนพล็อตบรรทัด ดูประวัติการแก้ไขสำหรับรายละเอียดเพิ่มเติม


2
ฉันรู้ส่วนนั้น สิ่งที่ฉันต้องการทำคือทำเครื่องหมายเฉพาะบางจุด จากตัวอย่างของคุณฉันจะวางเครื่องหมายบนจุดที่ 2 และ 3 ได้อย่างไร ขออภัยถ้าคำถามของฉันยังไม่ชัดเจนเพียงพอ
dbmikus

4
คุณสามารถเรียกพล็อตได้หนึ่งครั้งด้วยสไตล์ '-' จากนั้นคุณสามารถเรียกใช้พล็อตได้อีกครั้งบนส่วนย่อยของคะแนนด้วยสไตล์ 'o'
Wim

ฉันจะทำซ้ำมากกว่าค่าที่ฉันให้กับพล็อตและทำจุดย่อยที่ไม่ได้เชื่อมต่อกับเครื่องหมาย แล้วพวกเขาจะถูกวางไว้ด้านบนของบรรทัดก่อนหน้า? หรือมีวิธีทำความสะอาดหรือไม่ ฉันสบายดีที่ทำแบบนั้น แต่ฉันต้องการรหัสในวิธีที่ยอมรับได้มากที่สุด
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()  

example1


14

สำหรับการอ้างอิงในอนาคต - Line2Dศิลปินที่ส่งคืนโดยplot()มีset_markevery()วิธีการที่อนุญาตให้คุณตั้งเครื่องหมายในบางจุด - ดูhttps://matplotlib.org/api/_as_gen/matplotlib.lines.Line2D.html#matplotlib.lines.Line2D set_markevery


2
จริง แต่ไม่เกี่ยวกับคะแนนโดยพลการ - มันจะต้องเริ่มต้น: หยุด: เรียงลำดับของส่วนย่อยฉันคิดว่า ..
wim

ความประทับใจของฉันคือทั้งสองโพสต์ด้านบนตอบคำถาม เหตุผลก็คือพวกเขาจัดการกับปัญหาที่แตกต่างกันสองประเด็น คำว่า "เครื่องหมาย" มักจะหมายถึงรูปแบบของเส้นโค้ง ดังนั้นกฎทั่วไป (เช่นทุก ๆ 10) จึงเป็นนัย หากคุณต้องการแยกคะแนนย่อยบางส่วนออกโปรดพิจารณาว่าเป็นเส้นโค้งแยกกันไม่ใช่เครื่องหมายบนเส้นโค้งดั้งเดิม มันเป็นเส้นโค้งที่แตกต่างกันซึ่งมีเครื่องหมาย ดังนั้นคุณคาดว่าจะต้องเลือกจุดด้วยตนเอง หัวข้อนี้น่าสนใจและลึกมากขึ้นจะแสดงความคิดเห็นเพิ่มเติมในโพสต์ในอนาคตหลังจากปล่อยรหัสที่เกี่ยวข้อง
Ioannis Filippidis

1
@wim มีการประชาสัมพันธ์ที่หวังว่าจะทำให้มันเป็น 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()

ผลลัพธ์คือ: พล็อตที่มีเครื่องหมายหลายอัน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.