【问题标题】:Plotting from array to geoviews/holoviews. Converting to xarray needed?从数组绘制到 geoviews/holoviews。需要转换为 xarray 吗?
【发布时间】:2020-09-05 23:41:17
【问题描述】:

首先,如果有人有一个很好的教程的链接,可以使用地理视图或全息视图创建 colomaps 并将其传输到仪表板,请发送链接。我试图模仿他们在the video here 中的时间戳所做的事情。除了他们网站上的几个例子之外,也很难找到好的地理视图文档,所以指向完整文档会很棒。

无论如何,我认为我有一个非常基本的情节。它是 x 的网格、y 的网格和 z 值的网格。我想在geoviews中绘制这个。它基本上包含来自 GPS 站的插值运动,我想制作 z 值的颜色图。我可以很容易地用 matplotlib 用一个简单的

plot = plt.scatter(mesh_x, mesh_y, c = z1, cmap = cm.hsv)

但尝试将其放入 geoviews 会产生一个非常时髦的数据框。

运行print(np.shape(mesh_x),np.shape(mesh_y), np.shape(z1)) 显示所有这些都是 (41,348) 的形状。如果我尝试将它们放入带有a = np.array((mesh_x,mesh_y,z1)) 的单个数组中,我会按预期得到一个形状为 (3,41,348) 的数组。从这里我真的只是在猜测该怎么做。当我尝试使用

将其放入 geoviews 点数据框时

points = [a[0], a[1], a[2]] df = gv.Points(points) df.dframe()

然后运行df.dframe(),它会显示两列,经度和纬度的值不正确,这是它显示的屏幕截图,如果它有帮助

我尝试转换为 xarray,因为它似乎在 geoviews 网站上显示的所有示例中都是首选,但它看起来也很时髦。当我尝试xrtest = xr.DataArray((mesh_x,mesh_y,z1)) 时,我得到一个看起来像这样 的xarray@

此时我不知道该怎么办。我尝试了几种不同的方法,虽然我可能会起作用,但我不记得所有这些方法。这就是我现在的位置。我确定我做错了什么,我只是不知道如何正确地做。谢谢

【问题讨论】:

  • 我对你的问题有点困惑; gv.Points(如 plt.scatter)用于绘制点,但听起来您的数据是网格,而不是点? GeoViews 提供了几种不同的类来绘制网格,这取决于它们的规则程度;你的听起来可能像 TriMesh(但也可以考虑 Image 和 QuadMesh)。
  • 我试过图像,它说图像类型需要网格数据,PandasInterface 是柱状的。要将柱状数据显示为网格,请使用 HeatMap 元素或聚合数据。当我转换为 numpy 数组时,它也是一样的。我使用 Points 是因为我使用 scatter 在 mpl 中绘制它们。
  • Image 用于可视化完全规则的网格数据,Quadmesh 用于可视化网格上但每个轴上的间距不规则的数据;两者都期望网格数据。 HeatMap 与 Image 类似,但允许使用分类轴,而不仅仅是数字。如果您拥有的只是任意位置的点列表,那么您可以使用 Points(请参阅单独的答案)或 TriMesh,两者都期望/接受柱状数据。

标签: python numpy python-xarray holoviews geoviews


【解决方案1】:

假设您想要在 Matplotlib 中使用的点图,等效于 plt.scatter 的 HoloViews 是 hv.Points。 hv.Points 接受一种整洁的数据格式,与 Matplotlib 相比,您可以通过转置数据获得:

import matplotlib.pyplot as plt
from matplotlib import cm
%matplotlib inline
mesh_x = [1,2,3,6]
mesh_y = [6,2,8,0]
z1 = [0.5, 4, 6,2]

plot = plt.scatter(mesh_x, mesh_y, c = z1, cmap = cm.hsv)

import holoviews as hv
hv.extension('matplotlib')

hv.Points(zip(mesh_x,mesh_y,z1), kdims=["x","y"], vdims=["z"]).opts(color='z', cmap="hsv")

这里kdims=["x","y"], 是可选的,但明确说明了您想要的关键尺寸。您可能还需要考虑 hvPlot,它处理与 plt.scatter 相同的数据格式:

import pandas as pd
df = pd.DataFrame(dict(x=mesh_x,y=mesh_y,z=z1))

import hvplot.pandas
df.hvplot.scatter(x="x", y="y", c="z", cmap="hsv")

【讨论】:

  • 感谢您的回复詹姆斯。我之所以尝试 holoviews,是因为你为 pyviz 所做的演示视频。我会按照你上面的建议给 hvplot 和 Trimesh 一个镜头。
猜你喜欢
  • 2019-07-23
  • 2017-11-04
  • 2020-06-19
  • 2020-09-29
  • 1970-01-01
  • 1970-01-01
  • 2011-04-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多