首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用新标量更新PyVista绘图仪

使用新标量更新PyVista绘图仪
EN

Stack Overflow用户
提问于 2021-09-08 08:49:16
回答 2查看 392关注 0票数 1

尝试使用新标量更新格网数据时,我无法更新图

我也已经向PyVista支持部门报告了这些问题:https://github.com/pyvista/pyvista-support/issues/501

通过使用以下示例,我可以进行图形更新:https://github.com/pyvista/pyvista-support/issues/68

不过,我的例子不起作用。

示例代码如下:

代码语言:javascript
复制
import pyvista as pv
import pyvistaqt as pvqt
import numpy as np
import time

cmap='viridis'    
nx,ny,nz = 60, 40, 42
nc = nx*ny*nz

np.random.seed(0)
inidata = np.random.randint(1, 100, nc)

# generate random data for updating
data = [np.random.randint(1, 1000, nc), 
        np.random.randint(1, 1e4, nc),
        np.random.randint(1, 1e5, nc),
        np.random.randint(1, 1e6, nc)]

gridata = np.ones((nx,ny,nz))

mesh = pv.UniformGrid()
mesh.dimensions = np.array(gridata.shape) + 1 


mesh.origin = (0, 0, 0)  # The bottom left corner of the data set
mesh.spacing = (30, 30, 2.5)  # These are the cell sizes along each axis

mesh.cell_arrays["Data"] = inidata

plotter = pvqt.BackgroundPlotter()

# Add slices
xslice = mesh.slice(normal='x')
yslice = mesh.slice(normal='y')
zslice = mesh.slice(normal='z')
rslice = mesh.slice(normal=[1,1,0])

# Plot
plotter.add_mesh(mesh.outline(), color="k")
plotter.add_mesh(xslice, cmap=cmap)
plotter.add_mesh(yslice, cmap=cmap)
plotter.add_mesh(zslice, cmap=cmap)
plotter.add_mesh(rslice, cmap=cmap)

def update():
    for dat in data:
        plotter.update_scalars(dat, mesh=mesh)
        time.sleep(1)
        plotter.update()
        
plotter.add_callback(update, interval=100)
EN

回答 2

Stack Overflow用户

发布于 2021-10-01 18:47:23

PyVista允许通过为加载的网格设置新标量来更新场景。为此,应将新数据传递给绘图仪:

代码语言:javascript
复制
import numpy as np
import pyvista as pv

# Creating random data
N = 100
data = np.zeros((1, N, N))
data[:] = np.random.randint(0, 10000, data.shape)

# Creating a mesh from our data
g = pv.UniformGrid()
g.dimensions = np.array(data.shape) + 1
g.spacing = (10, 10, 10)
g.cell_data['data'] = data.flatten()
#Careful with threshold as it will turn your data into UnstructuredGrid
#g = g.threshold([0.0001, int(data.max())])

# Creating scene and loading the mesh
p = pv.Plotter()
p.add_mesh(g, opacity=0.5, name='data', cmap='gist_ncar')
p.show(interactive_update=True)

# Animation
for i in range(5, 1000):
    # Updating our data
    data[:] = np.random.randint(0, 10000, data.shape)
    # Updating scalars
    p.update_scalars(data.flatten())
    #p.mesh['data'] = data.flatten() # setting data to the specified mesh is also possible
    # Redrawing
    p.update()

但是,数据的形状(本质上是单元格或点的数量)必须保持不变。这意味着如果数据数组大小改变,或者通过阈值过滤的数据改变了它的单元格数量,加载的网格将拒绝它。

解决方法基本上是在每次更新数据时将新网格加载到绘图仪中。

将#Animation部分与此代码片段交换,平面将增加一些体积:

代码语言:javascript
复制
# Animation
for i in range(5, 1000):
    # Updating our data
    data = np.full((i, N, N),0)
    data[:] = np.random.randint(0,1000000, data.shape)
    
    # Recreating the mesh
    g = pv.UniformGrid()
    g.dimensions = np.array(data.shape) + 1
    g.spacing = (10, 10, 10)
    g.cell_data['data'] = data.flatten()

    # Reloading the mesh to the scene
    p.clear()
    p.add_mesh(g, opacity=0.5, name='data')

    # Redrawing
    p.update()

请注意,场景只有在更新时才是交互式的,因此降低更新频率会使场景变得非常滞后

票数 2
EN

Stack Overflow用户

发布于 2021-09-26 12:03:52

在我看来,我们应该将#"Add Slices“和"#Plot”的部分放在函数update()中以刷新切片。

但是,如果数据范围小于scalar_bar_range,即使我们通过plotter.update_scalar_bar_range强制更新,scalar_bar_range也不会更新。

因此,我们必须手动刷新scalar_bar_range。

代码语言:javascript
复制
def update():
    for dat in data:
        # Add slices
        xslice = mesh.slice(normal='x')
        yslice = mesh.slice(normal='y')
        zslice = mesh.slice(normal='z')
        rslice = mesh.slice(normal=[1,1,0])

        # Plot
        plotter.add_mesh(mesh.outline(), color="k")
        plotter.add_mesh(xslice, cmap=cmap)
        plotter.add_mesh(yslice, cmap=cmap)
        plotter.add_mesh(zslice, cmap=cmap)
        plotter.add_mesh(rslice, cmap=cmap)
        time.sleep(1)
    plotter.scalar_bars._scalar_bar_ranges = {mesh.active_scalars_name: [0, 0]}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69099877

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档