python 将值添加到 Line3DCollection

问题描述 投票:0回答:1

我想在 3d 轴图中绘制多条线。 我正在绘制光线的轨迹,每条线都应根据每条路径的传播时间进行着色。 我想独立地绘制它们,因为我将它们保存在二进制三结构中,其中任何光线都可以遵循两个不同的轨迹。

我使用了Line3DCollection,但它似乎不是正确的方法。

简单来说,

import numpy as np

x = np.linspace(0,1,100)
y = x
z = x
t = np.linspace(0,1,100)

#here I need to plot these points coloring them in function of t

x1 = np.linspace(1,2,100)
y1 = x
z1 = x
t1 = np.linspace(1,2,100)

#I need to plot also this used the same colorbar used for former values

x2 = -np.linspace(1,2,100)
y2 = x
z2 = x
t2 = np.linspace(1,2,100)

#idem

所有线条都使用相同的颜色条比例,如下所示 情节

我尝试了以下方法,但输出并不像我预期的那样

import numpy as np
from matplotlib import pyplot as plt
from mpl_toolkits.mplot3d.art3d import Line3DCollection

x = np.linspace(0,1,100)
y = x
z = x
t = np.linspace(0,1,100)

points = np.array([x,y,z]).transpose().reshape(-1,1,3)
segs = np.concatenate([points[:-1],points[1:]],axis=1)
lc = Line3DCollection(segs, cmap=plt.get_cmap('jet'))
lc.set_array(t) 

fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.add_collection3d(lc)


x1 = np.linspace(1,2,100)
y1 = x1
z1 = x1
t1 = np.linspace(1,2,100)

points1 = np.array([x1,y1,z1]).transpose().reshape(-1,1,3)
segs1 = np.concatenate([points1[:-1],points1[1:]],axis=1)
lc = Line3DCollection(segs1, cmap=plt.get_cmap('jet'))
lc.set_array(t1)
lc.update_scalarmappable()

ax.add_collection3d(lc)

x2 = np.linspace(1,2,100)
y2 = -x2+2
z2 = -x2+2
t2 = np.linspace(1,2,100)

points2 = np.array([x2,y2,z2]).transpose().reshape(-1,1,3)
segs2 = np.concatenate([points2[:-1],points2[1:]],axis=1)
lc = Line3DCollection(segs2, cmap=plt.get_cmap('jet'))
lc.set_array(t1)
lc.update_scalarmappable()

ax.add_collection3d(lc)

ax.set_xlim(0, 2)
ax.set_ylim(0, 2)
ax.set_zlim(0, 2)
fig.colorbar(lc)
plt.show()

绘图这个情节

提前致谢

python matplotlib line
1个回答
0
投票

@ImportanceOfBeingErnest 基本上提供了答案。我只是将其全部包装在这里,也提供输出。

要做的就是向

Line3DCollection
添加共享标准化。

import numpy as np
from matplotlib import pyplot as plt
from mpl_toolkits.mplot3d.art3d import Line3DCollection

val_min = 0
val_max = 2

# here we define a normalisation that goes from 0 to 2
norm = plt.Normalize(val_min, val_max)

x = np.linspace(0,1,100)
y = x
z = x
t = np.linspace(0,1,100)

points = np.array([x,y,z]).transpose().reshape(-1,1,3)
segs = np.concatenate([points[:-1],points[1:]],axis=1)
lc = Line3DCollection(segs, cmap=plt.get_cmap('jet'), norm=norm)
lc.set_array(t) 

fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.add_collection3d(lc)


x1 = np.linspace(1,2,100)
y1 = x1
z1 = x1
t1 = np.linspace(1,2,100)

points1 = np.array([x1,y1,z1]).transpose().reshape(-1,1,3)
segs1 = np.concatenate([points1[:-1],points1[1:]],axis=1)
lc = Line3DCollection(segs1, cmap=plt.get_cmap('jet'), norm=norm)
lc.set_array(t1)
lc.update_scalarmappable()

ax.add_collection3d(lc)

x2 = np.linspace(1,2,100)
y2 = -x2+2
z2 = -x2+2
t2 = np.linspace(1,2,100)

points2 = np.array([x2,y2,z2]).transpose().reshape(-1,1,3)
segs2 = np.concatenate([points2[:-1],points2[1:]],axis=1)
lc = Line3DCollection(segs2, cmap=plt.get_cmap('jet'), norm=norm)
lc.set_array(t1)
lc.update_scalarmappable()

ax.add_collection3d(lc)

ax.set_xlim(0, 2)
ax.set_ylim(0, 2)
ax.set_zlim(0, 2)
fig.colorbar(lc)
plt.show()

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.