求助修正Plotly.go代码:绘制不同年份、引擎及厂商的车辆数量饼图
修正后的代码实现方案
核心思路
- 放弃对年份的求和操作,改为按制造商、引擎类型、年份三重分组统计车辆数量
- 构建以制造商为纵向维度、引擎类型为横向维度的子图矩阵
- 为每个子图填充对应分组的饼图数据,无数据的子图做空值提示处理
完整代码
import pandas as pd import plotly.graph_objects as go from plotly.subplots import make_subplots # 1. 读取并清洗数据(可根据实际数据调整清洗逻辑) df = pd.read_csv("data.csv") # 保留关键字段并剔除缺失值 clean_df = df[["制造商", "引擎类型", "年份"]].dropna() # 统一年份格式为整数,避免统计异常 clean_df["年份"] = clean_df["年份"].astype(int) # 2. 三重分组统计各组合下的车辆数量 grouped_data = clean_df.groupby(["制造商", "引擎类型", "年份"]).size().reset_index(name="车辆数量") # 3. 获取唯一的制造商和引擎类型,用于构建子图矩阵 unique_manufacturers = sorted(clean_df["制造商"].unique()) unique_engine_types = sorted(clean_df["引擎类型"].unique()) # 4. 创建子图矩阵:纵向为制造商,横向为引擎类型 fig = make_subplots( rows=len(unique_manufacturers), cols=len(unique_engine_types), subplot_titles=[f"{eng} - {man}" for man in unique_manufacturers for eng in unique_engine_types], specs=[[{"type": "pie"} for _ in unique_engine_types] for _ in unique_manufacturers] ) # 5. 为每个子图填充对应数据 for row_idx, manufacturer in enumerate(unique_manufacturers, start=1): for col_idx, engine_type in enumerate(unique_engine_types, start=1): # 筛选当前制造商+引擎类型的分组数据 subset = grouped_data[(grouped_data["制造商"] == manufacturer) & (grouped_data["引擎类型"] == engine_type)] if not subset.empty: fig.add_trace( go.Pie( labels=subset["年份"], values=subset["车辆数量"], name=f"{manufacturer} - {engine_type}" ), row=row_idx, col=col_idx ) else: # 无数据时添加提示文本 fig.add_annotation( text="无数据", xref=f"x{col_idx}", yref=f"y{row_idx}", x=0.5, y=0.5, showarrow=False, font={"size": 14} ) # 6. 调整整体布局 fig.update_layout( height=300 * len(unique_manufacturers), # 根据制造商数量动态调整高度 width=400 * len(unique_engine_types), # 根据引擎类型数量动态调整宽度 title_text="各制造商-引擎类型组合下的车辆年份分布", showlegend=False ) fig.show()
关键修正点说明
- 用
groupby(...).size()替代年份求和操作,准确统计每组的车辆实际数量 - 新增
引擎类型维度到分组逻辑中,覆盖需求的横向矩阵维度 - 动态生成子图矩阵,适配数据中不同的制造商和引擎类型数量
- 处理无数据的子图,避免出现空饼图影响展示效果
内容的提问来源于stack exchange,提问作者user20637309
相关产品推荐
相关产品推荐

