我正在尝试绘制一个三维曲面,其中三维中的每一个都在一个单独的值数组中,并且每个坐标处的曲面颜色是x,y,z的函数。这是一种numpy.pcolormesh,但在4D中,而不是3d。 三维绘图由以下给出:
from mpl_toolkits.mplot3d import Axes3D
from matplotlib import cm
fig = plt.figure()
ax = fig.gca(projection='3d')
x = np.logspace(-1.,np.log10(5),50)
y = np.linspace(6,9,50)
z = np.linspace(-1,1,50)
colors = LikeBeta(y,range(50),range(50))
ax.plot_trisurf(x,y,z,cmap=colors,linewidth=0.2)
其中
def LikeBeta(rho0,r0,beta):
M0 = 10**rho0*r0_array[r0]**3
I = cst*M0*sigma_los_beta[beta,:,r0]
S = dv**2+I
res = (np.log(S) + (v-u)**2/S).sum()
return res/2.
或许cmap=colors
是错误的,但问题在别处。我得到以下错误:
----> 8 colors = LikeBeta(y,range(50),range(50))
----> 4 I = cst*M0*sigma_los_beta[beta,:,r0]
ValueError: operands could not be broadcast together with shapes (50,) (50,353)
实际上,sigma_los_beta
是一个数组,我单独计算它的值,它有形状(50,353,50)
,而那些353是我必须拥有的数据。
如何将此函数转换为与plot_trisurf
的其他项兼容的形式?
抱歉,我无法提供最小的工作代码,因为dv、v和u是数据。 非常感谢你的帮助。干杯
This答案解决4d曲面绘图问题。它使用matplotlib的
plot_surface
函数,而不是plot_trisurf
。基本上,您需要将x、y和z变量重塑为具有相同维度的二维数组。若要将第四个维度添加为颜色映射,必须提供与轴变量具有相同维度的另一个二维数组。
下面是与x值相对应的颜色映射的3d绘图的示例代码。参数
facecolors
用于根据您的喜好更改颜色映射。注意,它的值是从matplotlib.cm.ScalarMappable
类中的to_rgba()
函数获取的。我引用的答案(和其他)提到,您应该规范化您的第四维度数据。这似乎可以通过显式设置colormap的限制来避免,就像我在代码示例中所做的那样。
此代码基于trisurf演示 http://matplotlib.org/examples/mplot3d/trisurf3d_demo.html
我添加了一个基于SOCreate own colormap using matplotlib and plot color scale
还添加了一个序列w=tan(-x*y),该序列基于该函数在灰度范围内生成彩色地图。
你可以玩cdict的建设,增加更多的颜色,但我认为灰度是一个很好的概念证明。。。
很抱歉,由于缺少最少的工作代码,我无法直接使用您的示例。
非常感谢@Frik的伟大贡献,它帮助我实现了OP要求的类似的情节
然而,我发现对代码进行一些简化是可能的,而且可能会引起兴趣。代码片段和下图。
最后,我还想评论@Frik写的:
我发现这句话不正确。事实上,如果你看一下^{} ,你会发现有一个
norm
关键字默认设置为True
。这正是标准化发生的地方。还包括以下声明:您确实希望您的数据位于(0-1)中。
相关问题 更多 >
编程相关推荐