2013-07-01 10 views
5

मैं कुछ प्रयोगात्मक डेटा का एक ग्राफ प्लॉट करना चाहता हूं जो अपेक्षाकृत उच्च दर पर नमूना है, लेकिन दिखाए गए बराबर चाप-लंबाई अंतराल पर स्थित मार्करों का उपयोग करके एक चिकनी वक्र का अनुमान लगाता है नीचे ग्राफ में:समकक्ष (आर्क-लम्बाई) मार्करों के साथ एक वक्र प्लॉटिंग

Graph with equal arc-length markers

मैं markevery तर्क साजिश के बारे में पता है, लेकिन वह गुच्छा अप साजिश के अधिकार के लिए मार्कर होगा और शायद बाईं तरफ काफी कुछ मार्कर की है। समाधान एक्स और वाई अक्षों पर तराजू से स्वतंत्र होना चाहिए। मैं अतिरिक्त मॉड्यूल स्थापित करने के लिए खुला हूं, लेकिन यह एक अजगर + matplotlib समाधान होना चाहिए।

+0

आप इस वक्र/समारोह के बीजीय फार्मूला है? मुझे लगता है कि इसकी आवश्यकता है ताकि आप अपने डेरिवेटिव्स का उपयोग आर्क-लम्बाई (संभावित रूप से एक पुनरावर्तक समाधान के साथ) की गणना करने के लिए कर सकते हैं – heltonbiker

+0

नहीं, जैसा कि मैंने बताया है, वक्र एक प्रयोग का परिणाम है। व्युत्पन्न के संख्यात्मक अनुमान ठीक होना चाहिए, हालांकि, माप पर थोड़ा शोर है, लेकिन मैं इसे आसानी से सुलझ सकता हूं। – chthonicdaemon

उत्तर

1

matplotlib 1.4 के बाद से, आप इस लक्ष्य को हासिल करने के लिए वास्तविक संख्या के साथ markevery उपयोग कर सकते हैं।

प्रलेखन: http://matplotlib.org/api/lines_api.html#matplotlib.lines.Line2D.set_markevery

उदाहरण:

import numpy as np 
import matplotlib.pyplot as plt 

x = np.linspace(0, 10*np.pi, 1000) 
y = np.sin(x*2) + np.sin(x + 1) 

plt.plot(x, y, marker='o', markevery=0.05) 

plt.show() 
2

मुझे लगता है कि मैंने एक अपेक्षाकृत अच्छा समाधान रखा है। एकमात्र समस्या डेटा अनुपात को इस तरह से ध्यान में रख रही है जो अंतिम साजिश के पहलू अनुपात के बारे में जानकारी का भी उपयोग करती है। उपयोग की

def spacedmarks(x, y, Nmarks, data_ratio=None): 
    import scipy.integrate 

    if data_ratio is None: 
     data_ratio = plt.gca().get_data_ratio() 

    dydx = gradient(y, x[1]) 
    dxdx = gradient(x, x[1])*data_ratio 
    arclength = scipy.integrate.cumtrapz(sqrt(dydx**2 + dxdx**2), x, initial=0) 
    marks = linspace(0, max(arclength), Nmarks) 
    markx = interp(marks, arclength, x) 
    marky = interp(markx, x, y) 
    return markx, marky 

उदाहरण (इस IPython में pylab मोड के लिए उपयुक्त है): मैं यह करने के लिए एक विश्वसनीय तरीका है, हालांकि इस समारोह ताकि आप जब तक उत्पादन लग रहा है सही खेल सकते हैं एक डेटा अनुपात को स्वीकार करेंगे नहीं मिला है :

x = linspace(0, 10*pi, 1000) 
y = sin(x*2) + sin(x+1) 

plot(x, y) 
markx, marky = spacedmarks(x, y, 80) 
plot(markx, marky, 'o', color='blue') 

परिणाम:

Sample output showing equally spaced markers

+1

संबंधित 'matplotlib' समस्या वांछित सुविधा के रूप में arclength मार्कर रिक्ति का उल्लेख: https://github.com/matplotlib/matplotlib/issues/346 –

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