绘制具有等距(弧长)标记的曲线

时间:2013-07-01 14:20:32

标签: python matplotlib

我想绘制一些实验数据的图表,这些数据以相对较高的速率采样,但使用间隔相等弧长间隔的标记近似平滑曲线,如下图所示:

Graph with equal arc-length markers

我知道要绘制的markevery参数,但这会将标记聚集在图的右侧,并且左侧可能只有很少的标记。解决方案应独立于x和y轴上的刻度。我愿意安装其他模块,但它应该是python + matplotlib解决方案。

2 个答案:

答案 0 :(得分: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 :(得分:1)

自matplotlib 1.4以来,您可以使用带有实数的市场营销来实现这一目标。

文档: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()