打印散布图框上的标记图标未更新 [英] marker icon on plotly scattermapbox not updating

查看:20
本文介绍了打印散布图框上的标记图标未更新的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在使用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以了解部分解释。在绘图地图框
  • 中,简单的标记图标不能用作标记
  • 我已经采取了从makifont-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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆