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

如何在Plotly中将两个imshow图层同图展示并添加透明度滑块?

Plotly实现双图像同位置叠加与透明度滑块控制

需求:将两张通过px.imshow生成的图像在同一画布的同一位置叠加显示,同时通过滑块控制图像透明度。现有代码会将两张图分别显示在不同标签页,需修改实现同图叠加效果,参考Matplotlib的等效实现逻辑。

解决方案代码

import plotly.express as px
import numpy as np
from skimage import io

# 加载底层图像
img = io.imread('https://upload.wikimedia.org/wikipedia/commons/thumb/0/00/Crab_Nebula.jpg/240px-Crab_Nebula.jpg')
fig = px.imshow(img)

# 生成上层随机图像
x = np.random.random((100, 200))
# 将上层图像作为新trace添加到同一figure
fig.add_trace(px.imshow(x).data[0])

# 配置透明度滑块
fig.update_layout(
    sliders=[{
        'active': 5,
        'currentvalue': {'prefix': '上层透明度: '},
        'pad': {'t': 50},
        'steps': [{
            'method': 'update',
            'args': [
                {'opacity': [1, val]},  # 底层图像保持不透明(opacity=1),上层图像随滑块改变
                {'sliders[0].currentvalue.value': round(val, 1)}
            ],
            'label': f'{round(val, 1)}'
        } for val in np.arange(0, 1.1, 0.1)]
    }]
)

# 统一轴范围,确保图像对齐
fig.update_xaxes(range=[0, img.shape[1]])
fig.update_yaxes(range=[0, img.shape[0]])

fig.show()

关键实现说明

  • 图像叠加:通过fig.add_trace()将第二张图像的trace并入同一个figure,而非创建独立figure,实现同位置显示
  • 滑块控制:利用Plotly的sliders布局组件,通过update方法动态修改上层trace的opacity参数,实时调整透明度
  • 对齐处理:通过update_xaxes和update_yaxes设置一致的轴范围,避免两张图像错位

扩展:双图像独立透明度控制

若需要同时控制两张图像的透明度,可调整滑块逻辑,分别设置两个trace的opacity值:

# 示例:双滑块分别控制两张图透明度
fig.update_layout(
    sliders=[
        {
            'name': '底层透明度',
            'active': 10,
            'currentvalue': {'prefix': '底层: '},
            'pad': {'t': 100},
            'steps': [{
                'method': 'update',
                'args': [{'opacity': [val, 0.5]}, {'sliders[0].currentvalue.value': round(val,1)}],
                'label': f'{round(val,1)}'
            } for val in np.arange(0,1.1,0.1)]
        },
        {
            'name': '上层透明度',
            'active': 5,
            'currentvalue': {'prefix': '上层: '},
            'pad': {'t': 50},
            'steps': [{
                'method': 'update',
                'args': [{'opacity': [1, val]}, {'sliders[1].currentvalue.value': round(val,1)}],
                'label': f'{round(val,1)}'
            } for val in np.arange(0,1.1,0.1)]
        }
    ]
)

内容的提问来源于stack exchange,提问作者Basj

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 08:40:31