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.pswp.cn/web/80487.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/80487.shtml
英文地址,請注明出處:http://en.pswp.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…