如何在Plotly中使用for循环声明多个y轴
Plotly多Y轴循环配置解决方案
**kwargs是该场景的最优方案,完全不需要使用globals(),你想到的字典生成思路是完全可行的,只需调整格式即可直接使用。
原有写法错误原因
- 你尝试的
globals()写法本身不符合Python语法:不能在update_layout()的实参列表内直接写for循环,同时globals()是用来操作全局作用域变量的,和给Plotly方法传参没有关联,完全不需要在该场景使用 - 你不需要修改任何trace相关代码,仅需预先生成匹配Plotly布局参数名的Y轴配置字典,再通过
**运算符展开传入update_layout()即可
可运行的实现代码
import plotly.graph_objects as go fig = go.Figure() # Trace代码完全保留不修改 fig.add_trace(go.Scatter( x=[1, 2, 3], y=[4, 5, 6], name="yaxis1 data" )) fig.add_trace(go.Scatter( x=[2, 3, 4], y=[40, 50, 60], name="yaxis2 data", yaxis="y2" )) fig.add_trace(go.Scatter( x=[4, 5, 6], y=[40000, 50000, 60000], name="yaxis3 data", yaxis="y3" )) fig.add_trace(go.Scatter( x=[5, 6, 7], y=[400000, 500000, 600000], name="yaxis4 data", yaxis="y4" )) # 预定义每个Y轴的配置参数,索引对应轴序号 axis_config = [ {}, # 索引0占位无意义 {"color": "#1f77b4", "anchor": "x", "side": "left", "position": None}, {"color": "#ff7f0e", "anchor": "free", "side": "left", "position": 0.15}, {"color": "#d62728", "anchor": "x", "side": "right", "position": None}, {"color": "#9467bd", "anchor": "free", "side": "right", "position": 0.85} ] # 生成Y轴配置字典 y_axis_layout = {} for i in range(1, 5): axis_key = "yaxis" if i == 1 else f"yaxis{i}" y_axis_layout[axis_key] = dict( title=f"yaxis{i} title", titlefont=dict(color=axis_config[i]["color"]), tickfont=dict(color=axis_config[i]["color"]), anchor=axis_config[i]["anchor"], overlaying="y", side=axis_config[i]["side"] ) if axis_config[i]["position"]: y_axis_layout[axis_key]["position"] = axis_config[i]["position"] # 用**展开字典传参 fig.update_layout( xaxis=dict(domain=[0.3, 0.7]), **y_axis_layout, title_text="multiple y-axes example", width=800 ) fig.show()
方案优势
该写法扩展性极强,后续如果需要新增Y轴,仅需在axis_config中新增对应配置项、修改循环的range上限即可,不需要调整任何trace代码。
内容的提问来源于stack exchange,提问作者Luis Enriquez-Contreras
相关产品推荐
相关产品推荐

