如何使用非分析数据绘制绘图等值面?

2024-03-28 16:35:24 发布

您现在位置:Python中文网/ 问答频道 /正文

我从一个天气模型中获取了一些数据,并试图在Plotly内部将其绘制为等值面,但每次都会得到一张没有任何错误消息的空白图。我对plotly不熟悉,所以这似乎是一个简单的问题。文档和教程页面没有任何帮助

我已将输入数据缩减为3x3x3 3D阵列(在发送到go.Isosurface之前将其展平),3D格式的数据为:

z_subset_tiled_2 = np.array([[[151.11943054, 151.11943054, 151.11943054],
        [151.11943054, 151.11943054, 151.11943054],
        [151.11943054, 151.11943054, 151.11943054]],

       [[255.65301514, 255.65301514, 255.65301514],
        [255.65301514, 255.65301514, 255.65301514],
        [255.65301514, 255.65301514, 255.65301514]],

       [[363.32260132, 363.32260132, 363.32260132],
        [363.32260132, 363.32260132, 363.32260132],
        [363.32260132, 363.32260132, 363.32260132]]], dtype='float32')

lat_subset_tiled_2 = np.array([[[14.10366  , 14.103652 , 14.103641 ],
        [14.112637 , 14.112626 , 14.1126175],
        [14.121613 , 14.121605 , 14.121593 ]],

       [[14.10366  , 14.103652 , 14.103641 ],
        [14.112637 , 14.112626 , 14.1126175],
        [14.121613 , 14.121605 , 14.121593 ]],

       [[14.10366  , 14.103652 , 14.103641 ],
        [14.112637 , 14.112626 , 14.1126175],
        [14.121613 , 14.121605 , 14.121593 ]]], dtype='float32')

lon_subset_tiled_2 = np.array([[[120.31331 , 120.32256 , 120.33182 ],
        [120.31332 , 120.32256 , 120.331825],
        [120.31332 , 120.32258 , 120.33184 ]],

       [[120.31331 , 120.32256 , 120.33182 ],
        [120.31332 , 120.32256 , 120.331825],
        [120.31332 , 120.32258 , 120.33184 ]],

       [[120.31331 , 120.32256 , 120.33182 ],
        [120.31332 , 120.32256 , 120.331825],
        [120.31332 , 120.32258 , 120.33184 ]]], dtype='float32')

theta_2 = np.array([[[301.3794 , 301.44308, 301.4732 ],
        [301.33685, 301.39835, 301.44403],
        [301.3008 , 301.35147, 301.40442]],

       [[301.39117, 301.46188, 301.48926],
        [301.34885, 301.41992, 301.46976],
        [301.31003, 301.37192, 301.43362]],

       [[301.49753, 301.57315, 301.5888 ],
        [301.4737 , 301.54742, 301.59207],
        [301.45   , 301.51346, 301.57153]]], dtype='float32')

打印功能为:

import plotly.graph_objects as go

fig= go.Figure(data=go.Isosurface(
    x=lon_subset_tiled_2.flatten(),
    y=lat_subset_tiled_2.flatten(),
    z=z_subset_tiled_2.flatten(),
    value=theta_2.flatten(),
    isomin = 301.4, 
    isomax = 301.5, 
    caps=dict(x_show=False, y_show=False)
))

fig.show()

我得到的结果是: Blank Plotly 3D graph

在坐标上,它甚至都不起作用,所以我希望这里有一些明显的错误。不过,用于处理真实数据的文档并不存在


Tags: 数据文档goshow错误npplotlyarray
2条回答

我不是Plotly方面的专家,但您似乎无法使用顺序不正确的点(即,形成曲面的点集合,但也包括该曲面内部的更多点)创建等值面

例如,请注意,虽然以下代码正确呈现:

fig= go.Figure(data=go.Isosurface(
    x=np.array([0,0,0,0,1,1,1,1]),
    y=np.array([1,0,1,0,1,0,1,0]),
    z=np.array([1,1,0,0,1,1,0,0]),
    value=theta_2[0].flatten(),
    isomin = 301.3, 
    isomax = 301.6
))
fig.show()

enter image description here

交换第一个和最后一个x、y、z坐标意味着这不再是正确排序的曲面,因此Plotly无法渲染图形

fig= go.Figure(data=go.Isosurface(
    x=np.array([1,0,0,0,1,1,1,0]),
    y=np.array([0,0,1,0,1,0,1,1]),
    z=np.array([0,1,0,0,1,1,0,1]),
    value=theta_2[0].flatten(),
    isomin = 301.3, 
    isomax = 301.6
))
fig.show()

enter image description here

我认为您很可能需要对其中一个数组进行排序(比如x坐标),然后围绕该数组重新排列其他数组。当我有更多的空闲时间时,我很高兴再次讨论这个问题,但希望这能让你朝着正确的方向开始

还有:任何比我更有3D绘图经验的人,请加入

如果任何人由于依赖性问题(如我)而无法使用mayavi解决方案,那么使用np.mgridscipy.interpolate.griddata将数据插入到常规网格对我的情况有效

在下面的示例中,z、lon和lat分别是高度、x和y的3d阵列。数据数组是(z、lon、lat)处的值的三维数组

# Data coordinates
points = np.array( (z.flatten(), lon.flatten(), lat.flatten()) ).T
# Data values @ above coords
values = data.flatten()

# Grid to interp to
Z, X, Y = np.mgrid[z.min():z.max():20j, lon.min():lon.max():50j, lat.min():lat.max():50j]
# New data values on interp grid
newdata = griddata( points, values, (Z,X,Y) )

fig = go.Figure(data=[
            go.Isosurface(x=X.flatten(),y=Y.flatten(),z=Z.flatten(),
                       value=newdata.flatten(),
                       opacity=0.3,
                       isomin=15,
                       isomax=30,
                       surface_count=5,
                       lighting=dict(ambient=0.7),
                       colorscale='amp',
                       showscale=False,
                       caps=dict(x_show=False, y_show=False)
                       ),
            ])

不管出于什么原因,即使我的数据已经被网格化了,当我将所有内容重新插值到一个统一的网格中时,plotly仍然有效。效率不是很高,但它很有效

相关问题 更多 >