基于Plotly实现多饼图切换的下拉菜单开发求助
解决方案:用ipywidgets.interact实现饼图切换
第一步:DataFrame管理建议
直接把7个DataFrame合并成单个带标识列的DataFrame,比维护7个独立变量方便太多。给每个DF加一列客户画像类型(比如"类型A"、"类型B"...),用pd.concat合并后,后续筛选数据只需要按这个列过滤就行。
第二步:完整实现代码
假设你的每个DataFrame结构是:部门、区域1消费、区域2消费、区域3消费、区域4消费,以下是可直接复用的代码框架:
import pandas as pd import matplotlib.pyplot as plt from ipywidgets import interact # ---------------------- # 1. 替换成你自己的实际数据(这里是模拟7个DataFrame) df_list = [] for i in range(7): df = pd.DataFrame({ "部门": ["零售", "餐饮", "娱乐", "服务"], "区域1": [100+i*10, 80+i*8, 50+i*5, 30+i*3], "区域2": [120+i*12, 90+i*9, 60+i*6, 40+i*4], "区域3": [90+i*9, 70+i*7, 40+i*4, 25+i*2], "区域4": [110+i*11, 85+i*8, 55+i*5, 35+i*3] }) df["客户画像类型"] = f"类型{i+1}" df_list.append(df) # 合并成单个DataFrame combined_df = pd.concat(df_list, ignore_index=True) # ---------------------- # 2. 定义绘制饼图的函数 def plot_pie(customer_type): # 筛选当前选中的客户画像数据 filtered_df = combined_df[combined_df["客户画像类型"] == customer_type] # 创建4个子图(对应4个区域) fig, axes = plt.subplots(2, 2, figsize=(10, 8)) axes = axes.flatten() # 把2x2子图数组转成一维,方便循环 # 遍历每个区域绘制饼图 regions = ["区域1", "区域2", "区域3", "区域4"] for ax, region in zip(axes, regions): data = filtered_df[region].values labels = filtered_df["部门"].values ax.pie(data, labels=labels, autopct='%1.1f%%', startangle=90) ax.set_title(f"{region}消费占比") plt.tight_layout() plt.show() # 3. 创建下拉菜单交互 interact(plot_pie, customer_type=combined_df["客户画像类型"].unique())
关键说明
- 要是你坚持用7个独立DataFrame,也可以把它们放进一个字典(比如
df_dict = {"类型A": df_a, "类型B": df_b,...}),然后修改plot_pie里的筛选逻辑为filtered_df = df_dict[customer_type],效果一样,但合并成单个DF更易维护。 interact会自动根据传入的customer_type选项生成下拉菜单,每次切换时会调用plot_pie函数重新绘制图表。- 如果你原来的单个DF绘制代码是其他结构(比如每个区域是一行而非一列),只需要调整
plot_pie里的数据提取逻辑即可,核心思路不变。
内容的提问来源于stack exchange,提问作者pjb182
相关产品推荐
相关产品推荐

