如何在Plotly中实现指定两条曲线间的区域填充?
Plotly 实现指定曲线间区域填充的方案
要在Plotly中精准填充两条特定曲线之间的区域,避免误填充到其他曲线,核心是控制填充的目标范围,以下是两种可行方案:
方案1:通过轨迹顺序控制填充
将需要填充的目标曲线(红色series2)与对应的上下限曲线放在相邻位置,设置上下限曲线的fill='tonext'参数,确保填充仅发生在相邻的目标曲线上,不会干扰黑色曲线。
示例代码:
import plotly.graph_objects as go import numpy as np import pandas as pd # 生成数据 series1 = pd.Series(np.random.randn(100), index=pd.date_range('1/1/2000', periods=100)) series2 = series1 + np.random.randn(len(series1)) positive_contribution = series2 + 0.5 negative_contribution = series2 - 0.5 fig = go.Figure() # 先绘制不参与填充的黑色曲线 fig.add_trace(go.Scatter( x=series1.index, y=series1, mode='lines', line=dict(color='black'), name='黑色曲线' )) # 绘制下限曲线 + 填充到红色曲线(隐藏下限曲线本身) fig.add_trace(go.Scatter( x=negative_contribution.index, y=negative_contribution, mode='lines', line=dict(color='cyan', width=0), fill='tonext', fillcolor='rgba(0,255,255,0.2)', name='青色填充' )) # 绘制红色目标曲线(作为填充的终点) fig.add_trace(go.Scatter( x=series2.index, y=series2, mode='lines', line=dict(color='red'), name='红色曲线' )) # 绘制上限曲线 + 填充到红色曲线(隐藏上限曲线本身) fig.add_trace(go.Scatter( x=positive_contribution.index, y=positive_contribution, mode='lines', line=dict(color='orange', width=0), fill='tonext', fillcolor='rgba(255,165,0,0.2)', name='橙色填充' )) # 调整布局 fig.update_layout( xaxis_title='日期', yaxis_title='数值', showlegend=True ) fig.show()
方案2:自定义闭合多边形填充(无顺序限制)
直接拼接两条曲线的坐标点生成闭合多边形,用fill='toself'实现填充,这种方法完全不受其他曲线顺序影响,适合复杂多曲线场景。
示例代码:
import plotly.graph_objects as go import numpy as np import pandas as pd # 生成数据 series1 = pd.Series(np.random.randn(100), index=pd.date_range('1/1/2000', periods=100)) series2 = series1 + np.random.randn(len(series1)) positive_contribution = series2 + 0.5 negative_contribution = series2 - 0.5 fig = go.Figure() # 绘制所有基础曲线 fig.add_trace(go.Scatter( x=series1.index, y=series1, mode='lines', line=dict(color='black'), name='黑色曲线' )) fig.add_trace(go.Scatter( x=series2.index, y=series2, mode='lines', line=dict(color='red'), name='红色曲线' )) # 生成青色填充区域:拼接下限曲线和红色曲线的反向点,形成闭合多边形 cyan_x = np.concatenate([negative_contribution.index, series2.index[::-1]]) cyan_y = np.concatenate([negative_contribution.values, series2.values[::-1]]) fig.add_trace(go.Scatter( x=cyan_x, y=cyan_y, mode='none', fill='toself', fillcolor='rgba(0,255,255,0.2)', name='青色填充' )) # 生成橙色填充区域:拼接上限曲线和红色曲线的反向点 orange_x = np.concatenate([positive_contribution.index, series2.index[::-1]]) orange_y = np.concatenate([positive_contribution.values, series2.values[::-1]]) fig.add_trace(go.Scatter( x=orange_x, y=orange_y, mode='none', fill='toself', fillcolor='rgba(255,165,0,0.2)', name='橙色填充' )) fig.update_layout(xaxis_title='日期', yaxis_title='数值') fig.show()
方案对比
- 方案1代码简洁,依赖轨迹顺序,适合简单场景;
- 方案2完全独立于其他曲线,避免了数据随机性导致的填充错误,适合复杂多曲线场景。
内容的提问来源于stack exchange,提问作者AvMuni
相关产品推荐
相关产品推荐

