EXCEL Python 实现绘制柱状线型组合图和树状图(包含数据透视表)

1、组合图、数据透视表

(1)数据预处理

知识点

  1. 日期函数 year() month()
  2. 数据透视表操作
    在这里插入图片描述
  3. 同比计算公式
    在这里插入图片描述
  4. 环比计算公式
    在这里插入图片描述

(2)excel 数据透视表+插入组合图

a.2015~2017数据集处理方式:

  • 操作:
    在这里插入图片描述
  • 结果
    在这里插入图片描述

b.2020~2022数据集处理方式

一次数据透视结果:
  • 操作
    在这里插入图片描述
    在这里插入图片描述
  • 结果
    在这里插入图片描述
两次数据透视结果
  • 操作:
    在这里插入图片描述
  • 结果:
    在这里插入图片描述

(3)python绘制组合图

a.数据预处理结果

在这里插入图片描述

b.代码

知识点:

  1. 使用 make_subplots 创建子图,设置 secondary_y=True 启用双 Y 轴

  2. 交互模式:hovermode=‘x unified’ 使鼠标悬停时同时显示所有系列在同一日期的数据,便于对比。

import pandas as pd
import plotly.graph_objects as go
from plotly.subplots import make_subplots# 读取数据
data = pd.read_excel('组合图数据.xlsx',engine='openpyxl')# 将日期列转换为datetime类型
data['日期'] = pd.to_datetime(data['日期'])# 创建组合图
fig = make_subplots(specs=[[{"secondary_y": True}]])# 添加成交金额柱状图
fig.add_trace(go.Bar(x=data['日期'],y=data['求和项:成交金额'],name='求和项:成交金额',marker_color='#1f77b4'),secondary_y=False
)# 添加同比增幅折线图
fig.add_trace(go.Line(x=data['日期'],y=data['同比'],name='同比增幅',line=dict(color='#d62728', width=2, dash='dash')),secondary_y=True
)# 添加环比增幅折线图
fig.add_trace(go.Line(x=data['日期'],y=data['环比'],name='环比增幅',line=dict(color='#2ca02c', width=2, dash='dash')),secondary_y=True
)# 设置图表布局
fig.update_layout(title='2020年1月1日-2022年12月1日的成交金额、环比增幅、同比增幅的组合图',xaxis_title='日期',yaxis_title='成交金额',yaxis2=dict(title='增幅 (%)',overlaying='y',side='right'),hovermode='x unified'
)# 显示图表
fig.show()

c.结果

组合图

优化:销售数据仪表盘:

a.代码

知识点

  1. dash 构建交互界面,dash_bootstrap_components 提供美观的 UI 组件。
  2. dbc.Container:Bootstrap 的响应式容器,fluid=True表示宽度 100%
  3. dbc.Row, dbc.Col:Bootstrap 的网格系统,一行一列。
  4. html.H1:HTML 标题标签,className添加样式(居中、上下边距)。
  5. dcc.Dropdown:下拉菜单组件:
    id:组件唯一标识,用于回调。
    options:选项列表,格式为[{label:显示文本, value:实际值}]。
    value:默认选中的值。
    multi=True:允许多选。
  6. dbc.Button:Bootstrap 按钮:
    n_clicks:记录点击次数,触发回调。
    color=“primary”:蓝色主按钮。
  7. dbc.Spinner:加载动画,在数据处理时显示。
  8. dcc.Graph:Plotly 图表组件,id='sales-graph’用于显示组合图。
  9. @app.callback:装饰器,定义回调函数。
  10. Output:回调输出,更新sales-graph组件的figure属性。
  11. Input:触发回调的输入,这里是按钮的n_clicks。
  12. State:获取下拉菜单当前值(不触发回调)。
  13. hovertemplate:鼠标悬停时显示的信息:
    %{x|%Y年%m月}:格式化日期(如 2023 年 01 月)。
    %{text}:显示text中的金额。
    < extra></ extra>:隐藏右侧默认信息。
  14. overlaying=‘y’:与左侧 Y 轴共享 X 轴。
  15. hovermode=‘x unified’:鼠标悬停时,所有数据在同一 X 轴对齐显示。
  16. tickformat=‘% Y 年 % m 月’:X 轴日期格式化为2023年01月。
    tickformat=‘,’:Y 轴数字添加千位分隔符(如1,000,000)。
  17. 流式布局(fluid layout)fluid=True 响应式布局适配不同屏幕。
import pandas as pd
import plotly.graph_objects as go
from plotly.subplots import make_subplots
import dash
from dash import dcc, html, Input, Output, State
import dash_bootstrap_components as dbc# 读取数据
data = pd.read_excel('组合图数据.xlsx',engine='openpyxl')# 确保日期列是正确的格式
data['日期'] = pd.to_datetime(data['日期'])
data['年份'] = data['日期'].dt.year
data['月份'] = data['日期'].dt.month# 创建应用
app = dash.Dash(__name__, external_stylesheets=[dbc.themes.BOOTSTRAP])
server = app.server  # 用于生产部署# 获取年份和月份的唯一值
years = sorted(data['年份'].unique())
months = list(range(1, 13))
month_names = ['一月', '二月', '三月', '四月', '五月', '六月','七月', '八月', '九月', '十月', '十一月', '十二月']# 应用布局
app.layout = dbc.Container([dbc.Row([dbc.Col(html.H1("销售数据分析仪表盘", className="text-center mt-4 mb-4"), width=12)]),dbc.Row([dbc.Col([html.Label("选择年份:", className="mr-2"),dcc.Dropdown(id='year-dropdown',options=[{'label': str(year), 'value': year} for year in years],value=years,  # 默认选择所有年份multi=True,className="w-100")], width=3),dbc.Col([html.Label("选择月份:", className="mr-2"),dcc.Dropdown(id='month-dropdown',options=[{'label': month_names[i - 1], 'value': i} for i in months],value=months,  # 默认选择所有月份multi=True,className="w-100")], width=3),dbc.Col([dbc.Button("应用筛选",id='apply-filter',n_clicks=0,className="mt-3",color="primary")], width=2)], className="mb-4"),dbc.Row([dbc.Col([dbc.Spinner(id="loading-spinner",children=[dcc.Graph(id='sales-graph')],color="primary",type="grow")], width=12)])], fluid=True)# 回调函数
@app.callback(Output('sales-graph', 'figure'),[Input('apply-filter', 'n_clicks')],[State('year-dropdown', 'value'),State('month-dropdown', 'value')]
)
def update_graph(n_clicks, selected_years, selected_months):# 确保参数有效if not selected_years:selected_years = yearsif not selected_months:selected_months = months# 筛选数据filtered_data = data[data['年份'].isin(selected_years) &data['月份'].isin(selected_months)]# 如果没有数据,返回空图表if filtered_data.empty:fig = go.Figure()fig.update_layout(title="没有匹配的数据",xaxis_title="日期",yaxis_title="成交金额")return fig# 创建组合图fig = make_subplots(specs=[[{"secondary_y": True}]])# 添加成交金额柱状图fig.add_trace(go.Bar(x=filtered_data['日期'],y=filtered_data['求和项:成交金额'],name='成交金额',text=[f"{x:,.0f}" for x in filtered_data['求和项:成交金额']],hovertemplate='日期: %{x|%Y年%m月}<br>成交金额: %{text}<extra></extra>',marker_color='#1f77b4'),secondary_y=False)# 添加同比增幅折线图fig.add_trace(go.Scatter(x=filtered_data['日期'],y=filtered_data['同比'],name='同比增幅',text=[f"{x:.1f}%" for x in filtered_data['同比']],hovertemplate='日期: %{x|%Y年%m月}<br>同比增幅: %{text}<extra></extra>',line=dict(color='#d62728', width=2, dash='dash'),marker=dict(size=8)),secondary_y=True)# 添加环比增幅折线图fig.add_trace(go.Scatter(x=filtered_data['日期'],y=filtered_data['环比'],name='环比增幅',text=[f"{x:.1f}%" for x in filtered_data['环比']],hovertemplate='日期: %{x|%Y年%m月}<br>环比增幅: %{text}<extra></extra>',line=dict(color='#2ca02c', width=2, dash='dash'),marker=dict(size=8)),secondary_y=True)# 设置图表布局fig.update_layout(title=f"成交金额与增幅分析 ({', '.join(map(str, selected_years))}年)",title_font=dict(size=20),xaxis_title="日期",yaxis_title="成交金额",yaxis2=dict(title="增幅 (%)",overlaying='y',side='right'),legend=dict(x=0, y=1.05,orientation='h',bgcolor='rgba(255, 255, 255, 0.8)',bordercolor='rgba(0, 0, 0, 0.1)',borderwidth=1,font=dict(size=14)),hovermode='x unified',plot_bgcolor='rgba(240, 240, 240, 0.5)',margin=dict(l=60, r=60, t=60, b=60),font=dict(family="SimHei, WenQuanYi Micro Hei, Heiti TC", size=14))# 设置X轴格式fig.update_xaxes(tickformat='%Y年%m月',tickfont=dict(size=14))# 设置Y轴格式fig.update_yaxes(tickformat=',',title_font=dict(size=16))return figif __name__ == '__main__':app.run_server(debug=True)
b.结果

在这里插入图片描述

销售数据仪表盘

2、树状图可视化

(1)数据预处理,数据透视表实现求和

在这里插入图片描述

(2)EXCEL 插入树状图

在这里插入图片描述

(3)python matplotlib库中的squarify.plot()函数绘制树状图

import pandas as pd
import matplotlib.pyplot as plt
import squarify
import numpy as np# 读取数据
df = pd.read_excel('树状图.xlsx', engine='openpyxl')# 设置图片清晰度
plt.rcParams['figure.dpi'] = 300
# 设置中文字体
plt.rcParams['font.sans-serif'] = ['SimHei', 'WenQuanYi Micro Hei', 'Heiti TC']# 数据预处理:计算占比,用于标签显示
total = df['求和项:成交金额'].sum()
df['占比'] = df['求和项:成交金额'].apply(lambda x: f"{x/total*100:.1f}%")# 创建自定义颜色映射
cmap = plt.cm.get_cmap('viridis', len(df))
colors = [cmap(i) for i in range(len(df))]# 绘制树状图
plt.figure(figsize=(12, 8))  # 设置图形大小squarify.plot(sizes=df['求和项:成交金额'],label=[f"{name}\n{amount/1e8:.1f}亿\n{percent}"for name, amount, percent in zip(df['类别'], df['求和项:成交金额'], df['占比'])],color=colors,alpha=0.8,pad=True  # 添加间隔,使图形更清晰
)# 设置标题和样式
plt.title('不同类别成交金额树状图', fontsize=16, pad=10)
plt.axis('off')  # 隐藏坐标轴# 添加图例说明
plt.text(0.99, 0.01,f"总计: {total/1e8:.2f}亿",ha='right',va='bottom',transform=plt.gca().transAxes,fontsize=10,bbox=dict(facecolor='white', alpha=0.7)
)# 调整布局
plt.tight_layout()# 显示图形
plt.show()

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/80487.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LabVIEW光谱检测系统

腔衰荡光谱技术&#xff08;CRDS&#xff09;凭借高精度和高灵敏度特性&#xff0c;成为微量气体浓度检测的常用方法&#xff0c;而准确获取衰荡时间是该技术应用的关键。基于LabVIEW平台设计腔衰荡信号在线处理系统&#xff0c;实现对衰荡信号的实时采集、平均、拟合、显示和保…

Flask快速入门和问答项目源码

Flask基础入门 源码&#xff1a; gitee&#xff1a;我爱白米饭/Flask问答项目 - 码云 目录 1.安装环境2.【debug、host、port】3.【路由params和query】4.【模板】5.【静态文件】6.【数据库连接】6.1.安装模块6.2.创建数据库并测试连接6.3.创建数据表6.4.ORM增删改查 6.5.ORM模…

flutter长列表 ListView、GridView、SingleChildScrollView、CustomScrollView区别

组件名称用途/适合场景是否懒加载支持列表结构用法复杂度SingleChildScrollView适用于内容数量不大、不重复的页面&#xff08;如表单、静态内容&#xff09;❌ 否❌ 否⭐⭐ListView适用于垂直方向的长列表&#xff0c;自动滚动&#xff1b;适合展示大量数据✅ 支持✅ 是⭐⭐Li…

鸿蒙OSUniApp 开发的一键分享功能#三方框架 #Uniapp

使用 UniApp 开发的一键分享功能 在移动应用开发中&#xff0c;分享功能几乎是必不可少的一环。一个好的分享体验不仅能带来更多用户&#xff0c;还能提升产品的曝光度。本文将详细讲解如何在 UniApp 框架下实现一个简单高效的一键分享功能&#xff0c;适配多个平台。 各平台分…

Vue-监听属性

监听属性 简单监听 点击切换名字&#xff0c;来回变更Tom/Jerry&#xff0c;输出 你好&#xff0c;Tom/Jerry 代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><title>监听属性</title><!-- …

DeepSeek 赋能物联网:从连接到智能的跨越之路

目录 一、引言&#xff1a;物联网新时代的开启二、DeepSeek 技术揭秘2.1 DeepSeek 是什么2.2 DeepSeek 技术优势 三、DeepSeek 与物联网的融合之基3.1 物联网发展现状与挑战3.2 DeepSeek 带来的变革性突破 四、DeepSeek 在物联网的多元应用场景4.1 智慧电力&#xff1a;开启能源…

3.6/Q1,GBD数据库最新文章解读

文章题目&#xff1a;Global, regional, and national burden of geriatric depressive disorders in people aged 60 years and older: an analysis of the Global Burden of Disease Study 2021 DOI&#xff1a;10.1186/s12991-025-00560-2 中文标题&#xff1a;60 岁及以上人…

LVGL学习笔记

文章目录 一、 LVGL移植教程(GD32)一 并行驱动 LED二三一、 LVGL移植教程(GD32) 参考链接 1.GD32+LVGL移植教程(超详细)——基于GD32F303X系列MCU 一 并行驱动 LED 根据您提供的引脚信号(DCLK、DISP、HSYNC、VSYNC、DE),可以判断这是一款采用 TTL/Parallel RGB 接口…

软件架构之--论微服务的开发方法1

论微服务的开发方法1 摘要 2023年 2月,本人所在集团公司承接了长三角地区某省渔船图纸电子化审查系统项目开发,该项目旨在为长三角地区渔船建造设计院、以及渔船图纸审查机构提供一个便捷的渔船图纸电子化审查服务平台。在此项目中,我作为项目组成员参与项目的建设工作,并…

如何在终端/命令行中把PDF的每一页转换成图片(PNG)

今天被对象安排了一个任务&#xff1a; 之前自己其实也有这个需要&#xff0c;但是吧&#xff0c;我懒&#xff1a;量少拖拽&#xff0c;量大就放弃。但这次躲不过去了&#xff0c;所以研究了一下有什么工具可以做到这个需求。 本文记录我这次发现的使用 XpdfReader 的方法。…

mac安装cast

背景 pycharm本地运行脚本时提示cast没有安装 问题原因 脚本尝试调用cast命令&#xff08;以太坊开发工具foundry中的子命令&#xff09;&#xff0c;但您的系统未安装该工具。 从日志可见&#xff0c;错误发生在通过sysutil.py执行shell命令时。 解决方案 方法1&#xf…

【搭建Node-RED + MQTT Broker实现AI大模型交互】

搭建Node-RED MQTT Broker实现AI大模型交互 搭建Node-RED MQTT Broker实现AI大模型交互一、系统架构二、环境准备与安装1. 安装Node.js2. 安装Mosquitto MQTT Broker3. 配置Mosquitto4. 安装Node-RED5. 配置Node-RED监听所有网络接口6. 启动Node-RED 三、Node-RED流程配置1. …

算法第21天 | 第77题. 组合、216. 组合总和 III、17. 电话号码的字母组合

回溯基础概念 什么是回溯&#xff1f; 如何实现回溯&#xff1f; 第77题. 组合 题目 思路与解法 carl的讲解&#xff1a; 回溯搜索法 class Solution:def combine(self, n: int, k: int) -> List[List[int]]:self.path []self.res []self.backtracking(n, k, 1)retu…

嵌入式硬件篇---拓展板

文章目录 前言 前言 本文简单介绍了拓展板的原理以及使用。

【深度学习基础】从感知机到多层神经网络:模型原理、结构与计算过程全解析

【深度学习基础】从感知机到多层神经网络&#xff1a;模型原理、结构与计算过程全解析 1. 引言 神经网络的重要性&#xff1a; 作为人工智能的核心技术之一&#xff0c;神经网络通过模拟人脑神经元的工作机制&#xff0c;成为解决复杂模式识别、预测和决策任务的利器。从图像分…

sparkSQL读入csv文件写入mysql(2)

&#xff08;二&#xff09;创建数据库和表 接下来&#xff0c;我们去创建一个新的数据库&#xff0c;数据表&#xff0c;并插入一条数据。 -- 创建数据库 CREATE DATABASE spark; -- 使用数据库 USE spark;-- 创建表 create table person(id int, name char(20), age int);-- …

JVM如何处理多线程内存抢占问题

目录 1、堆内存结构 2、运行时数据 3、内存分配机制 3.1、堆内存结构 3.2、内存分配方式 1、指针碰撞 2、空闲列表 4、jvm内存抢占方案 4.1、TLAB 4.2、CAS 4.3、锁优化 4.4、逃逸分析与栈上分配 5、问题 5.1、内存分配竞争导致性能下降 5.2、伪共享&#xff08…

Ubuntu---omg又出bug了

自用遇到问题的合集 250518——桌面文件突然消失 ANS&#xff1a;参考博文

正则表达式与文本处理的艺术

引言 在前端开发领域&#xff0c;文本处理是一项核心技能。正则表达式作为一种强大的模式匹配工具&#xff0c;能够帮助我们高效地处理各种复杂的文本操作任务。 正则表达式基础 什么是正则表达式&#xff1f; 正则表达式是一种用于匹配字符串中字符组合的模式。它由一系列…

初学c语言15(字符和字符串函数)

一.字符串分类函数 头文件&#xff1a;ctype.h 作用&#xff1a;判断是什么类型的字符 函数举例&#xff1a; 函数 符合条件就为真 islower判断是否为小写字符&#xff08;a~z&#xff09;isupper判断是否为大写字符&#xff08;A~Z&#xff09;isdigit十进制数字&#xf…