首页 > 解决方案 > 如何将 matplotlib LineCollections 与可变线宽连接起来

问题描述

我正在尝试使用 matplotlib按照这个答案的思路做一些事情。这很好用,但是我没有足够的数据,并且希望线宽的变化太大以使其看起来不错。我得到的如下所示,其中没有太多要绘制的值,并且在绘图曲线很多的地方有空白。

示例图

对于这个例子,我只是从gg349的答案中取出代码并替换x = np.linspace(0,4*np.pi,10000)x = np.linspace(0,4*np.pi,100)

我正在寻找一种方法来使它看起来像一条在大小上发生变化的线,而不是很多彼此背靠背的小线(它们在技术上是这样,但我想隐藏它)

由于英语不是我的第一语言,我很难正确地提出我的问题,请原谅任何错误。

标签: pythonmatplotlib

解决方案


您可以使用样条插值沿曲线创建更多段。

在此处输入图像描述

import numpy as np
from matplotlib.collections import LineCollection
import matplotlib.pyplot as plt
from scipy.interpolate import splev, splrep

x = np.linspace(0, 4*np.pi, 40)
y = np.cos(x)

spl = splrep(x, y)
x2 = np.linspace(0, 4*np.pi, 3000)
y2 = splev(x2, spl)

fig,a = plt.subplots(1, 2, figsize=(20,8))
for i, xy in enumerate([(x, y), (x2, y2)]):
    x3, y3 = xy
    lwidths=1+x3[:-1]
    points = np.array([x3, y3]).T.reshape(-1, 1, 2)
    segments = np.concatenate([points[:-1], points[1:]], axis=1)
    lc = LineCollection(segments, linewidths=lwidths,color='blue')
    a[i].add_collection(lc)
    a[i].set_xlim(0,4*np.pi)
    a[i].set_ylim(-1.1,1.1)

推荐阅读