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

基于ipywidgets与io添加“显示所有图表”选项的实现问题

解决ipywidgets选择“all”显示所有图表的问题

你当前的代码在选择单个riskdriver(rd)时能正常显示,但选“all”时会报错,因为my_results字典里没有“all”这个键。要实现选“all”时展示所有图表,可以分情况处理:单个图表时显示单张图,选“all”时要么将所有图表拼接成一张组合图,要么逐个独立显示。

方案1:拼接成一张组合图显示

这种方案会把4个图表放在同一个画布上,整体展示:

import matplotlib.pyplot as plt
import numpy as np
import io
from PIL import Image
from ipywidgets import interact

@interact(rd=['all', 'rd1', 'rd2', 'rd3', 'rd4'])
def display_plot(rd):
    my_results = {}
    # 循环变量改用rd_name,避免覆盖函数输入参数rd
    for rd_name in ['rd1', 'rd2', 'rd3', 'rd4']:
        f = io.BytesIO()
        a = np.random.rand(10)
        plt.bar(range(len(a)), a)
        plt.savefig(f, format="png")
        my_results[rd_name] = f
        plt.close()

    if rd == 'all':
        # 创建2x2的子图布局
        fig, axes = plt.subplots(2, 2, figsize=(12, 8))
        axes = axes.flatten()
        for idx, rd_name in enumerate(['rd1', 'rd2', 'rd3', 'rd4']):
            # 读取保存的图表数据
            img_data = my_results[rd_name].getvalue()
            img = Image.open(io.BytesIO(img_data))
            # 在子图中加载并显示图表
            axes[idx].imshow(img)
            axes[idx].set_title(rd_name)
            axes[idx].axis('off')
        plt.tight_layout()
        # 保存组合图到BytesIO
        combined_f = io.BytesIO()
        plt.savefig(combined_f, format="png")
        plt.close()
        # 显示最终的组合图
        display(Image.open(io.BytesIO(combined_f.getvalue())))
    else:
        # 显示单个选中的图表
        img = Image.open(io.BytesIO(my_results[rd].getvalue()))
        display(img)

关键修改点:

  • 修复变量重名:把循环里的rd改为rd_name,避免覆盖函数的输入参数,这是原代码的潜在问题
  • 新增“all”分支逻辑:创建子图布局,将每个保存的图表加载后放入对应子图,最后组合成一张图展示
  • 优化布局:用plt.tight_layout()自动调整子图间距,避免标题和图表重叠

方案2:逐个独立显示所有图表

如果不需要拼接成一张图,也可以选择“all”时依次展示四个独立的图表:

import matplotlib.pyplot as plt
import numpy as np
import io
from PIL import Image
from ipywidgets import interact

@interact(rd=['all', 'rd1', 'rd2', 'rd3', 'rd4'])
def display_plot(rd):
    my_results = {}
    for rd_name in ['rd1', 'rd2', 'rd3', 'rd4']:
        f = io.BytesIO()
        a = np.random.rand(10)
        plt.bar(range(len(a)), a)
        plt.savefig(f, format="png")
        my_results[rd_name] = f
        plt.close()

    if rd == 'all':
        # 遍历所有rd,逐个显示对应的图表
        for rd_name in ['rd1', 'rd2', 'rd3', 'rd4']:
            img = Image.open(io.BytesIO(my_results[rd_name].getvalue()))
            display(img)
    else:
        img = Image.open(io.BytesIO(my_results[rd].getvalue()))
        display(img)

这个方案逻辑更简单,展示的是四个独立的图表,适合需要分别查看每个rd细节的场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 05:17:22