如何调整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
相关产品推荐
相关产品推荐

