基于matplotlib庫的python可視化:以北京市各區降雨量為例

一、實驗目的

1. 掌握使用Python的pandas、matplotlib和seaborn庫進行數據可視化的方法
2. 學習制作杠鈴圖、堆積柱狀圖和折線圖等多種圖表類型
3. 分析北京市各區在特定時間段內的降雨量的變化規律
4. 培養數據分析和可視化的實踐能力

二、實驗數據

數據來源:北京市水務局官網(http://swj.beijing.gov.cn/)

數據內容:包含北京市各行政區在2023年7月30日至8月5日期間的降雨量數據

三、實驗內容與步驟

1. 數據準備與預處理

import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import numpy as np# 讀取數據
df1 = pd.read_excel('C:/Users/ASUS/Desktop/數據可視化文件/實驗4/rain_data.xlsx')
#print(df1.head())

2. 制作杠鈴圖對比7月30日與8月5日降雨量

步驟:

計算各行政區兩天的平均降雨量

使用灰色線條連接兩個時間點的數據

分別用藍色和橙色點表示7月30日和8月5日的降雨量

添加數據標簽顯示具體數值

# 計算每個區7.30和8.5兩天的平均降雨量
region_rain = df1.groupby('region')[['7.30', '8.5']].mean().reset_index()# 排序數據以便更好的可視化
region_rain = region_rain.sort_values('7.30')
region_rain.reset_index(drop=True, inplace=True)  # 重置索引確保順序正確# 創建圖形
plt.figure(figsize=(12, 10))
#plt.style.use('seaborn-v0_8-whitegrid')
sns.set_style("whitegrid")  # 使用seaborn的白色網格風格
plt.rcParams['font.family'] = 'SimHei'
# 繪制杠鈴圖
for idx, row in region_rain.iterrows():plt.plot([row['7.30'], row['8.5']], [idx, idx], color='grey', alpha=0.4, linewidth=3)# 繪制兩個時間點的點
plt.scatter(region_rain['7.30'], region_rain.index, color='#1f77b4', label='7月30日', s=100)
plt.scatter(region_rain['8.5'], region_rain.index, color='#ff7f0e', label='8月5日', s=100)# 添加標簽和標題
plt.yticks(region_rain.index, region_rain['region'], fontsize=12)
plt.xlabel('降雨量(mm)', fontsize=14)
plt.title('北京市各區7月30日與8月5日平均降雨量對比', fontsize=16, pad=20)
plt.legend(fontsize=12)# 獲取區域數量用于y軸定位
n_regions = len(region_rain)# 添加數值標簽 - 確保與點對應
for i in range(n_regions):# 7月30日數據標簽plt.text(region_rain.loc[i, '7.30']+3, i, f"{region_rain.loc[i, '7.30']:.1f}", ha='right', va='center', fontsize=10)# 8月5日數據標簽plt.text(region_rain.loc[i, '8.5']-3, i, f"{region_rain.loc[i, '8.5']:.1f}", ha='left', va='center', fontsize=10)# 添加數值標簽
#for i, (val1, val2) in enumerate(zip(region_rain['7.30'], region_rain['8.5'])):
#    plt.text(val1, i, f'{val1:.1f}', ha='right', va='center', fontsize=10)
#    plt.text(val2, i, f'{val2:.1f}', ha='left', va='center', fontsize=10)# 美化圖形
sns.despine(left=True)
plt.grid(axis='x', linestyle='--', alpha=0.7)
plt.tight_layout()plt.show()

輸出的杠鈴圖如下:

通過杠鈴圖可以直觀看出:

大部分行政區8月5日的降雨量明顯高于7月30日;
降雨量分布存在明顯的區域差異;
某些區域兩日降雨量變化較小(如密云區、延慶區),而某些區域變化顯著(如海淀區、石景山區)。

3. 制作堆積柱狀圖展示7天內降雨總量分布

步驟:

計算各區每日平均降雨量

使用不同顏色表示不同日期的降雨量貢獻

采用彩虹色系從淺藍到深紫,增強視覺效果

添加總計數據標簽

# 選擇7天的降雨數據列
rain_columns = ['7.30', '7.31', '8.1', '8.2', '8.3', '8.4', '8.5']
date_labels = ['7月30日', '7月31日', '8月1日', '8月2日', '8月3日', '8月4日', '8月5日']# 計算各區每日平均降雨量
region_daily = df1.groupby('region')[rain_columns].mean()# 轉置數據以便繪圖
plot_data = region_daily.T
plot_data.index = date_labels  # 使用中文日期標簽# 設置顏色
#colors = plt.cm.viridis(np.linspace(0, 1, len(date_labels)))# 或者使用雨量專用色系:從淺藍到深藍再到紫色
colors = ['#6a3d9a','#e31a1c','#fb9a99','#33a02c','#b2df8a','#1f78b4','#a6cee3']# 創建圖形
plt.figure(figsize=(14, 8))
sns.set_style("whitegrid")
plt.rcParams['font.sans-serif'] = ['SimHei']  # 設置中文字體
plt.rcParams['axes.unicode_minus'] = False# 繪制堆積柱狀圖
bottom = np.zeros(len(region_daily))
for i, date in enumerate(date_labels):plt.bar(region_daily.index, plot_data.loc[date], bottom=bottom, label=date,color=colors[i])bottom += plot_data.loc[date]# 添加圖表元素
plt.title('北京市各區7天內降雨總量分布(按日期堆積)', fontsize=16, pad=20)
plt.xlabel('行政區', fontsize=14)
plt.ylabel('降雨量(mm)', fontsize=14)
plt.xticks(rotation=45, ha='right')# 添加圖例
plt.legend(title='日期', bbox_to_anchor=(1.05, 1), loc='upper left')# 添加數據標簽(可選)
for region in region_daily.index:height = bottom[region_daily.index.get_loc(region)]plt.text(region_daily.index.get_loc(region), height, f'{height:.1f}', ha='center', va='bottom')plt.tight_layout()
plt.show()

輸出的堆積圖如下:

通過堆積柱狀圖可以發現:

不同行政區的總降雨量存在顯著差異;
降雨時間分布不均,某些日期貢獻了大部分降雨量;
顏色堆疊效果清晰展示了每日降雨在各區的占比情況。

4. 制作折線圖分析降雨變化最大的前5個區

步驟:

計算各行政區降雨量的標準差作為變化幅度指標

選取變化幅度最大的5個區

標注每個區的降雨量峰值

在圖例中顯示各區的變化幅度值

# 計算各區每日平均降雨量
region_daily = df1.groupby('region')[rain_columns].mean().T
region_daily.index = date_labels# 計算變化幅度(標準差)并取前5個區
region_std = df1.groupby('region')[rain_columns].std().mean(axis=1)
top5_regions = region_std.nlargest(5).index.tolist()# 創建圖形
plt.figure(figsize=(12, 6))
#plt.rcParams['font.family'] = 'SimHei'
sns.set_style("whitegrid")
colors = plt.cm.tab10(np.linspace(0, 1, 5))# 繪制前5個區折線
for i, region in enumerate(top5_regions):line = plt.plot(date_labels, region_daily[region], marker='o', linewidth=2.5,markersize=8,color=colors[i],label=f"{region} (Δ:{region_std[region]:.1f})")[0]# 標注最大值(修正后的部分)max_val = region_daily[region].max()max_idx = region_daily[region].idxmax()x_pos = date_labels.index(max_idx)plt.annotate(f'{max_val:.1f}',xy=(x_pos, max_val),xytext=(0, 10),textcoords='offset points',ha='center',color=line.get_color(),fontsize=10,arrowprops=dict(arrowstyle='->', color=line.get_color()))# 圖表美化
plt.rcParams['font.sans-serif'] = ['SimHei']  # 設置中文字體
plt.rcParams['axes.unicode_minus'] = False
plt.title('北京市降雨量變化最大的前5個區趨勢\n(按標準差排序)', fontsize=14, pad=20)
plt.xlabel('日期', fontsize=12)
plt.ylabel('降雨量(mm)', fontsize=12)
plt.xticks(fontsize=11)
plt.yticks(fontsize=11)# 輔助元素
plt.grid(axis='y', linestyle=':', alpha=0.6)
plt.axhline(y=0, color='gray', linewidth=0.5)# 圖例優化
legend = plt.legend(bbox_to_anchor=(1.05, 1), loc='upper left',title='行政區(變化幅度)',frameon=True,borderpad=1)
legend.get_frame().set_facecolor('#f9f9f9')plt.tight_layout()
plt.savefig('top5_rainfall_trend.png', dpi=300, bbox_inches='tight')
plt.show()

輸出的折線圖如下:


通過折線圖可以看出:

前5個變化幅度最大的行政區降雨模式各異;
某些區呈現單峰特征,某些區呈現多峰波動;
峰值出現的時間點不同,反映了降雨時空分布的不均勻性。

?四、實驗總結

????????本次實驗通過三種不同的可視化方式,全面分析了北京市各行政區在7天內的降雨量分布和變化規律。杠鈴圖適合對比兩個時間點的數據,堆積柱狀圖適合展示總量和構成,折線圖適合分析變化趨勢。實驗結果表明,北京市降雨存在明顯的時空分布差異,不同行政區的降雨模式和變化特征各不相同。

????????通過本實驗,掌握了多種數據可視化技術的實際應用,提高了從數據中提取信息和分析問題的能力,為后續的數據分析工作奠定了基礎。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/94581.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/94581.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/94581.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

SCDN如何提示網站性能和安全防護

SCDN(Secure Content Delivery Network,安全內容分發網絡)是融合了傳統 CDN(內容分發網絡)性能加速能力與專業安全防護能力的新一代網絡服務,核心目標是在 “快速分發內容” 的基礎上,同步解決網…

PowerShell遠程加載Mimikatz完全指南:從原理到實戰

PowerShell遠程加載Mimikatz完全指南:從原理到實戰無文件攻擊技術是現代滲透測試的核心技能,掌握PowerShell遠程加載Mimikatz對白帽子黑客至關重要1 引言 在當今的網絡安全領域,無文件攻擊(fileless attack)已成為高級持久性威脅(APT)的主要手…

基于Spring Boot的民宿服務管理系統-項目分享

基于Spring Boot的民宿服務管理系統-項目分享項目介紹項目摘要系統總體結構圖民宿資訊信息實體圖項目預覽民宿信息管理頁面民宿咨詢管理頁面已支付訂單管理頁面用戶主頁面寫在最后項目介紹 使用者:管理員、用戶 開發技術:MySQLJavaSpringBootVue 項目摘…

SpringBoot基礎知識-從XML配置文件到Java Config

項目結構與依賴首先&#xff0c;我們需要添加 Spring 核心依賴&#xff1a;<dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.2.5.RELEASE</version> </dependency>項目…

用無標簽語音自我提升音頻大模型:SI-SDA 方法詳解

用無標簽語音自我提升音頻大模型:SI-SDA 方法詳解 在語音識別和處理領域,近年來大模型(Large Language Models, LLMs)的發展迅速,為語音任務帶來了新的突破。然而,語音信號的復雜性使得這些模型在特定領域中表現不佳。如何在沒有標注數據的情況下提升音頻大模型的表現?…

開源工具新玩法:cpolar提升Penpot協作流暢度

文章目錄前言1. 安裝Docker2. Docker鏡像源添加方法3. 創建并啟動Penpot容器3. 本地使用Penpot進行創作4. 公網遠程訪問本地Penpot4.1 內網穿透工具安裝4.2 創建遠程連接公網地址5. 固定Penpot公網地址前言 你是否也曾因商業設計軟件的高昂費用而放棄團隊協作&#xff1f;或者…

DINOv2 vs DINOv3 vs CLIP:自監督視覺模型的演進與可視化對比

近年來&#xff0c;自監督學習在計算機視覺領域取得了巨大進展&#xff0c;推動了無需人工標注即可學習強大視覺表示的視覺基礎模型&#xff08;Vision Foundation Models&#xff09;的發展。其中&#xff0c;DINOv2 和 CLIP 是兩個極具影響力的代表性工作&#xff0c;而最新的…

并發編程——05 并發鎖機制之深入理解synchronized

1 i/i--引起的線程安全問題 1.1 問題思考&#xff1a;兩個線程對初始值為 0 的靜態變量一個做自增&#xff0c;一個做自減&#xff0c;各做 5000 次&#xff0c;結果是 0 嗎&#xff1f; public class SyncDemo {private static int counter 0;public static void increment()…

數字接龍(dfs)(藍橋杯)

非常好的聯系dfs的一道題目&#xff01; 推薦看這位大佬的詳解——>大佬詳細題解 #include <iostream> #include <vector> #include <algorithm> #include <cmath> using namespace std;const int N 2e5 10,M20; int a[M][M]; bool val[M][M]; i…

[光學原理與應用-318]:職業 - 光學工程師的技能要求

光學工程師需具備扎實的專業知識、熟練的軟件操作能力、豐富的實踐經驗、良好的溝通協作與項目管理能力&#xff0c;以及持續學習和創新能力&#xff0c;以下是具體技能要求&#xff1a;一、專業知識與理論基礎光學基礎知識&#xff1a;熟悉光學原理、光學材料、光學儀器等基礎…

萬字詳解架構設計:業務架構、應用架構、數據架構、技術架構、單體、分布式、微服務都是什么?

01 架構要素結構連接在軟件行業&#xff0c;對于什么是架構一直有很多的爭論&#xff0c;每個人都有自己的理解。不同的書籍上、不同的作者&#xff0c;對于架構的定義也不統一&#xff0c;角度不同&#xff0c;定義不同。此君說的架構和彼君理解的架構未必是一回事。因此我們在…

使用Docker搭建StackEdit在線MarkDown編輯器

1、安裝Docker# 安裝Docker https://docs.docker.com/get-docker/# 安裝Docker Compose https://docs.docker.com/compose/install/# CentOS安裝Docker https://mp.weixin.qq.com/s/nHNPbCmdQs3E5x1QBP-ueA2、安裝StackEdit2.1、方式1詳見&#xff1a; https://benweet.github.…

【C++詳解】用哈希表封裝實現myunordered_map和 myunordered_set

文章目錄一、框架分析二、封裝框架&#xff0c;解決KeyOfT三、?持iterator的實現四、const迭代器五、實現key不支持修改六、operator[ ]七、一些補充(reserve和rehash)八、源碼一、框架分析 SGI-STL30版本源代碼中沒有unordered_map和unordered_set&#xff0c;SGI-STL30版本是…

【 MYSQL | 基礎篇 四大SQL語句 】

摘要&#xff1a;本文先介紹數據庫 SQL 的核心概念&#xff0c;接著闡述 SQL 通用語法與 DDL、DML、DQL、DCL 四大分類&#xff0c;隨后詳細講解各類語句操作&#xff0c;包括 DDL 的數據庫與表操作及數據類型&#xff0c;DML 的數據增刪改&#xff0c;DQL 的查詢語法與功能&am…

Transformer 模型在自動語音識別(ASR)中的應用

文章目錄自動語音識別&#xff08;ASR&#xff09;簡介簡要介紹TransformerTransformer 在 ASR 中的應用基于“語音識別模型整體框架圖”的模塊介紹1. 音頻采集模塊&#xff08;Audio Acquisition Module&#xff09;2. 音頻預處理模塊&#xff08;Audio Preprocessing Module&…

集成電路學習:什么是SSD單發多框檢測器

SSD:單發多框檢測器 SSD(Single Shot MultiBox Detector)是一種高效的目標檢測算法,它通過單一網絡實現對象檢測,具有快速且準確的特點。以下是關于SSD的詳細解析: 一、SSD的技術特點 1、單一網絡檢測: SSD通過單一的前向傳播過程預測不同尺度的邊界框和類別概率…

【車載開發系列】汽車零部件DV與PV試驗的差異

【車載開發系列】汽車零部件DV與PV試驗的差異 【車載開發系列】汽車零部件DV與PV試驗的差異【車載開發系列】汽車零部件DV與PV試驗的差異一. 概念說明二. DV測試&#xff08;Design Verification 設計驗證測試&#xff09;三. PV測試&#xff08;Performance Verification 性能…

如何在阿里云百煉中使用釘釘MCP

本文通過阿里云百煉釘釘MCP配合&#xff0c;完成釘釘AI表格&#xff08;多維表&#xff09;數據管理 &#xff0c;其他AI開發工具可參照本文完成部署。 準備工作 在正式開始前&#xff0c;需要提前了解什么是釘釘MCP&#xff0c;詳情請參考釘釘服務端API MCP 概述。已經注冊了…

【lucene】SpanNearQuery中的slop

在`SpanNearQuery`中,`slop`的定義比你描述的稍微復雜一些。以下是一些更準確的解釋和分析: 1. `slop`的定義 `SpanNearQuery`的`slop`參數指的是兩個`SpanTermQuery`(或更一般的`SpanQuery`子句)之間允許的最大“不匹配位置”的數量。具體來說: - 不匹配位置:指的是第…

sqli-labs通關筆記-第64關 GET數值型SQL盲注(雙括號閉合 130次探測機會)

目錄 一、代碼審計 1、源碼分析 2、SQL注入風險分析 &#xff08;1&#xff09;聯合SQL注入方法&#xff08;不可行&#xff09; &#xff08;2&#xff09;報錯SQL注入方法&#xff08;不可行&#xff09; &#xff08;3&#xff09;總結 二、滲透實戰 1、滲透準備 2…