我试图绘制一个三维表面,其中三维中的每一个都在一个单独的值数组中,每个坐标处的表面颜色是x,y,z的函数。有点麻木。pcolormesh,但在4D中,而不是3D。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是数据。非常感谢你的帮助。干杯
4条答案
按热度按时间dgtucam11#
This答案解决了4D曲面图问题。它使用matplotlib的
plot_surface
函数而不是plot_trisurf
。基本上,你想将x,y和z变量整形为相同维度的2d数组。要将第四维添加为色彩Map表,必须提供另一个维度相同的2d数组作为轴变量。
下面是一个3d图的示例代码,其中颜色Map表对应于x值。
facecolors
参数用于根据您的喜好更改色彩Map表。请注意,它的值是从matplotlib.cm.ScalarMappable
类中的to_rgba()
函数获取的。我引用的答案(和其他人)提到你应该规范化你的第四维数据。看起来,通过像我在代码示例中所做的那样显式地设置色彩Map表的限制,可以避免这种情况。
nhn9ugyo2#
非常感谢@Frik的伟大answer,它帮助我实现了OP要求的类似情节。
然而,我发现可以对代码进行一些简化,这可能是有意义的。片段和图如下。
最后,我也想评论一下@Frik写的:
我引用的答案(和其他人)提到你应该规范化你的第四维数据。看起来,通过像我在代码示例中所做的那样显式地设置色彩Map表的限制,可以避免这种情况。
我发现这个说法是不正确的。事实上,如果你看一下
to_rgba
,你可以看到有一个norm
关键字,默认设置为True
。这正是正常化发生的地方。还包括以下声明:如果norm为False,则不执行输入数据的归一化,并且假定其在范围(0-1)内。
您确实希望数据位于(0-1)中。
wdebmtf23#
此代码基于trisurf demo http://matplotlib.org/examples/mplot3d/trisurf3d_demo.html
我添加了一个基于SO Create own colormap using matplotlib and plot color scale的函数make_colormap()
还添加了序列w=tan(-x*y),其基于该函数在灰度级中生成颜色图。
你可以玩的建设cdict添加更多的颜色,但我认为灰度使一个很好的证明概念。..
很抱歉,我不能直接使用你的例子,由于缺乏最低限度的工作代码。
hm2xizp94#
截至2022年5月,这个问题的前三个答案都有不同的问题。我发现example provided in the matplotlib 3.5.0 documentation要简单得多,实际上可以像预期的那样使用
LightSource
类计算facecolors
。只需覆盖传入
ls.shade
的特定z
: