PyVista的xarray DataArray访问器
项目描述
PyVista xarray
PyVista的xarray DataArray访问器,用于在3D中可视化数据集
🚀 用法
您必须import pvxarray
才能将DataArray
访问器与xarray注册。之后,将可用一个pyvista
命名空间访问器。
在MyBinder上尝试:https://mybinder.org/v2/gh/pyvista/pyvista-xarray/HEAD
以下是一个使用PyVista可视化RectilinearGrid
的示例
import pvxarray
import xarray as xr
ds = xr.tutorial.load_dataset("air_temperature")
da = ds.air[dict(time=0)] # Select DataArray for a timestep
# Plot in 3D
da.pyvista.plot(x="lon", y="lat", show_edges=True, cpos='xy')
# Or grab the mesh object for use with PyVista
mesh = da.pyvista.mesh(x="lon", y="lat")
或者您可以直接将VTK网格读取到xarray中
import xarray as xr
ds = xr.open_dataset("data.vtk", engine="pyvista")
ds["data array"].pyvista.plot(x="x", y="y", z="z")
⬇️ 安装
🐍 使用conda
安装
Conda使得管理pyvista-xarray
在各个平台上的依赖变得相当容易,这是推荐的安装方法
conda install -c conda-forge pyvista-xarray
🎡 使用pip
安装
如果您更喜欢pip,则可以从PyPI安装: https://pypi.ac.cn/project/pyvista-xarray/
pip install pyvista-xarray
上游工作
许多示例利用了PyVista v0.38.1
和GeoVista的新功能,这些功能可能在您阅读时可能尚未发布。以下是某些示例所需的pull requests列表
- GeoVista算法支持:https://github.com/bjlittle/geovista/pull/127
所需和合并的工作
- https://github.com/pyvista/pyvista/pull/2698
- https://github.com/pyvista/pyvista/pull/2697
- https://github.com/pyvista/pyvista/pull/3318
- https://github.com/pyvista/pyvista/pull/3556
- https://github.com/pyvista/pyvista/pull/3385
💭 反馈
请在讨论板上分享您的想法和问题。如果您想报告任何错误或提出功能请求,请创建一个问题。
如果提交错误报告,请分享scooby报告
import pvxarray
print(pvxarray.Report())
🏏 更多示例
以下是一些从 xarray 和 rioxarray 文档中提取的简单示例。在仓库的 examples/
目录中还有更多复杂的示例。
简单的 RectilinearGrid
import numpy as np
import pvxarray
import xarray as xr
lon = np.array([-99.83, -99.32])
lat = np.array([42.25, 42.21])
z = np.array([0, 10])
temp = 15 + 8 * np.random.randn(2, 2, 2)
ds = xr.Dataset(
{
"temperature": (["z", "x", "y"], temp),
},
coords={
"lon": (["x"], lon),
"lat": (["y"], lat),
"z": (["z"], z),
},
)
mesh = ds.temperature.pyvista.mesh(x="lon", y="lat", z="z")
mesh.plot()
使用 rioxarray 的栅格
import pvxarray
import rioxarray
import xarray as xr
da = rioxarray.open_rasterio("TC_NG_SFBay_US_Geo_COG.tif")
da = da.rio.reproject("EPSG:3857")
# Grab the mesh object for use with PyVista
mesh = da.pyvista.mesh(x="x", y="y", component="band")
mesh.plot(scalars="data", cpos='xy', rgb=True)
import pvxarray
import rioxarray
da = rioxarray.open_rasterio("Elevation.tif")
da = da.rio.reproject("EPSG:3857")
# Grab the mesh object for use with PyVista
mesh = da.pyvista.mesh(x="x", y="y")
# Warp top and plot in 3D
mesh.warp_by_scalar().plot()
StructuredGrid
import pvxarray
import pyvista as pv
import xarray as xr
ds = xr.tutorial.open_dataset("ROMS_example.nc", chunks={"ocean_time": 1})
if ds.Vtransform == 1:
Zo_rho = ds.hc * (ds.s_rho - ds.Cs_r) + ds.Cs_r * ds.h
z_rho = Zo_rho + ds.zeta * (1 + Zo_rho / ds.h)
elif ds.Vtransform == 2:
Zo_rho = (ds.hc * ds.s_rho + ds.Cs_r * ds.h) / (ds.hc + ds.h)
z_rho = ds.zeta + (ds.zeta + ds.h) * Zo_rho
ds.coords["z_rho"] = z_rho.transpose() # needing transpose seems to be an xarray bug
da = ds.salt[dict(ocean_time=0)]
# Make array ordering consistent
da = da.transpose("s_rho", "xi_rho", "eta_rho", transpose_coords=False)
# Grab StructuredGrid mesh
mesh = da.pyvista.mesh(x="lon_rho", y="lat_rho", z="z_rho")
# Plot in 3D
p = pv.Plotter()
p.add_mesh(mesh, lighting=False, cmap='plasma', clim=[0, 35])
p.view_vector([1, -1, 1])
p.set_scale(zscale=0.001)
p.show()