184_Python 在 Excel 和 Power BI 绘制堆积瀑布图

184_Python 在 Excel 和 Power BI 绘制堆积瀑布图

一、背景

在 2023 年 8 月 22 日 微软 Excel 官方宣布:在 Excel 原生内置的支持了 Python。博客原文

笔者第一时间就更新到了 Excel 的预览版,通过了漫长等待分发,现在可以体验了,先来看看效果。

  1. 在 Excel 公式选项卡下 Python 菜单
  2. 原来的 Excel 公示栏,左边多了一个PY的绿高亮区域输入 Python 代码。
  3. 在单元格区域直接可以展示出 Python 输出结果。

Power BI 公共 web 效果:https://demo.jiaopengzi.com/pbi/184-full.html

二、如何体验

1、首先需要是微软365用户才可以,其他用户目前无法体验,即便是发送给别人也看不到效果如下:

2、当前时间 Python 在 Excel 还是属于预览功能,所以需要把自己的 Excel 切换到预览频道。具体方法可以参考官方:https://insider.microsoft365.com/en-us/join/windows

3、需要联网.

Python 在云中运行

Excel 中的 Python 计算使用标准版本的 Python 语言在 Microsoft 云中运行。 Excel 中的 Python 附带 Anaconda 通过标准的安全分发提供的一组核心 Python 库。

无需本地版本的 Python 就可以在 Excel 中使用 Python。 如果计算机上安装了本地版本的 Python,则对 Python 安装所做的任何自定义都不会反映在 Excel 计算中的 Python 中。

由于 Excel 中的 Python 计算在云中运行,因此需要使用 Internet 访问才能使用该功能。

4、参考文档,认真阅读

Excel 中的 Python 简介

Python 简介 - 培训 |Microsoft Learn

Excel 中的 Python 错误疑难解答

Excel 中的数据安全性和 Python

Excel DataFrames 中的 Python

在 Excel 绘图和图表中创建 Python

在 Excel 中将Power Query数据与 Python 配合使用

5、Excel 内置 Python 默认使用的开源库

Excel 在云端运行的时候就导入了下图的包,可以在自己写代码的时候不用导入。但强烈建议自己还是单独写一下导入的过程。注意一些约定俗成的导包的别名。

云端开源库列表requirements.txt,在本地体验和调试。

复制代码
matplotlib==3.7.3
numpy==1.25.2
pandas==2.1.0
seaborn==0.12.2
statsmodels==0.14.0
astropy==5.3.3
beautifulsoup4==4.12.2
imbalanced-learn==0.11.0
ipython==8.15.0
gensim==4.3.2
networkx==3.1
Pillow==10.0.0
datasette-pytables==2.0.1
torch==2.0.1
PyWavelets==1.4.1
scikit-learn==1.3.0
scipy==1.11.2
snowballstemmer==2.2.0
statsmodels==0.14.0
sympy==1.12
tabulate==0.9.0
spyder-kernels==2.4.4

本地导入

cmd 复制代码
pip install -r requirements.txt

三、体验应用

在 Excel 中我们体验自定义画图:堆积瀑布图

python 复制代码
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd

df = xl("B3:D15", headers = True) # 创建数据集

decimal_places = 0  # 小数位数 默认 0 位
color_base = ['#213058', '#8E599F', '#ADB175']  # 基础颜色可自行扩展,最少保证三个颜色。
column_names = df.columns.tolist()  # 获取数据集字段名称

df_pivot = df.pivot_table(index=column_names[0], columns=column_names[1], values=column_names[2], aggfunc='sum').fillna(0)  # 透视表
df_pivot['cumulative'] = df_pivot.sum(axis=1).cumsum()  # 计算累计值
df_pivot.loc['Total'] = df_pivot.sum()  # 添加总计行
unique_wd_values = df_pivot.columns[:-1].tolist()  # 获取分类列表

# 颜色处理
if len(unique_wd_values) > len(color_base):  # 如果 wd 数量大于颜色数量,需要随机添加颜色
    color_base += [f'#{np.random.randint(0, 0xFFFFFF):06x}' for _ in range(len(unique_wd_values) - len(color_base))]
elif len(unique_wd_values) < len(color_base):  # 如果 wd 数量小于颜色数量,需要截取颜色
    color_base = color_base[:len(unique_wd_values)]
colors = {wd: color_base[i] for i, wd in enumerate(unique_wd_values)}  # 分类颜色字典

bar_width = 0.5  # 柱形图宽度
opacity = 0.95  # 柱形图透明度
width = 10  # 宽度为 10 英寸 默认 6.4 英寸
height = 7.5  # 高度为 7.5 英寸 默认 4.8 英寸

fig, ax = plt.subplots(figsize=(width, height))  # 创建子图
bottom = np.zeros(len(df_pivot))  # 初始化底部值
bottom[1:-1] = df_pivot['cumulative'].iloc[:-2].tolist()  # 更新底部值为累计值

# 绘图
for wd, color in colors.items():  # 遍历每个分类
    values = df_pivot[wd].tolist()  # 获取每个分类的值
    bars = ax.bar(df_pivot.index, values, bar_width, color=color, alpha=opacity, bottom=bottom, edgecolor='black')  # 绘制柱形图
    for i, value in enumerate(values):  # 添加标签
        if value > 0:  # 值大于 0 才添加标签
            ax.text(i, bottom[i] + value / 2, f'{value:,.{decimal_places}f}', color='white', fontsize=12, ha='center', va='center')
    bottom += values  # 更新底部值
    for i, value in enumerate(values):  # 添加连接线
        if i < len(values) - 1 and wd == unique_wd_values[-1]:  # 最后一个分类不添加连接线
            ax.plot([i + 0.75, i + 0.25], [bottom[i], bottom[i]], color='black', linestyle='--')  # 虚线连接线
# 总计标签
totals = np.sum(df_pivot.drop('cumulative', axis=1), axis=1)  # 计算每个分类的总计值
for i, total in enumerate(totals):  # 添加标签
    ax.text(i, bottom[i] + 100, f'{total:,.{decimal_places}f}', color=color_base[0], fontsize=12, fontweight='bold', ha='center', va='center')  # 总计标签

ax.spines['top'].set_visible(False)  # 上边框隐藏
ax.spines['right'].set_visible(False)  # 右边框隐藏
ax.spines['bottom'].set_linewidth(1)  # 下边框宽度
ax.spines['left'].set_linewidth(0.5)  # 左边框宽度

# 图例
legend_elements = [plt.Rectangle((0, 0), 1, 1, fc=colors[key], ec='black', alpha=opacity) for key in colors]  # 图例元素
ax.legend(legend_elements, colors.keys(), title='', fontsize=12)  # 图例

# 标题
ax.set_title('Title', fontsize=16, fontweight='bold', color=color_base[0], pad=16)

plt.show()  # 显示图形

在 Power BI 中画图效果

附件内容如下,可以自行下载体验:

附件下载

https://jiaopengzi.com/3044.html


请关注

全网同名搜索 焦棚子

如果对你有帮助,请 点赞关注三连 支持一下,这是我们更新的动力。

我们承接 Power BI 相关业务:培训、报告制作与部署、咨询服务等。

by 焦棚子

相关推荐
qq_161111271 小时前
Jenkins+Python自动化测试持续集成详细教程
自动化测试·python·jenkins·教程·持续集成
爱吃苹果的梨叔4 小时前
训练集群网络中断怎么办?智算机房的 Console 串口排障方案
网络·python·智能路由器·php
李妍.7 小时前
02Numpy基础(上)
开发语言·python
TheBestRucy7 小时前
Python 九阳神功之贰:面向对象(下)
开发语言·python
2601_965958468 小时前
口腔黏膜脱皮超2周未愈建议及时就医
人工智能·python
微小冷9 小时前
在不同空间中展示数据(欧式、球面、庞加莱圆盘)
python·双曲空间·微分几何·geomstats·庞加莱圆盘·球面
weixin_431600449 小时前
Agent Workflow 学习向:Code 节点,比模板更强的变量加工
后端·python·学习·ai·
讲温控就好了9 小时前
从医疗影像到能源存储——芯片冷却温控技术的跨行业赋能
人工智能·python·能源
DeepVisionary10 小时前
从 Qwen3.8-27B 把原生多模态、原生 FP8、桌面级 Agent 三件事一次集齐,看开源大模型的“工业化拐点“
python·自动化
固定资产管理系统软件11 小时前
商务局RFID固定资产管理系统的应用价值与落地要点解析
大数据·python