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

Plotly子图色标刻度字体调整及子图尺寸优化问题

Plotly子图色标字体调整与布局重构解决方案

一、解决色标(Colorbar)数字字体大小不生效问题

使用update_coloraxes(colorbar_tickfont_size=30)无效的原因是:每个3D Surface的色标独立绑定到自身trace,而非全局共享coloraxis。提供两种解决方式:

方式1:逐个trace定义色标字体

创建go.Surface时,通过colorbar参数直接指定字体大小:

fig.add_trace(go.Surface(z=Real_df.values.tolist(), colorscale="jet", colorbar=dict(tickfont=dict(size=30), x=0.2)), 1, 1)
fig.add_trace(go.Surface(z=Model_df.values.tolist(), colorscale="jet", colorbar=dict(tickfont=dict(size=30), x=0.45)), 1, 2)
fig.add_trace(go.Surface(z=Error_df.values.tolist(), colorscale="jet", colorbar=dict(tickfont=dict(size=30), x=0.75)), 1, 3)
fig.add_trace(go.Surface(z=Product_df.values.tolist(), colorscale="jet", colorbar=dict(tickfont=dict(size=30), x=1.05)), 1, 4)

方式2:批量修改所有Surface的色标

用update_traces统一设置所有3D曲面的色标属性:

fig.update_traces(
    selector=dict(type='surface'),
    colorbar=dict(tickfont=dict(size=30))
)

二、实现主图占3行,其余子图单列堆叠的布局

要让左侧主图占3行1列,右侧三个子图垂直堆叠,需重构make_subplots参数:

  • 设置总行数3、总列数2
  • 给主图添加rowspan=3属性,使其跨3行显示
  • 右侧三个子图分别对应每行的第二列

修改后的完整代码

import pandas as pd
import plotly.graph_objects as go
from plotly.subplots import make_subplots
import numpy as np

# 加载数据集
Real_df = pd.read_csv("https://raw.githubusercontent.com/plotly/datasets/master/volcano.csv")
Model_df = Real_df[np.random.default_rng(seed=42).permutation(Real_df.columns.values)]
Error_df = pd.DataFrame(np.random.randint(0,5,size=(87, 61)), columns=Real_df.columns)
Product_df = Model_df * Error_df  

# 创建子图布局:主图跨3行,右侧3个子图各占1行
fig = make_subplots(
    rows=3, cols=2,
    specs=[
        [{'is_3d': True, 'rowspan': 3}, {'is_3d': True}],
        [None, {'is_3d': True}],
        [None, {'is_3d': True}]
    ],
    subplot_titles=['True', 'Model', 'Error Percentage', 'Error_Model'],
)

# 添加主图(跨3行,放在第1行第1列)
fig.add_trace(
    go.Surface(z=Real_df.values.tolist(), colorscale="jet", colorbar=dict(tickfont=dict(size=30), x=0.2)),
    row=1, col=1
)

# 添加右侧三个子图
fig.add_trace(
    go.Surface(z=Model_df.values.tolist(), colorscale="jet", colorbar=dict(tickfont=dict(size=30), x=0.6)),
    row=1, col=2
)
fig.add_trace(
    go.Surface(z=Error_df.values.tolist(), colorscale="jet", colorbar=dict(tickfont=dict(size=30), x=0.85)),
    row=2, col=2
)
fig.add_trace(
    go.Surface(z=Product_df.values.tolist(), colorscale="jet", colorbar=dict(tickfont=dict(size=30), x=1.1)),
    row=3, col=2
)

# 更新布局尺寸
fig.update_layout(
    width=1200,
    height=800,
    autosize=False,
    margin=dict(t=50, b=0, l=0, r=100),
    template="plotly_white",
)

# 更新3D场景比例
fig.update_scenes(
    aspectratio=dict(x=1, y=1, z=0.7),
    aspectmode="manual"
)

fig.show()

关键布局说明

  • specs中的rowspan=3让主图自动拉伸至3行高度,右侧每行对应一个子图
  • 调整色标x位置避免重叠,同时统一设置字体大小为30

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 16:35:13