我有一组4D数据(3D点+ 1D值)。我们称之为X,Y,Z和C。我想从X,Y,Z点生成一个曲面,然后根据C值着色。
我想我问的问题和diffracteD
在this问题中问的一样,但似乎没有人理解他在问什么,答案和评论也没有帮助。
我能够创建一个带有XYZ数据的曲面,遵循这个this答案,但曲面是根据Z值着色的,而不是我想要的C值。
另一方面,original answer
到this的问题设法使用C值对表面进行着色,但在这种情况下,Z是X和Y的函数,而不是像我的情况那样是一个自由变量。
我的目标是在某种程度上合并这两件事,从XYZ数据创建一个曲面,并根据C语言着色
以下是我到目前为止所做的:
1.独立于XYZ但使用Z值着色的曲面:
import matplotlib.pyplot as plt
from matplotlib.ticker import MaxNLocator
from matplotlib import cm
import numpy as np
from numpy.random import randn
from scipy import array, newaxis
# ======
## data:
DATA = np.array([
[-0.807237702464, 0.904373229492, 111.428744443],
[-0.802470821517, 0.832159465335, 98.572957317],
[-0.801052795982, 0.744231916692, 86.485869328],
[-0.802505546206, 0.642324228721, 75.279804677],
[-0.804158144115, 0.52882485495, 65.112895758],
[-0.806418040943, 0.405733109371, 56.1627277595],
[-0.808515314192, 0.275100227689, 48.508994388],
[-0.809879521648, 0.139140394575, 42.1027499025],
[-0.810645106092, -7.48279012695e-06, 36.8668106345],
[-0.810676720161, -0.139773175337, 32.714580273],
[-0.811308686707, -0.277276065449, 29.5977405865],
[-0.812331692291, -0.40975978382, 27.6210856615],
[-0.816075037319, -0.535615685086, 27.2420699235],
[-0.823691366944, -0.654350489595, 29.1823292975],
[-0.836688691603, -0.765630198427, 34.2275056775],
[-0.854984518665, -0.86845932028, 43.029581434],
[-0.879261949054, -0.961799684483, 55.9594146815],
[-0.740499820944, 0.901631050387, 97.0261463995],
[-0.735011699497, 0.82881933383, 84.971061395],
[-0.733021568161, 0.740454485354, 73.733621269],
[-0.732821755233, 0.638770044767, 63.3815970475],
[-0.733876941678, 0.525818698874, 54.0655910105],
[-0.735055978521, 0.403303715698, 45.90859502],
[-0.736448900325, 0.273425879041, 38.935709456],
[-0.737556181137, 0.13826504904, 33.096106049],
[-0.738278724065, -9.73058423274e-06, 28.359664343],
[-0.738507612286, -0.138781586244, 24.627237837],
[-0.738539663773, -0.275090412979, 21.857410904],
[-0.739099040189, -0.406068448513, 20.1110519655],
[-0.741152200369, -0.529726022182, 19.7019157715],
])
Xs = DATA[:,0]
Ys = DATA[:,1]
Zs = DATA[:,2]
# ======
## plot:
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
#cmap="hot" colours w.r.t. Z values
surf = ax.plot_trisurf(Xs, Ys, Zs, cmap="hot", linewidth=0)
fig.colorbar(surf)
ax.xaxis.set_major_locator(MaxNLocator(5))
ax.yaxis.set_major_locator(MaxNLocator(6))
ax.zaxis.set_major_locator(MaxNLocator(5))
fig.tight_layout()
plt.show()
1.表面着色为C值,但Z是X、Y的函数
from mpl_toolkits.mplot3d import Axes3D
from matplotlib import cm
import matplotlib.pyplot as plt
import numpy as np
fig = plt.figure()
ax = fig.add_subplot(projection='3d')
# as plot_surface needs 2D arrays as input
x = np.arange(10)
y = np.array(range(10,15))
# we make a meshgrid from the x,y data
X, Y = np.meshgrid(x, y)
Z = np.sin(np.sqrt(X**2 + Y**2))
# data_value shall be represented by color
data_value = np.random.rand(len(y), len(x))
# map the data to rgba values from a colormap
colors = cm.ScalarMappable(cmap = "hot").to_rgba(data_value)
# plot_surface with points X,Y,Z and data_value as colors
surf = ax.plot_surface(X, Y, Z, rstride=1, cstride=1, facecolors=colors,
linewidth=0, antialiased=True)
fig.colorbar(surf)
plt.show()
有没有方法修改第一个代码,使其使用C值而不是Z值来着色表面?谢谢。
2条答案
按热度按时间67up9zun1#
下面是一个替代方法,将面部颜色设置为
trisurf
中的三角形,只需要使C值具有相同数量的三角形:我们可以清楚地找到图中的三角形:
然后只需要生成三角形的颜色:
得到图:
wsewodh22#
我最终遵循了
HMH1013
的建议并使用了plotly。代码如下:这样,C需要具有相同的X、Y和Z维度,而不是三角形中的一个。
感谢
HMH1013
帮助我。