基于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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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…