如何用Pandas的Plotly后端绘制多图?尺寸与颜色设置方法
Pandas + Plotly 实现多图布局、尺寸调整与颜色设置
问题背景
需要用Pandas结合Plotly后端实现2行1列、共享X轴的多图布局,解决当前代码中figsize无法调整图表尺寸的问题,同时掌握自定义图表颜色的方法。原Matplotlib实现的参考代码如下:
f, (ax1,ax2) = plt.subplots(2, 1, figsize=(8,5), sharex=True) data.plot(y=['vl', 'bench'], title='Fonds vs Bench', ax=ax1) data.plot(y='aum', title='AuM du fonds',ax=ax2);
1. 实现共享X轴的2行1列布局
Plotly后端与Matplotlib的布局逻辑不同,无法直接复用plt.subplots的方式,需借助Plotly的make_subplots创建子图框架,再将Pandas生成的图表轨迹添加到对应子图中:
import pandas as pd import plotly.graph_objects as go from plotly.subplots import make_subplots # 切换Plotly为Pandas绘图后端 pd.options.plotting.backend = "plotly" # 创建2行1列子图,开启X轴共享,设置子图标题 fig = make_subplots( rows=2, cols=1, shared_xaxes=True, subplot_titles=("Fonds vs Bench", "AuM du fonds") ) # 生成第一个图表的轨迹并添加到第一行子图 chart1 = data.plot(y=['vl', 'bench'], title='') # 关闭自动标题,使用子图统一标题 for trace in chart1.data: fig.add_trace(trace, row=1, col=1) # 生成第二个图表的轨迹并添加到第二行子图 chart2 = data.plot(y='aum', title='') for trace in chart2.data: fig.add_trace(trace, row=2, col=1) # 统一调整整体布局并展示 fig.update_layout(title_text="组合分析图表") fig.show()
2. 有效调整图表尺寸
Plotly不支持figsize参数(该参数为Matplotlib专属),需通过update_layout的width和height参数设置,单位为像素:
# 调整为近似8x5英寸的尺寸(按96dpi换算:8*96=768,5*96=480) fig.update_layout( width=768, height=480, title_text="组合分析图表" ) fig.show()
你可以根据需求直接修改width和height的数值,灵活调整图表大小。
3. 自定义图表颜色
方法1:在Pandas绘图时直接指定颜色
通过color参数传入颜色列表,与y轴列名一一对应:
chart1 = data.plot( y=['vl', 'bench'], color=['#E74C3C', '#2ECC71'], # 自定义颜色(红色、绿色) title='' )
方法2:添加轨迹后批量修改颜色
利用update_traces结合选择器精准修改指定轨迹的颜色:
# 修改'vl'系列为橙色,'bench'系列为蓝色 fig.update_traces(line=dict(color='#F39C12'), selector=dict(name='vl')) fig.update_traces(line=dict(color='#3498DB'), selector=dict(name='bench'))
方法3:直接用Plotly API绘制(更灵活)
跳过Pandas的plot方法,直接使用Plotly的go.Scatter定义轨迹并设置颜色:
fig.add_trace( go.Scatter( x=data.index, y=data['vl'], name='vl', line=dict(color='#E74C3C') # 自定义颜色 ), row=1, col=1 ) fig.add_trace( go.Scatter( x=data.index, y=data['bench'], name='bench', line=dict(color='#2ECC71') ), row=1, col=1 ) fig.add_trace( go.Scatter( x=data.index, y=data['aum'], name='aum', line=dict(color='#9B59B6') ), row=2, col=1 )
内容的提问来源于stack exchange,提问作者Jacques Tebeka
相关产品推荐
相关产品推荐

