You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何调整Plotly离散choropleth的图例元素大小,解决高分辨率导出不可读问题

问题描述

我使用Python开发,相关解决方案不局限于特定编程语言。我通过plotly.express创建了离散choropleth mapbox地图,但高分辨率导出成果时,图例的字体、配色元素几乎无法读取。我了解Plotly通过叠加多个trace生成离散图表,不确定是否可在trace或figure层级调整解决该问题。

原实现代码

import numpy as np
import pandas as pd
import plotly.express as px

DISCRETE = 11

def gen_colorscale(obs, color="viridis"):
    color = px.colors.sample_colorscale(color, obs)
    p1 = tuple(zip(np.linspace(0, 1, obs+1)[:-1], color))
    p2 = tuple(zip(np.linspace(0, 1, obs+1)[1:], color))
    cs = []
    for a, b in zip(p1, p2):
        cs.append(a)
        cs.append(b)
    return cs

cs = gen_colorscale(DISCRETE)

# 颜色范围
cr = [0, 10000]
# 刻度值
v = np.linspace(*cr, DISCRETE)
vt = (
    pd.DataFrame(v, columns=["v"])
    .apply(lambda v: (v / 10 ** 3).round(1))
    .apply(lambda v: v.astype(str) + "k to " + v.shift(-1).astype(str) + "k")
    .values
)
vt[0] = v[0].astype(str) + " to " + (v[1] / 10 ** 3).round(1).astype(str) + "k"
vt[-1] = ">" + (v[-1] / 10 ** 3).round(1).astype(str) + "k"

fig = px.choropleth_mapbox(
    df,
    geojson=counties,
    locations="fips",
    color="migration",
    range_color=[cr[0], cr[1] + cr[1]/(DISCRETE-1)],
    color_continuous_scale=cs,
    labels={"migration": "Migration (k)"},
    center={"lat": 37.0902, "lon": -95.7129},
    zoom=4.2,
    opacity=1.0,
    mapbox_style="white-bg",
)
fig.update_layout(
    mapbox_style="mapbox://styles/ryangilland/ckwqzs8ck0h5f14nybww9c5ts",
    mapbox_accesstoken=token,
    coloraxis_colorbar=dict(
        tickvals=np.linspace(cr[0]+cr[1]/(DISCRETE-1)/2,cr[1] + cr[1]/(DISCRETE-1)/2,DISCRETE),
        ticktext=vt,
        len=0.8,
        thickness=50,
        xanchor="right",
        x=1.0,
        bgcolor="rgba(22,33,49,1)",
        tickfont=dict(color="rgba(255,255,255,1)"),
    ),
    margin=dict(l=0, r=0, b=50, t=75, pad=4),
    paper_bgcolor="rgba(8,18,23,1)",
    plot_bgcolor="rgba(8,18,23,1)",
)
fig.show()

修复方案

该问题是高分辨率导出时,图例的字体、尺寸参数没有适配放大导致的,可通过以下修改解决:

  • 显式设置图例字体大小,在coloraxis_colorbar配置中添加tickfont.size和title.font.size参数,取值根据你的导出分辨率调整,通常高分辨率下设置为18~28即可正常读取
  • 调整导出配置,导出时不要单独拉高scale参数,直接指定像素尺寸,避免元素等比缩小:
# 示例4K分辨率导出配置
fig.update_layout(
    coloraxis_colorbar=dict(
        tickfont=dict(size=22),
        title=dict(font=dict(size=24, color="rgba(255,255,255,1)"))
    )
)
# 直接指定4K像素尺寸,scale保持1即可
fig.write_image("high_res_map.png", width=3840, height=2160, scale=1)
  • 如果需要更稳定的离散图例,可提前对migration字段做分箱处理,改用color_discrete_map配置离散配色,避免用连续色阶模拟离散效果的渲染异常。

内容的提问来源于stack exchange,提问作者hillard28

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 02:24:03