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

如何用下拉组件高亮堆叠柱状图中选中的分类变量?

解决方案:用Matplotlib + ipywidgets实现交互式高亮堆叠柱状图

完全可以仅通过matplotlib和ipywidgets实现你要的功能,不需要额外依赖库。以下是具体实现思路和完整代码:

核心实现思路

  1. 手动绘制堆叠柱状图:放弃pandas封装的plot.bar()方法,直接用matplotlib的bar()函数绘制,这样能获取每个系列的柱子对象,方便后续单独修改样式。
  2. 创建交互控件:用ipywidgets的Dropdown组件生成类别选择菜单,绑定回调函数响应用户选择。
  3. 动态修改柱子样式:在回调函数中,根据选中的类别,给对应系列的柱子添加高亮边框,同时重置其他系列的边框样式,最后更新图表显示。

完整代码示例

import pandas as pd
import matplotlib.pyplot as plt
import ipywidgets as widgets
from IPython.display import display

# 准备数据
data = {"Production":[10000, 12000, 14000],
        "Sales":[9000, 10500, 12000]}
index = ["2017", "2018", "2019"]
df = pd.DataFrame(data=data, index=index)

# 创建画布和轴对象
fig, ax = plt.subplots(figsize=(8, 5))
x = range(len(df.index))
bar_width = 0.6

# 手动绘制堆叠柱状图,保存每个系列的柱子对象
bars_prod = ax.bar(x, df['Production'], bar_width, label='Production')
bars_sales = ax.bar(x, df['Sales'], bar_width, bottom=df['Production'], label='Sales')

# 设置图表基础样式
ax.set_title("Annual Production Vs Annual Sales")
ax.set_xticks(x)
ax.set_xticklabels(df.index, rotation=15)
ax.legend()

# 将柱子按类别分组,方便回调函数调用
bar_groups = {
    'Production': bars_prod,
    'Sales': bars_sales
}

# 定义高亮回调函数
def highlight_category(selected_category):
    # 重置所有柱子的边框样式为默认状态
    for _, bars in bar_groups.items():
        for bar in bars:
            bar.set_edgecolor('black')
            bar.set_linewidth(1)
    
    # 为选中类别的柱子添加高亮边框
    for bar in bar_groups[selected_category]:
        bar.set_edgecolor('red')
        bar.set_linewidth(3)
    
    # 更新图表显示
    fig.canvas.draw_idle()

# 创建下拉选择控件并绑定回调
dropdown = widgets.Dropdown(
    options=['Production', 'Sales'],
    value='Production',
    description='高亮类别:',
    disabled=False,
)
dropdown.observe(lambda change: highlight_category(change['new']), names='value')

# 显示控件和图表
display(dropdown)
plt.show()

关键细节说明

  • 手动绘图的必要性:pandas的plot.bar()虽然便捷,但无法直接获取每个系列的柱子集合,手动调用matplotlib的bar()函数能返回每个系列的BarContainer对象,里面包含了所有柱子的实例。
  • 边框样式修改:通过bar.set_edgecolor()设置边框颜色,bar.set_linewidth()设置边框宽度,这两个方法是实现高亮的核心。
  • 图表更新:修改柱子样式后,需要调用fig.canvas.draw_idle()触发图表重新渲染,确保交互效果实时生效。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 12:06:13