如何使用matplotlib在Python中制作4D图?

21 投票
2 回答
28969 浏览
提问于 2025-04-17 04:46

我想用Python和matplotlib来创建四维图(就是表面图加上颜色比例尺)。我已经能用前面三个变量生成表面图了,但在为第四个变量添加颜色比例尺时遇到了困难。下面是我数据的一小部分。任何帮助都非常感谢。谢谢!

数据子集

var1    var2    var3    var4
10.39   73.32   2.02    28.26
11.13   68.71   1.86    27.83
12.71   74.27   1.89    28.26
11.46   91.06   1.63    28.26
11.72   85.38   1.51    28.26
13.39   78.68   1.89    28.26
13.02   68.02   2.01    28.26
12.08   64.37   2.18    28.26
11.58   60.71   2.28    28.26
8.94    65.67   1.92    27.04
11.61   59.57   2.32    27.52
19.06   74.49   1.69    63.35
17.52   73.62   1.73    63.51
19.52   71.52   1.79    63.51
18.76   67.55   1.86    63.51
19.84   53.34   2.3     63.51
20.19   59.82   1.97    63.51
17.43   57.89   2.05    63.38
17.9    59.95   1.89    63.51
18.97   57.84   2       63.51
19.22   57.74   2.05    63.51
17.55   55.66   1.99    63.51
19.22   101.31  6.76    94.29
19.41   99.47   6.07    94.15
18.99   94.01   7.32    94.08
19.88   103.57  6.98    94.58
19.08   95.38   5.66    94.14
20.36   100.43  6.13    94.47
20.13   98.78   7.37    94.47
20.36   89.36   8.79    94.71
20.96   84.48   8.33    94.01
21.02   83.97   6.78    94.72
19.6    95.64   6.56    94.57

2 个回答

0

我在手动设置面颜色的时候遇到了一个奇怪的错误:

raise ValueError("RGBA sequence should have length 3 or 4")
ValueError: RGBA sequence should have length 3 or 4

我的数据集是717行26列,x、y、z和面颜色(fcolors)的形状都是(26,717),而面颜色的形状是(26,717,4)。根据我对面颜色属性的理解,这个形状应该是没问题的。

绘图的代码在这里:

# mesh the x-y coodrdinates
x, y = np.meshgrid(x, y)

# Create a 3D plot
ax = fig.add_subplot(projection='3d')

# Creat the mapper for the 4D
mapper = cm.ScalarMappable(norm=norm, cmap='viridis')
mapper.set_array([])

# Map the data to RGBA values
fcolors = mapper.to_rgba(np.transpose(WSS))

# Output the dimensions
print('fcolors: ',fcolors.shape,', x, y, z: ',x.shape,' - ',y.shape,' - ',np.transpose(z).shape)

# Plot the surface incl. the 4th dimension
surf = ax.plot_surface(x, y, np.transpose(z), facecolor=fcolors)

有没有人知道为什么我会在这种情况下遇到RGBA错误?上面提供的所有例子都没有问题。

16

为了创建你想要的图形,我们需要使用matplotlib中的plot_surface来绘制Z(X,Y)的表面图,然后使用关键字参数facecolors来为每个区域传入新的颜色。

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from matplotlib import cm

# create some fake data
x = y = np.arange(-4.0, 4.0, 0.02)
# here are the x,y and respective z values
X, Y = np.meshgrid(x, y)
Z = np.sinc(np.sqrt(X*X+Y*Y))
# this is the value to use for the color
V = np.sin(Y)

# create the figure, add a 3d axis, set the viewing angle
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.view_init(45,60)

# here we create the surface plot, but pass V through a colormap
# to create a different color for each patch
ax.plot_surface(X, Y, Z, facecolors=cm.Oranges(V))

enter image description here

撰写回答