首页 > 解决方案 > 在 4d 图中标准化 facecolor 值

问题描述

我已经被这个问题困扰了一段时间,所以我在这里寻求帮助。

我正在尝试可视化 4 维数据:x、y、z 坐标与测量值 v 相结合。 v 值已在 3d 空间中的一张纸上测量,我想使用表面绘图函数和 facecolors 将其可视化。然而,当绘制图表时,颜色与数据的正确标准化值不相似。我想我在运行表面图之前缺少一些颜色的标准化。

我在这个网站上找到的帖子与 3d 图中 z 数据的着色有关。

我发现的第二个错误是 ylist 有 2 个条目,但我只能看到一个统一的层,而不是两个不同的值。在 ylist 中添加更多数据点时,这个问题似乎消失了。

任何帮助表示赞赏!

我当前运行的代码如下:

import numpy as np
import matplotlib.pyplot as plt
from numpy import ma
import matplotlib        as mpl
from matplotlib import ticker, cm
from mpl_toolkits.mplot3d import Axes3D;
from scipy import interpolate

plt.interactive(True);
xlist = [100,200,300,400,500,600,700,800,900,1000,1100,1200,1300,1400,1500,1600]
ylist = [500,600]
X, Y = np.meshgrid(xlist, ylist)

A =[[9.72,9.65,10.2,9.6,10.46,9.54,9.41,9.53,10.02,9.6,9.36,9.51,9.56,9.89,10.47,11.5],[9.87,10.16,10.22,10.17,10.09,10.15,10.15,10.7,10.18,9.96,10.25,10.27,9.72,10.87,11.52,11.79]] 
B = [[10.3,9.93,10.24,10.17,10.1,10.02,9.72,9.96,10.8,9.81,10.12,10.4,10.74,10.98,11.27,11.69],[10.3,10.63,10.48,10.57,10.72,10.64,10.71,10.93,11.,10.53,10.51,10.73,10.96,10.82,11.08,12.08]]
C = [[10.2,10.26,10.7,10.37,10.82,10.32,10.3,10.29,10.61,10.53,10.48,10.96,11.02,11.31,11.55,12.04],[10.3,10.6,10.95,10.97,10.93,10.96,11.05,11.11,11.28,11.14,11.1,11.34,11.34,11.31,11.8,12.23]]
Z= np.zeros_like(X)

A -= np.min(A); A /= np.max(A);
B -= np.min(B); B /= np.max(B);
C -= np.min(C); C /= np.max(C);

fig = plt.figure()

norm = mpl.colors.Normalize(vmin = 0., vmax = 12.23)

ax = fig.gca(projection='3d');
a=ax.plot_surface(X, Y, Z+10,rstride=1, cstride=1, norm =norm, facecolors = cm.jet(A),shade=False); #aanmaken van surface op afstand z met x,y coordinaat en de waarde van V op dit (x,y,z) punt
b=ax.plot_surface(X, Y, Z+15, rstride=1, cstride=1,norm =norm,facecolors = cm.jet(A),shade=False);
b=ax.plot_surface(X, Y, Z+20, rstride=1, cstride=1,norm =norm,facecolors = cm.jet(A),shade=False);

cmap = plt.get_cmap('jet',30)
sm = plt.cm.ScalarMappable(cmap=cmap, norm=norm)
sm.set_array([])
plt.colorbar(sm, ticks=np.linspace(0,12.23,12.23),boundaries=np.arange(0,12.23,.1))#plt.zlabel('z (mm)')

print(A)

plt.xlabel('x (mm)')
plt.ylabel('y (mm)')
plt.show()


结果图

标签: pythonnumpymatplotlib

解决方案


推荐阅读