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

如何用ipywidgets实现主图叠加可交互图形并调节对比度?

解决方案:将螺旋绘图与对比度调节整合到同一主图

我来帮你搞定这个合并需求!问题出在你用了两个独立的@interact函数,它们各自生成了独立的绘图对象。我们只需要把所有交互逻辑整合到同一个函数里,让所有操作都作用在同一个主图上就行。

核心修改思路

  • 提前创建固定的绘图轴对象(ax),确保所有绘图都在这个轴上进行
  • 将螺旋控制参数和对比度参数都放到同一个@interact的参数列表中
  • 每次交互时先清空当前轴的内容,再按顺序绘制主图(带对比度)和螺旋图形

完整代码示例

import matplotlib.pyplot as plt
import numpy as np
from ipywidgets import interact

# 假设你已经定义了qphi这个主图数据(这里用随机数据做示例,你替换成自己的即可)
qphi = np.random.rand(300, 300)

# 创建固定的绘图对象,所有操作都基于这个ax
fig, ax = plt.subplots(figsize=(24, 24))

@interact(
    # 螺旋控制参数
    Spiral=False,
    n=2000,
    x1=50,
    y1=50,
    z1=50,
    k1=300,
    # 对比度调节参数
    vuc=(0.2, 1, 0.01),
    vlc=(0.1, 1, 0.01)
)
def update_plot(Spiral, n, x1, y1, z1, k1, vuc, vlc):
    # 清空当前轴的内容,避免多次绘图叠加混乱
    ax.clear()
    
    # 1. 绘制带对比度调节的主图
    vu = np.quantile(qphi, vuc)
    vl = np.quantile(qphi, vlc)
    print(f"upper = {vu:.4f}, lower = {vl:.4f}")
    im = ax.imshow(qphi, origin='lower', vmin=vl, vmax=vu)
    
    # 2. 绘制螺旋图形(如果开启Spiral选项)
    if Spiral:
        angle = np.linspace(x1, y1 * np.pi, n)
        radius = np.linspace(z1, k1, n)
        x = radius * np.cos(angle) + 150  # +150是让螺旋居中,对应主图的尺寸
        y = radius * np.sin(angle) + 150
        ax.scatter(x, y, s=3, c='black')
    else:
        # 未开启时绘制原点
        ax.scatter(0, 0, s=3, c='black')

plt.show()

关键细节说明

  • 共享绘图轴:用plt.subplots()创建的ax是固定的,所有绘图操作都指向它,不会生成新的窗口
  • 清轴操作:ax.clear()确保每次交互时都是重新绘制,避免旧图形残留
  • 绘图顺序:先画主图imshow,再画螺旋scatter,这样螺旋会显示在主图上方
  • 参数整合:把所有需要交互调节的参数都放到同一个@interact里,用户可以在同一个控件面板里调节所有选项

这样修改后,你就能在同一个主图上既调节对比度,又切换/调整螺旋的形状了!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 13:27:41