具有 3 个变量和 1 个变量作为颜色的 3d 轮廓
3d contour with 3 variables and 1 variable as colour
我的情节有三个变量,我用第四个变量着色。我通过以下代码制作了一个散点图,但我想要一个等高线图。我的代码:
import numpy as np
import matplotlib.pyplot as plt
a=np.linspace(4.0,14.0,3)
b=np.linspace(0.5,2.5,3)
c=np.linspace(0.0,1.0,3)
d=np.random.rand(len(a),len(b),len(c)) #colour by this variable
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
z,y,x=np.meshgrid(c,a,b)
img = ax.scatter(x, y, z, c=d, cmap='RdGy')
fig.colorbar(img, pad=0.2).set_label('colour')
ax.set_xlabel('c')
ax.set_ylabel('a')
ax.set_zlabel('b')
我想要一个填充轮廓而不是散点图。我知道 mayavi.mlab 有这个功能,但由于某些原因我无法导入 mlab。是否有替代方案,或者是否有更好的方式来呈现这些数据?
下面是我将如何呈现这个 3 维数据。每个图都是一个 cross-section 穿过立方体。这在直觉上是有道理的。
import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(4.0, 14.0, 3)
y = np.linspace(0.5, 2.5, 3)
z = np.linspace(0.0, 1.0, 3)
data = np.random.rand(len(x), len(y), len(z))
fig, axes = plt.subplots(len(z), 1, figsize=(3.5, 9),
sharex=True,sharey=True)
for i, (ax, d) in enumerate(zip(axes, data.swapaxes(0, 2))):
ax.contour(x, y, d)
ax.set_ylabel('y')
ax.grid()
ax.set_title(f"z = {z[i]}")
axes[-1].set_xlabel('x')
plt.tight_layout()
plt.show()
我的建议:3D 图很少用于严肃的数据可视化。虽然它们看起来很酷,但实际上不可能准确读取任何数据点。
颜色也是如此。我建议 labelling the contours 而不是使用彩色地图。
您也可以随时使用 filled contour plot 添加颜色。
我的情节有三个变量,我用第四个变量着色。我通过以下代码制作了一个散点图,但我想要一个等高线图。我的代码:
import numpy as np
import matplotlib.pyplot as plt
a=np.linspace(4.0,14.0,3)
b=np.linspace(0.5,2.5,3)
c=np.linspace(0.0,1.0,3)
d=np.random.rand(len(a),len(b),len(c)) #colour by this variable
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
z,y,x=np.meshgrid(c,a,b)
img = ax.scatter(x, y, z, c=d, cmap='RdGy')
fig.colorbar(img, pad=0.2).set_label('colour')
ax.set_xlabel('c')
ax.set_ylabel('a')
ax.set_zlabel('b')
下面是我将如何呈现这个 3 维数据。每个图都是一个 cross-section 穿过立方体。这在直觉上是有道理的。
import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(4.0, 14.0, 3)
y = np.linspace(0.5, 2.5, 3)
z = np.linspace(0.0, 1.0, 3)
data = np.random.rand(len(x), len(y), len(z))
fig, axes = plt.subplots(len(z), 1, figsize=(3.5, 9),
sharex=True,sharey=True)
for i, (ax, d) in enumerate(zip(axes, data.swapaxes(0, 2))):
ax.contour(x, y, d)
ax.set_ylabel('y')
ax.grid()
ax.set_title(f"z = {z[i]}")
axes[-1].set_xlabel('x')
plt.tight_layout()
plt.show()
我的建议:3D 图很少用于严肃的数据可视化。虽然它们看起来很酷,但实际上不可能准确读取任何数据点。
颜色也是如此。我建议 labelling the contours 而不是使用彩色地图。
您也可以随时使用 filled contour plot 添加颜色。