matplotlib中的锯齿形或波浪线

时间:2015-11-14 09:57:23

标签: python matplotlib

有没有简单的方法在matplotlib中绘制曲折或波浪线?

我知道不同的线条样式(http://matplotlib.org/examples/lines_bars_and_markers/line_styles_reference.html),我当然知道不是绘图

plt.figure(); plt.plot(n.linspace(0.7,1.42,100),[0.7]*100)

我可以绘制

plt.figure(); plt.plot(n.linspace(0.7,1.42,100),[0.69,0.71]*50)

对于曲折线,但我想知道是否有更简单的方法?

1 个答案:

答案 0 :(得分:4)

是的,但它有一点点后果。最简单的方法是在matplotlib中使用xkcd模式。

import numpy as np
import matplotlib.pyplot as plt

plt.xkcd()
plt.figure()
plt.plot(np.linspace(0.7,1.42,100),[0.7]*100)
plt.show()

其中包含以下内容: enter image description here

如果您查看code used to achieve this,您会发现xkcd函数对rcParams字典进行了一些更改。最值得注意的是条目rcParams['path.sketch'] = (scale, length, randomness)path effect,能够模拟手绘外观。 xkcd样式使用的默认参数是:

# explanation from the docstring of the xkcd function
scale = 1  # amplitude of the wiggle
length = 100  # length of the wiggle along the line
randomness = 2  # scale factor for shrinking and expanding the length

如果您从rcParams包中导入条目,则可以更改matplotlib字典中的条目。在以下示例中,我将randomness值从2增加到100

import numpy as np
import matplotlib.pyplot as plt
from matplotlib import rcParams

rcParams['path.sketch'] = (1, 100, 100)
plt.plot(np.linspace(0.7,1.42,100),[0.7]*100)
plt.show()

这将导致以下情节:

enter image description here

正如您所看到的,更多的摇晃和用于刻度的字体仍然是正常的'。然而,风格也用于绘制轴,到目前为止我还没有找到解决方法。 有两种解决方法:

  1. 没有绘制边框/刺的工作。
  2. 独立绘制刺和线(很难和自动化)。
  3. 浏览matplotlib和路径样式的文档,找出是否有办法仅为绘制的线条子集设置路径样式。
  4. 选项1可以这样实现:

    import numpy as np
    import matplotlib.pyplot as plt
    from matplotlib import rcParams
    
    rcParams['path.sketch'] = (10, 10, 100)
    fig = plt.plot(np.linspace(0.7,1.42,100),[0.7]*100)
    
    for pos, spine in fig[0].axes.spines.items():
        spine.set_visible(False)
    plt.show()
    

    enter image description here

    其中,在我看来看起来还不错。无论如何,地块周围的边界都被高估了。

    编辑:减少混乱

    要获得均匀波浪线,请将randomness参数设置为1并选择幅度和长度的小值:

    import numpy as np
    import matplotlib.pyplot as plt
    from matplotlib import rcParams
    
    rcParams['path.sketch'] = (3, 10, 1)
    fig = plt.plot(np.linspace(0.7,1.42,100),[0.7]*100)
    
    for pos, spine in fig[0].axes.spines.items():
        spine.set_visible(False)
    plt.show()
    

    enter image description here

    奖金图片:更多混乱

    rcParams['path.sketch'] = (100, 1, 100)
    

    enter image description here