2012-10-12 16 views
77

में एक matplotlib साजिश के लिए मनमानी रेखा जोड़ना मैं पाइथन/matplotlib दोनों के लिए नया हूँ और ipython नोटबुक के माध्यम से इसका उपयोग कर रहा हूँ। मैं कुछ एनोटेशन लाइनों को किसी मौजूदा ग्राफ में जोड़ने की कोशिश कर रहा हूं और मैं समझ नहीं सकता कि ग्राफ़ पर लाइनें कैसे प्रस्तुत करें।ipython नोटबुक

import numpy as np 
np.random.seed(5) 
x = arange(1, 101) 
y = 20 + 3 * x + np.random.normal(0, 60, 100) 
p = plot(x, y, "o") 

मैं निम्नलिखित ग्राफ मिलती है:: तो, उदाहरण के लिए, अगर मैं निम्नलिखित प्लॉट करने के लिए ऊपर

beautiful scatter plot

तो मैं कैसे (70,100) से एक खड़ी रेखा जोड़ना होगा (70,250) ? (70,100) से (90,200) तक एक विकर्ण रेखा के बारे में क्या?

मैंने Line2D() के साथ कुछ चीजों की कोशिश की है जिसके परिणामस्वरूप मेरे हिस्से पर भ्रम नहीं है। R में मैं केवल सेगमेंट() फ़ंक्शन का उपयोग करता हूं जो लाइन सेगमेंट जोड़ देगा। क्या matplotlib में समतुल्य है?

उत्तर

131

आप सीधे लाइनों आप चाहते हैं प्लॉट कर सकते हैं से संबंधित डेटा के साथ plot आदेश खिला द्वारा (खंडों की सीमाओं) :

plot([x1, x2], [y1, y2], color='k', linestyle='-', linewidth=2)

अपने उदाहरण से (बेशक आप रंग, रेखा चौड़ाई, रेखा शैली, आदि चुन सकते हैं):

import numpy as np 
import matplotlib.pyplot as plt 

np.random.seed(5) 
x = np.arange(1, 101) 
y = 20 + 3 * x + np.random.normal(0, 60, 100) 
plt.plot(x, y, "o") 


# draw vertical line from (70,100) to (70, 250) 
plt.plot([70, 70], [100, 250], 'k-', lw=2) 

# draw diagonal line from (70, 90) to (90, 200) 
plt.plot([70, 90], [90, 200], 'k-') 

plt.show() 

new chart

+0

उत्कृष्ट और पूर्ण चित्रों के साथ बहुत अच्छा जवाब है! बहुत बहुत शुक्रिया! –

+2

मामूली सुधार, उपरोक्त कोड को 'x = np.arange (1, 101)' पढ़ना चाहिए। –

+0

यह एक रेखा नहीं खींचागा, बल्कि केवल एक सेगमेंट होगा। सवाल दो पंक्तियों को फेंकने वाली रेखा को कैसे आकर्षित करना है, अनुत्तरित नहीं है। – Alexey

30

vlines का उपयोग करना:

import numpy as np 
np.random.seed(5) 
x = arange(1, 101) 
y = 20 + 3 * x + np.random.normal(0, 60, 100) 
p = plot(x, y, "o") 
vlines(70,100,250) 

बुनियादी कॉल हस्ताक्षर कर रहे हैं:

vlines(x, ymin, ymax) 
hlines(y, xmin, xmax) 
+2

यह उत्कृष्ट है। मैंने 'vline()' या 'hline()' फ़ंक्शंस नहीं देखा था। विकर्ण रेखाओं के बारे में क्या? मैंने अब विकर्ण बिट जोड़ने के लिए सवाल संपादित किया है कि आपने मुझे एच एंड वी लाइनों को दिखाया है। –

+0

एक्स, वाई निर्देशांक युक्त 'डेटाफ्रेम' बनाने का प्रयास करें और उन्हें 'शैली =' के-' –

+0

' के साथ साजिश दें, यह बहुत आसान है – Alex

35

यह नए लोगों के लिए भी देर नहीं हुई।

plt.axvline(x, color='r') 

http://matplotlib.org/api/pyplot_api.html#matplotlib.pyplot.axvline

यह ymin और ymax का उपयोग कर, साथ ही y की सीमा लेता है।

+1

अक्षलाइन और axvline के न्यूनतम/अधिकतम पैरामीटर 0 और 1 के बीच स्केलर मान हैं जो साजिश के किनारे के संदर्भ में साजिश रेखाएं हैं। हालांकि एक अच्छा उपकरण, यह शायद एनोटेशन लाइनों को चित्रित करने के लेखक की समस्या कथन का सबसे अच्छा समाधान नहीं है। – binarysubstrate

+1

यह संपूर्ण ग्राफ को पृष्ठभूमि में एक एनोटेशन लाइन जोड़ने के लिए एकदम सही है। यदि मैं एक्स = 1 पर लंबवत रेखा खींचने के लिए ऊपर चुने गए समाधान का उपयोग करता हूं, तो मुझे न्यूनतम और अधिकतम वाई निर्दिष्ट करना होगा, और फिर साजिश स्वचालित रूप से बफर के साथ बदल जाती है, इसलिए रेखा पूरी साजिश में फैली नहीं होती है, और यह एक परेशानी है। यह अधिक सुरुचिपूर्ण है और साजिश का आकार बदलता नहीं है। – Bonnie

1

मैप्लॉब अब ओपी की तलाश में 'एनोटेशन लाइन' की अनुमति देता है। annotate() फ़ंक्शन कनेक्टिंग पथों और हेडलेस और टेलिस तीर के कई रूपों की अनुमति देता है, यानी, एक साधारण रेखा, उनमें से एक है।

ax.annotate("", 
      xy=(0.2, 0.2), xycoords='data', 
      xytext=(0.8, 0.8), textcoords='data', 
      arrowprops=dict(arrowstyle="-", 
         connectionstyle="arc3, rad=0"), 
      ) 

the documentation में यह आप पहली बार तर्क के रूप में एक खाली स्ट्रिंग के साथ ही एक तीर आकर्षित कर सकते हैं कहते हैं।

ओपी के उदाहरण से

:

%matplotlib notebook 
import numpy as np 
import matplotlib.pyplot as plt 

np.random.seed(5) 
x = np.arange(1, 101) 
y = 20 + 3 * x + np.random.normal(0, 60, 100) 
plt.plot(x, y, "o") 


# draw vertical line from (70,100) to (70, 250) 
plt.annotate("", 
       xy=(70, 100), xycoords='data', 
       xytext=(70, 250), textcoords='data', 
       arrowprops=dict(arrowstyle="-", 
           connectionstyle="arc3,rad=0."), 
      ) 

# draw diagonal line from (70, 90) to (90, 200) 
plt.annotate("", 
       xy=(70, 90), xycoords='data', 
       xytext=(90, 200), textcoords='data', 
       arrowprops=dict(arrowstyle="-", 
           connectionstyle="arc3,rad=0."), 
      ) 

plt.show() 

Example inline image

बस के रूप में gcalmettes के जवाब में दृष्टिकोण में, आप रंग, रेखा चौड़ाई, रेखा शैली, आदि का चयन कर सकते ..

यहां कोड के एक हिस्से में बदलाव है जो दो उदाहरण पंक्तियों में से एक को लाल, व्यापक, और 100% अपारदर्शी नहीं बना देगा।

# draw vertical line from (70,100) to (70, 250) 
plt.annotate("", 
       xy=(70, 100), xycoords='data', 
       xytext=(70, 250), textcoords='data', 
       arrowprops=dict(arrowstyle="-", 
           edgecolor = "red", 
           linewidth=5, 
           alpha=0.65, 
           connectionstyle="arc3,rad=0."), 
      ) 

तुम भी connectionstyle का समायोजन करके जोड़ने लाइन के लिए वक्र जोड़ सकते हैं।

संबंधित मुद्दे