2013-07-01 16 views
5

比較的高い速度でサンプリングされるが、示されているように等しい弧長の間隔でマーカーを使用して滑らかな曲線に近似する実験データのグラフをプロットしたい下のグラフで:等距離の(弧長の)マーカーを使用して曲線をプロットする

Graph with equal arc-length markers

私はプロットするmarkevery引数について知っているが、それはおそらく、プロットの右側にたくさんアップマーカーとは左側にかなりの数のマーカーを持っているでしょう。ソリューションは、x軸とy軸のスケールとは独立している必要があります。私は追加のモジュールをインストールするためにオープンしていますが、python + matplotlibソリューションでなければなりません。

+0

を持っていますか?あなたがその派生物を使って弧長を計算できるようにする必要があると思います(反復的な解法で最も確からしい) – heltonbiker

+0

いいえ、私が述べたように、曲線は実験の結果です。デリバティブの数値近似は大丈夫ですが、測定値にはわずかなノイズがありますが、簡単にそれを平滑化できます。 – chthonicdaemon

答えて

1

、あなたはこれを達成するために実数で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

私は比較的良い解決策をまとめたと思います。唯一の問題は、最終プロットの縦横比に関する情報も使用する方法で、データ比率を考慮に入れることです。 (これはiPythonでpylabモードに適している)使用の

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 

例:あなたは出力が右に見えるまでプレイすることができますので、この機能は、データ比率を受け入れますが、私は、これを行うための信頼性の高い方法を発見していませんでした:

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') 

結果:matplotlibの1.4以来

Sample output showing equally spaced markers

+1

関連する「matplotlib」の問題は、arclengthマーカーの間隔を必要な機能と言います:https://github.com/matplotlib/matplotlib/issues/346 –

関連する問題