Matplotlib में एक लाइन पर अलग-अलग बिंदुओं के लिए मार्कर सेट करें


174

मैंने एक आकृति पर लाइनों को प्लॉट करने के लिए Matplotlib का उपयोग किया है। अब मैं लाइन पर व्यक्तिगत बिंदुओं के लिए शैली, विशेष रूप से मार्कर सेट करना चाहूंगा। मैं यह कैसे करु?

अपने प्रश्न को स्पष्ट करने के लिए, मैं एक लाइन पर अलग-अलग मार्करों के लिए स्टाइल सेट करने में सक्षम होना चाहता हूं, उक्त लाइन पर प्रत्येक मार्कर नहीं।


2
संबंधित समाधान के लिए arclength मार्कर रिक्ति: stackoverflow.com/questions/17406758/…
Ioannis 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()

example2

इस सुविधा शाखाmarkevery के विलय के कारण, 1.4+ के बाद से कावार का उपयोग करने वाला यह अंतिम उदाहरण संभव है । यदि आप matplotlib के पुराने संस्करण पर अटके हुए हैं, तो आप अभी भी लाइन प्लॉट पर स्कैप्लेट को ओवरले करके परिणाम प्राप्त कर सकते हैं। देखें संपादन इतिहास अधिक जानकारी के लिए।


2
मैं उस हिस्से को जानता हूं। मैं जो करना चाहता हूं वह केवल कुछ निश्चित बिंदुओं को चिह्नित करना है। आपके उदाहरण को देखते हुए, मैं उदाहरण के लिए केवल 2 और 3 अंक पर एक मार्कर कैसे डालूंगा? क्षमा करें यदि मेरा प्रश्न इस पहलू पर पर्याप्त स्पष्ट नहीं था।
dbmikus

4
आप शैली '-' के साथ एक बार प्लॉट कह सकते हैं, और फिर आप प्लॉट को फिर से बिंदुओं के सबसेट पर शैली 'ओ' के साथ कॉल कर सकते हैं।
विम

क्या मैं उन मूल्यों पर पुनरावृत्ति करूँगा, जिन्हें मैंने प्लॉट करने के लिए आपूर्ति की थी और बस मार्करों के साथ एक डिस्कनेक्ट किया हुआ डॉट सबप्लॉट बना सकता हूँ? और फिर उन्हें पिछली पंक्ति के शीर्ष पर रखा जाएगा? या वहाँ एक क्लीनर तरीका है? मैं इसे इस तरह से कर रहा हूं, लेकिन मैं इसे सबसे स्वीकार्य तरीका बताना चाहता हूं।
dbmikus

1
नहीं, एक लूप का उपयोग न करें, जो कैनवास पर बहुत सारे कलाकार होंगे जो वास्तव में धीमा हो सकते हैं। मूल इनपुट के एक स्लाइस का उपयोग करें।
विम

@AbidRahmanK आप उन सभी उपलब्ध मार्करों को भी देख सकते हैं matplotlib.markers.MarkerStyle.markers, जो ऊपर पोस्ट किए गए शब्दकोश के समान एक शब्दकोश देता है।
जोएलोस्टब्लोम

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
यह सच है, लेकिन मनमाने ढंग से अंक पर नहीं - इसे शुरू करना होगा: रोकें: मुझे लगता है कि सबसे उप-प्रकार के कदम ..
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()

परिणाम है: कई मार्करों के साथ प्लॉट

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.