matplotlib中的锯齿形或波浪线

mzz*_*zzx 8 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)
Run Code Online (Sandbox Code Playgroud)

我可以策划

plt.figure(); plt.plot(n.linspace(0.7,1.42,100),[0.69,0.71]*50)
Run Code Online (Sandbox Code Playgroud)

对于一个曲折线,但我想知道是否有一个更直接的方式?

m00*_*0am 7

是的,但它带来了一点影响。最简单的方法是在 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()
Run Code Online (Sandbox Code Playgroud)

这为您提供了以下内容: 在此处输入图片说明

如果您查看用于实现此目的代码,您会发现该xkcd函数对rcParams字典进行了一些更改。最值得注意的是入口rcParams['path.sketch'] = (scale, length, randomness),这是一种能够模拟手绘外观的路径效果。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
Run Code Online (Sandbox Code Playgroud)

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()
Run Code Online (Sandbox Code Playgroud)

这将导致以下情节:

在此处输入图片说明

如您所见,更多的抖动和用于刻度线的字体仍然“正常”。但是,该样式也用于绘制轴,到目前为止我还没有找到解决方法。两种解决方法可能是:

  1. 无需绘制边框/刺即可工作。
  2. 独立绘制脊椎和线条(自动化很难且烦人)。
  3. 仔细阅读 matplotlib 和路径样式的文档,看看是否有办法仅为绘制的线的子集设置路径样式。

选项 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()
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

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

编辑:减少混乱

要获得均匀波浪线,请将随机性参数设置为 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()
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

奖励图片:更多混乱

rcParams['path.sketch'] = (100, 1, 100)
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明