为了以一般形式说明它,我正在寻找一种使用matplotlib用渐变色线连接多个点的方法,但我在任何地方都找不到它。更具体地说,我用单色线绘制了一个2D随机漫步。但是,由于这些点具有相关的顺序,我想看看图,看看数据移动到了哪里。一条渐变色的线就可以了。或具有逐渐变化的透明度的线。
我只是想提高我的数据的可视化。看看这张由R的ggplot2包生成的美丽图像。我在matplotlib中寻找相同的内容。谢谢。
为了以一般形式说明它,我正在寻找一种使用matplotlib用渐变色线连接多个点的方法,但我在任何地方都找不到它。更具体地说,我用单色线绘制了一个2D随机漫步。但是,由于这些点具有相关的顺序,我想看看图,看看数据移动到了哪里。一条渐变色的线就可以了。或具有逐渐变化的透明度的线。
我只是想提高我的数据的可视化。看看这张由R的ggplot2包生成的美丽图像。我在matplotlib中寻找相同的内容。谢谢。
7条答案
按热度按时间5kgi1eie1#
请注意,如果你有很多点,那么为每个线段调用
plt.plot
可能会很慢。使用LineCollection对象更有效。使用
colorline
recipe,您可以执行以下操作:nr7wwzry2#
我最近回答了一个类似的问题(使用matplotlib创建20多种独特的图例颜色)。在那里我展示了你可以Map的颜色循环,你需要绘制你的线条到一个颜色Map。您可以使用相同的步骤为每对点获取特定颜色。
应仔细选择颜色Map,因为如果颜色Map是彩色的,则沿着线条的颜色过渡可能会显得剧烈。
或者,可以更改每条线段的Alpha,范围从0到1。
下面的代码示例中包含一个例程(
highResPoints
),用于扩展随机游走的点数,因为如果点数太少,过渡可能会显得很激烈。这段代码的灵感来自我最近提供的另一个答案:https://stackoverflow.com/a/8253729/717357下图显示了四种情况:
ss2ws0br3#
对于注解来说太长了,所以只是想确认
LineCollection
比在行子段上的for循环快得多。LineCollection方法在我的手中要快得多。
我们将针对上面的LineCollection方法测试迭代绘图。
1 loops, best of 1: 13.4 s per loop
1 loops, best of 1: 532 ms per loop
如果你想要一个平滑的渐变,而你只有几个点,那么对你的线进行上采样以获得更好的颜色渐变,就像当前选择的答案所提供的那样,仍然是一个好主意。
lnxxn5zx4#
下面是我使用pcolormesh的不同解决方案。每一条线段都是使用四边形绘制的,四边形在每一端的颜色之间进行插值。因此,它是真正的插值颜色,而不添加额外的线段。
uplii1fm5#
基于Yann的回复,我将其扩展到涵盖线点的任意着色。沿着直线在一个点和下一个点之间执行RBG的插值。Alpha可以单独设置。我实际上需要这个解决方案的动画,其中一部分的线是淡出和更新动态,所以我额外增加了设置渐变长度和方向的能力。希望对某人有帮助。
参见随附的示例图。
**更新:**片段颜色无法再现底层点颜色的方式困扰着我,因此我添加了一个标志,以将片段颜色插值更改为中间或向前。因为有n-1个线段和n个点,你不能让线段颜色完全匹配,但现在它们至少在一端匹配。这也消除了由RGB通道平均所造成的拖尾,就像以前做的那样,我想在某些情况下你可能想要更平滑的版本,所以它仍然存在。
**更新2:**承诺这是最后一个。.但是我将其扩展到3d并纠正了一些不明显的错误,因为所使用的测试数据在0,1范围内
ymzxtsji6#
我使用了@alexbw代码,用于绘制抛物线。效果非常好。我可以改变颜色的功能。对于计算,我花了大约1分30秒。我使用的是英特尔i5,图形2GB,8 GB内存。
代码如下:
结果是:
lmyy7pcs7#
下面是一个非常简短的解决方案,它使用了
itertools
文档中的sliding_window
配方。这一个仅在两种颜色(
c1
和c2
)之间线性插值RGB值。它们的指定方式与matplotlib相同,该函数使用colorConverter
将它们转换为RGB,然后使用np.linspace
进行插值。每一段将是一个单一的颜色,所以这看起来最好,如果你有很多小段。我使用Dizzixx的答案作为参考,但简化了很多。对我的目的有效,这也是一个随机漫步。示例用法: