簡體   English   中英

如何在地理 hvplot 點 plot 上疊加文本標簽?

[英]How can I overlay text labels on a geographic hvplot points plot?

我正在嘗試將標簽添加到顯示平鋪 map 上的點的 hvplot 中。

我的 GeoDataFrame gdf看起來像這樣:

  id                  geometry
8911  POINT (5.79557 53.20121)
8912  POINT (5.76973 53.18031)
8913  POINT (5.78159 53.20088)
8914  POINT (5.75442 53.20394)
8915  POINT (5.76594 53.21173)

將這些點添加到 map 很容易:

gdf.hvplot(geo=True, tiles=True)

然后我嘗試以類似的方式對 plot 文本標簽使用標簽,但這不起作用。:

gdf.hvplot.labels(geo=True, tiles=True, text='id')

它給了我這個錯誤

Traceback (most recent call last):

  File "<ipython-input-138-73570b6a686e>", line 1, in <module>
    centroid_labels = dfl.hvplot.labels(geo=True, tiles=True, text='id')

  File "C:\Users\user\Miniconda3\envs\otp\lib\site-packages\hvplot\plotting\core.py", line 574, in labels
    return self(x, y, text=text, kind='labels', **kwds)

  File "C:\Users\user\Miniconda3\envs\otp\lib\site-packages\hvplot\plotting\core.py", line 79, in __call__
    return self._get_converter(x, y, kind, **kwds)(kind, x, y)

  File "C:\Users\user\Miniconda3\envs\otp\lib\site-packages\hvplot\converter.py", line 1097, in __call__
    obj = method(x, y)

  File "C:\Users\user\Miniconda3\envs\otp\lib\site-packages\hvplot\converter.py", line 1688, in labels
    text = self.kwds.get('text', [c for c in data.columns if c not in (x, y)][0])

IndexError: list index out of range

顯式添加xy選項會產生不同的錯誤:

gdf.hvplot.labels(geo=True, tiles=True, x=gdf.geometry.x, y=gdf.geometry.y, text='id')
Traceback (most recent call last):

  File "<ipython-input-143-0eaefd24cbe6>", line 1, in <module>
    centroid_labels = dfl.hvplot.labels(geo=True, x=dfl.geometry.x, y=dfl.geometry.y, tiles=True, text='id')

  File "C:\Users\user\Miniconda3\envs\otp\lib\site-packages\hvplot\plotting\core.py", line 574, in labels
    return self(x, y, text=text, kind='labels', **kwds)

  File "C:\Users\user\Miniconda3\envs\otp\lib\site-packages\hvplot\plotting\core.py", line 79, in __call__
    return self._get_converter(x, y, kind, **kwds)(kind, x, y)

  File "C:\Users\user\Miniconda3\envs\otp\lib\site-packages\hvplot\plotting\core.py", line 83, in _get_converter
    x = x or params.pop('x', None)

  File "C:\Users\user\Miniconda3\envs\otp\lib\site-packages\pandas\core\generic.py", line 1442, in __nonzero__
    raise ValueError(

ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

我能夠通過將 CRS 轉換為EPSG:3857 ( WGS 84 / Pseudo-Mercator ) 來實現這一點,這可能適合也可能不適合您的目的。

附帶說明一下,如果有一個關於此類問題的MRE ,那就太好了。

這是有效的:

import geopandas as gpd
import pandas as pd
import hvplot.pandas
import geoviews as gv
from geoviews import tile_sources as gvts

raw = """8911  POINT (5.79557 53.20121)
8912  POINT (5.76973 53.18031)
8913  POINT (5.78159 53.20088)
8914  POINT (5.75442 53.20394)
8915  POINT (5.76594 53.21173)"""

data = [(_[0], _[-2], _[-1]) for _ in [_.replace("(", "").replace(")", "").split() for _ in raw.split("\n")]]
df = pd.DataFrame(data, columns=["labels", "x", "y"]).astype({"labels": str})
gdf = gpd.GeoDataFrame(df, geometry=gpd.points_from_xy(df.x, df.y, crs="EPSG:4326"))

tiles = gvts.CartoLight
points = gdf.hvplot(geo=True, tiles="CartoLight")
labels = gdf.to_crs("EPSG:3857").assign(x=lambda df: df.geometry.x, y=lambda df: df.geometry.y).hvplot.labels(text="labels", x="x", y="y")
(points * labels * tiles).opts(height=600, width=800)

我認為這應該有效:

gdf.hvplot.labels(text="labels", geo=True)

這真的只是解決原始問題,可能值得在 github 上報告該問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM