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
相关产品推荐
相关产品推荐

