Plotly - 使用跟踪标记标签作为图例

问题描述 投票:0回答:1

geojson地图从这里下载:https://github.com/codeforgermany/click_that_hood/blob/main/public/data/ireland-counties.geojson

我想创建一个由标记区域覆盖中的标签组成的图例。这是到目前为止的代码:

import geojson
import pandas as pd
import plotly.graph_objects as go

with open("data/ireland-with-counties_.geojson") as f:
    gj = geojson.load(f)
    
# example df    
metadata = pd.DataFrame({'ID':['AH1','AT10B','BA1','BC1','BG18'],
             'Site':['Athea','Athenry','Ballyhaise','Belcoo','Ballynagree'],
             'Latitude':[52.457079,53.287512,54.050665,54.280660,51.988472],
             'Longitude':[-9.309839,-8.768810,-7.324268,-7.684888,-8.926938]})
    
# generating random hex colours
import random
r = lambda: random.randint(0,255)
hex_codes = []
for x in range(0,len(metadata['Site'])):
    hex_codes.append('#%02X%02X%02X' % (r(),r(),r()))
colors = dict(zip(metadata['Site'].to_list(),hex_codes))
    
pts = []
for feature in gj['features']:
    if feature['geometry']['type'] == 'Polygon':
        pts.extend(feature['geometry']['coordinates'][0])    
        pts.append([None, None])#mark the end of a polygon   
        
    elif feature['geometry']['type'] == 'MultiPolygon':
        for polyg in feature['geometry']['coordinates']:
            pts.extend(polyg[0])
            pts.append([None, None])#end of polygon
    elif feature['geometry']['type'] == 'LineString': 
        points.extend(feature['geometry']['coordinates'])
        points.append([None, None])
    else: pass           
    #else: raise ValueError("geometry type irrelevant for map")

x, y = zip(*pts)    

fig = go.Figure()
fig.add_scatter(x=x, y=y, mode='lines', line_color='#999999', line_width=1.5)
fig.update_layout(width=600,  height=800)

fig.add_trace(
    go.Scatter(
        x=metadata['Longitude'],
        y=metadata['Latitude'],
        text = metadata['Site'],
        hoverinfo = 'text',
        mode = 'markers',
        name = "location",
        marker=dict(size=8, color='rgba(255,255,255,0)',
                    line=dict(color=metadata['Site'].map(colors),
                    colorscale='plasma', width=2)
                   ))
)

fig.show()

目前标签仅在悬停时显示 - 如何让标记标签出现在图例中?例如:

python plotly geojson
1个回答
0
投票

在 Plotly 中,默认情况下,标记的标签不会自动出现在图例中。但是,您可以通过为要在图例中显示的每个标签/颜色组合创建“代理”跟踪来实现此目的。这些代理轨迹本质上是虚拟轨迹,不会向绘图添加任何可见元素,但用于创建图例条目。

以下是修改代码以在图例中显示标记标签的方法:

import geojson
import pandas as pd
import plotly.graph_objects as go

# Your code for loading geojson and metadata...

# Rest of your code...

# Create the proxy traces for legend entries
legend_traces = []
for site, color in colors.items():
    legend_trace = go.Scatter(
        x=[None],
        y=[None],
        name=site,
        mode='markers',
        marker=dict(size=8, color=color, line=dict(color=color, width=2))
    )
    legend_traces.append(legend_trace)

# Add the proxy traces to the figure
for legend_trace in legend_traces:
    fig.add_trace(legend_trace)

fig.show()

在此代码中,您将创建一个代理跟踪列表

(legend_traces)
,其中每个代理跟踪对应于
colors
字典中的标签/颜色组合。这些迹线没有实际的数据点,但它们的名称、模式和标记设置用于创建具有指定标签和颜色的图例条目。最后,您循环遍历代理轨迹并使用
fig.add_trace(legend_trace)
将它们添加到现有图形中。

当您运行此代码时,标记标签将与适当的颜色一起出现在图例中。

© www.soinside.com 2019 - 2024. All rights reserved.