求助:如何基于Pandas DataFrame绘制类似PowerBI的合规率折线图
在Python中绘制PowerBI风格的Adesão折线图
步骤1:导入必要的库
我们需要用pandas处理数据,matplotlib实现折线图绘制:
import pandas as pd import matplotlib.pyplot as plt
步骤2:加载/准备数据
如果你的数据存储在CSV或Excel文件中,用对应方法读取;这里先模拟一份带日期维度的示例数据(对应PowerBI折线图的X轴):
# 加载真实数据请替换为以下代码(根据文件类型选择): # df = pd.read_csv("你的数据文件路径.csv") # df = pd.read_excel("你的数据文件路径.xlsx") # 模拟示例数据(包含日期和Ação列) data = { "Data": pd.date_range(start="2024-01-01", periods=30, freq="D"), "Ação": ["Água e sabonete", "Fricção com álcool", "Outro", "Água e sabonete"] * 7 + ["Fricção com álcool", "Outro"] } df = pd.DataFrame(data)
步骤3:计算Adesão度量值
完全对应你PowerBI中的DAX逻辑,按折线图的维度(比如日期)分组,计算每个分组内目标动作的数量占总动作数的比值:
# 定义需要统计的目标动作类别 target_actions = ["Água e sabonete", "Fricção com álcool"] # 按维度分组计算Adesão(若X轴是其他维度,替换groupby的参数即可) df_adesao = df.groupby("Data").apply( lambda group: group[group["Ação"].isin(target_actions)].shape[0] / group["Ação"].shape[0] ).reset_index(name="Adesão") # 处理除零情况(某分组无Ação数据时,占比设为0,对应DAX的DIVIDE容错逻辑) df_adesao["Adesão"] = df_adesao["Adesão"].fillna(0)
步骤4:绘制折线图
用matplotlib实现和PowerBI风格一致的折线图:
# 设置图形大小 plt.figure(figsize=(10, 6)) # 绘制折线并添加标记点 plt.plot(df_adesao["Data"], df_adesao["Adesão"], marker='o', linestyle='-', color='#0078D4', linewidth=2) # 添加标题和坐标轴标签 plt.title("Adesão ao Protocolo de Higiene", fontsize=14, pad=15) plt.xlabel("Data", fontsize=12) plt.ylabel("Proporção de Ações", fontsize=12) # 旋转X轴标签避免重叠 plt.xticks(rotation=45, ha='right') # 添加网格线增强可读性 plt.grid(True, alpha=0.3) # 自动调整布局 plt.tight_layout() # 显示图形 plt.show()
关键说明
- 若折线图X轴不是日期(比如部门、班次),只需将
groupby("Data")替换为groupby("你的维度列名")。 - 确保
target_actions中的字符串和数据中Ação列的取值完全匹配(注意重音等特殊字符)。 - 除零处理逻辑和PowerBI的
DIVIDE函数一致,避免无数据分组的报错。
内容的提问来源于stack exchange,提问作者Amaro Neto
相关产品推荐
相关产品推荐

