2015-02-09 113 views
5

我想在我的3d颤抖图中使用对应于颜色映射的颜色。该图的2D版本有一个可选数组,用于将颜色映射到箭头。我如何在3d版本中创建相同的效果?将颜色添加到matplotlib中的三维颤图中

+0

你有没有尝试过把它作为关键字参数('颜色')传递给颤抖阴谋? http://matplotlib.org/mpl_toolkits/mplot3d/tutorial.html#quiver表明它将关键字参数传递给'LineCollection',它将'colors'作为其参数之一。 – 2015-02-09 22:27:35

+0

哦,看起来它可能比这更复杂一点,因为'colors'必须是RGBA元组列表。但是,如果您知道如何将颜色映射到点,那么也许可以生成列表。我认为查看颜色表例程可能会有所帮助:http://matplotlib.org/api/cm_api.html#module-matplotlib.cm – 2015-02-09 22:33:13

+0

GH报告此问题可能值得一提。 – tacaswell 2015-02-11 05:19:53

回答

5

3D颤抖图是1.4的一个全新功能(它的文档)可能仍然有点粗糙的边缘。在这种情况下,我们可以尝试使用抖动实现为LineCollection(最终)从ScalarMappable继承的事实,这意味着它知道色彩图是什么,并且返回的艺术家具有方法set_array。在文档

大厦here

from mpl_toolkits.mplot3d import axes3d 
import matplotlib.pyplot as plt 
import numpy as np 

fig = plt.figure() 
ax = fig.gca(projection='3d') 

x, y, z = np.meshgrid(np.arange(-0.8, 1, 0.2), 
         np.arange(-0.8, 1, 0.2), 
         np.arange(-0.8, 1, 0.8)) 

u = np.sin(np.pi * x) * np.cos(np.pi * y) * np.cos(np.pi * z) 
v = -np.cos(np.pi * x) * np.sin(np.pi * y) * np.cos(np.pi * z) 
w = (np.sqrt(2.0/3.0) * np.cos(np.pi * x) * np.cos(np.pi * y) * 
    np.sin(np.pi * z)) 

q = ax.quiver(x, y, z, u, v, w, length=0.1, cmap='Reds', lw=2) 
q.set_array(np.random.rand(np.prod(x.shape))) 

plt.show() 

enter image description here

然而,你会注意到有不同的颜色比这是由于的方式实现细节它被实现,每个部分都被绘制成它自己的线。

直接使用Norm和颜色映射函数并将结果传递给colors可能是更好的方法。

+0

*颜色*需要什么样的参数?我会猜想一个nxmxkx3或nxmxkx4维数组,但这似乎不起作用。 – 2016-03-17 21:40:56

1

可以使用colors参数指定自定义颜色为每个箭头,虽然做这件事的方式是不是在所有直接的(作为matplotlib 2.0.0)。我已经在this issue中指定了实际绘制抖动图的逻辑以及指定着色的解决方法。您可以检查this gist一个简单的例子,它可以产生类似于图这一个: custom coloring of matplotlib 3D quiver

总之,这里是要遵循的步骤:

  1. 假设你有一个列表(大小为x的* y * z)指定要绘制的每个矢量的RGB值(0〜1之间)。
  2. 过滤出对应于长度为0的向量的RGB(或RGBA)元组,因为它们不会被真正绘制。
  3. [color_1, color_2, ..., color_n]成为您在步骤2之后获得的列表,您应该指定colors=[color_1, color_2, ..., color_n, color_1, color_1, color_2, color_2, ..., color_n, color_n],因为实际上所有非零的箭头“ - >”的“ - ”部分(由1行组成)将先被绘制,然后是“>”部分(由2行组成)。

希望这会有所帮助。

相关问题