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 焦棚子

相关推荐
troy12812 小时前
Python 基础语法(六):函数与模块、文件操作、异常处理
开发语言·python
小叶肥辉12 小时前
LangChain链和LangGraph图的学习笔记【四】——(1)调用方法:invoke(2)提示语模板:PromptTemplate
python·langchain·prompt
Lynne30912 小时前
为什么工业数据越来越需要在现场处理?边缘计算正在解决什么问题?
网络·数据分析·数据
小兔崽子去哪了12 小时前
深度学习 2 / CNN 神经网络
后端·python
weixin_4407305012 小时前
队列QUEUE介绍+类型示例(先进先出、后进先出、优先级高先出、双端进入、生产者+消费者线程)
python·线程·queue
这是程序猿12 小时前
Java线程池深度剖析:源码原理、核心参数、任务调度与生产调优实战
java·开发语言·python
Web3&Basketball12 小时前
ChatGPT 路由自证:跨客户端实测对照
python·大模型·agent·推理·推理优化
Patrick在香港12 小时前
Claude 工作提醒自动化:香港天文台四个接口三个「更新时间」,警告到期了却还在生效
python·api·claude·数据抓取·香港
用户83562907805112 小时前
Python 实现 Word 文档域的插入与管理
后端·python
quantdash_cc12 小时前
从数据采集到策略消费,股票日内行情管道应该怎么设计?
开发语言·python·数据分析·量化交易·股票数据·quantdash