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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 22:05:32