打印散布图框上的标记图标未更新 [英] marker icon on plotly scattermapbox not updating
本文介绍了打印散布图框上的标记图标未更新的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我正在使用Ploly的散布图框渲染地图,并尝试更改符号。我一直使用circle
作为点坐标,需要更新为marker
符号。当我更新代码中的symbox时,映射默认为圆形。
data.append({
"type": "scattermapbox",
"lat": df['Lat'],
"lon": df['Long'],
"name": "Location",
#"hovertext": rent,
"showlegend": False,
"hoverinfo": "text",
"mode": "markers",
"customdata": df.loc[:,cd_cols].values,
"marker": {
"symbol": "marker", | defaults to circle
# "size": 18,
"opacity": 0.8,
#"color": "black"
}
}
)
marker
是基于以下文档的有效符号框:
https://plotly.com/python/reference/scattermapbox/#scattermapbox-marker-symbol https://labs.mapbox.com/maki-icons/
推荐答案
- 请参考此答案How to create a symbol/button on a Plotly choropleth map以了解部分解释。在绘图地图框 中,简单的标记图标不能用作标记
- 我已经采取了从maki或font-awed中为标记采购SVG的方法,然后将其转换为Geojson
- 为此,我们从英国医院采购,并使用了黑色记号笔
- 如果你想要悬停信息,还是值得使用圆形标记的。您不会从布局/层中获得任何内容
import geopandas as gpd
import pandas as pd
import requests, io
import plotly.graph_objects as go
import shapely.geometry
import svgpath2mpl
import numpy as np
# create shapely multi-polygon from maki or font-awesome SVG path
def marker(name="star", source="fa"):
def to_shapely(mpl, simplify=0):
p = shapely.geometry.MultiPolygon(
[shapely.geometry.Polygon(a).simplify(simplify) for a in mpl]
)
p = shapely.affinity.affine_transform(
p,
[1, 0, 0, -1, 0, 0],
)
scale = 1 if source == "maki" else 10 ** -2
p = shapely.affinity.affine_transform(
p,
[1, 0, 0, 1, -p.centroid.x, -p.centroid.y],
)
return shapely.affinity.affine_transform(
p,
[scale, 0, 0, scale, -p.centroid.x, -p.centroid.y],
)
if source == "maki":
url = f"https://raw.githubusercontent.com/mapbox/maki/main/icons/{name}.svg"
elif source == "fa":
url = f"https://raw.githubusercontent.com/FortAwesome/Font-Awesome/master/svgs/{name}.svg"
svgpath = pd.read_xml(requests.get(url).text).loc[0, "d"]
return to_shapely(svgpath2mpl.parse_path(svgpath).to_polygons())
# create mapbox layers for markers. icon defines layer and color
def marker_mapbox(
df,
size=0.01,
color="blue",
lat="lat",
lon="lon",
):
layers = []
m = marker("marker", "maki")
geoms = [
shapely.affinity.affine_transform(m, [size, 0, 0, size, r[lon], r[lat]])
for _, r in df.iterrows()
]
layers.append(
{
"source": gpd.GeoSeries(geoms).__geo_interface__,
"type": "fill",
"color": color,
}
)
return layers
df = pd.read_csv(
io.StringIO(requests.get("https://assets.nhs.uk/data/foi/Hospital.csv").text),
sep="Č",
engine="python",
).rename(columns={"Latitude": "Lat", "Longitude": "Long"})
df = df.sample(50)
cd_cols = ["SubType", "Sector"]
data = []
data.append(
{
"type": "scattermapbox",
"lat": df["Lat"],
"lon": df["Long"],
"name": "Location",
# "hovertext": rent,
"showlegend": False,
"hoverinfo": "text",
"mode": "markers",
"customdata": df.loc[:, cd_cols].values,
# "marker": {
# "symbol": "marker",
# # "size": 18,
# "opacity": 0.8,
# # "color": "black"
# },
}
)
fig = go.Figure(data).update_layout(
mapbox={
"style": "carto-positron",
"center": df.sample(1)
.loc[:, ["Lat", "Long"]]
.rename(columns={"Lat": "lat", "Long": "lon"})
.to_dict("records")[0],
"zoom": 4,
},
margin={"t": 0, "b": 0, "l": 0, "r": 0},
)
# add the markers as geojson layer...
fig.update_layout(
mapbox={
"layers": marker_mapbox(df, size=0.05, lat="Lat", lon="Long", color="black")
}
)
这篇关于打印散布图框上的标记图标未更新的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文