Как сделать 4d-сюжет используя Python с помощью matplotlib
Я ищу способ создания четырехмерных графиков (поверхность плюс цветовая гамма) с использованием 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 ответа
Чтобы создать сюжет, который вы хотите, нам нужно использовать matplotlib's 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))
Я получаю странную ошибку при попытке установить цвета лица вручную:
raise ValueError("RGBA sequence should have length 3 or 4")
ValueError: RGBA sequence should have length 3 or 4
Мой набор данных — 717x26, а формы цветов x, y, z и f — (26 717), (26 717), (26 717) и (26 717,4). Насколько я понял свойство facecolors, форма должна быть в порядке.
Код для построения графика приведен здесь:
# 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? Все приведенные выше примеры работают без проблем.