当前位置: 首页 > news >正文

PYTHON从入门到实践-16数据视图化展示

在数据分析和可视化领域,CSV和JSON是两种最常用的数据格式。本文将介绍如何使用Python处理这两种格式的数据,并利用Matplotlib和Cartopy等库生成专业的可视化图表。

一、CSV数据处理与温度变化图

1.1 生成模拟天气数据

我们首先创建一个生成模拟天气数据的Python脚本,将结果保存为CSV格式:

python

复制

下载

import csv
import random
from datetime import datetime, timedeltadef generate_weather_data(num_days=30, location="New York"):"""生成模拟天气数据"""conditions = ["Sunny", "Partly Cloudy", "Cloudy", "Rainy", "Thunderstorm", "Snowy"]base_date = datetime.now()date_list = [base_date - timedelta(days=x) for x in range(num_days)]date_list.reverse()data = []for date in date_list:temp = round(random.uniform(-5, 35), 1)humidity = random.randint(30, 95)condition = random.choice(conditions)wind_speed = round(random.uniform(0, 25), 1)pressure = random.randint(980, 1040)data.append({"Date": date.strftime("%Y-%m-%d"),"Location": location,"Temperature (°C)": temp,"Humidity (%)": humidity,"Condition": condition,"Wind Speed (km/h)": wind_speed,"Pressure (hPa)": pressure})return datadef save_to_csv(data, filename="weather_data.csv"):"""将天气数据保存为CSV文件"""fieldnames = data[0].keys()with open(filename, mode='w', newline='', encoding='utf-8') as file:writer = csv.DictWriter(file, fieldnames=fieldnames)writer.writeheader()writer.writerows(data)print(f"天气数据已保存到 {filename}")# 示例用法
weather_data = generate_weather_data(num_days=30, location="Beijing")
save_to_csv(weather_data, "weather_beijing.csv")

这段代码可以生成30天的模拟天气数据,包括温度、湿度、天气状况等字段,并以CSV格式保存。

1.2 从CSV读取数据并绘制温度变化图

有了CSV数据后,我们可以使用Matplotlib来可视化温度变化:

python

复制

下载

import csv
import matplotlib.pyplot as plt
from datetime import datetimedef read_weather_csv(filename="weather_beijing.csv"):"""读取天气CSV文件并返回数据"""dates = []temperatures = []with open(filename, mode='r', encoding='utf-8') as file:reader = csv.DictReader(file)for row in reader:dates.append(datetime.strptime(row['Date'], '%Y-%m-%d'))temperatures.append(float(row['Temperature (°C)']))return dates, temperaturesdef plot_temperature(dates, temperatures, location="Beijing"):"""绘制温度变化图"""plt.figure(figsize=(12, 6))plt.plot(dates, temperatures, marker='o', linestyle='-', color='r', label='Temperature')avg_temp = sum(temperatures) / len(temperatures)plt.axhline(y=avg_temp, color='b', linestyle='--', label=f'Average: {avg_temp:.1f}°C')plt.title(f'Daily Temperature Variation in {location}', fontsize=14)plt.xlabel('Date', fontsize=12)plt.ylabel('Temperature (°C)', fontsize=12)plt.grid(True, linestyle='--', alpha=0.7)plt.legend()plt.gcf().autofmt_xdate()plt.tight_layout()plt.show()# 主程序
if __name__ == "__main__":dates, temps = read_weather_csv()plot_temperature(dates, temps)# plt.savefig('temperature_plot.png', dpi=300)

这段代码会生成一个包含以下元素的专业图表:

  • 折线图显示每日温度变化

  • 虚线标记平均温度

  • 适当的标题和轴标签

  • 网格线增强可读性

  • 自动旋转的日期标签

二、JSON数据处理与全球地震分布图

2.1 生成模拟地震数据

JSON格式非常适合存储结构化的复杂数据。以下是生成模拟地震数据的代码:

python

复制

下载

import json
import random
from datetime import datetime, timedeltadef generate_earthquake_data(num_entries):"""生成模拟地震数据"""earthquakes = []locations = ["加利福尼亚", "日本东京", "印尼苏门答腊", "智利", "新西兰","土耳其", "意大利", "中国四川", "菲律宾", "阿拉斯加"]current_time = datetime.now()for i in range(num_entries):location = random.choice(locations)magnitude = round(random.uniform(3.0, 9.0), 1)depth = random.randint(5, 300)latitude = round(random.uniform(-90, 90), 4)longitude = round(random.uniform(-180, 180), 4)event_time = current_time - timedelta(days=random.randint(0, 365),hours=random.randint(0, 23),minutes=random.randint(0, 59))earthquake = {"id": f"eq{i + 1:04d}","location": location,"magnitude": magnitude,"depth": depth,"latitude": latitude,"longitude": longitude,"timestamp": event_time.isoformat(),"tsunami_warning": magnitude >= 7.5}earthquakes.append(earthquake)return earthquakesdef save_to_json(data, filename):"""将数据保存为JSON文件"""with open(filename, 'w', encoding='utf-8') as f:json.dump(data, f, ensure_ascii=False, indent=4)if __name__ == "__main__":earthquake_data = generate_earthquake_data(50)save_to_json(earthquake_data, "earthquakes.json")print("地震数据JSON文件已生成: earthquakes.json")

2.2 使用Cartopy绘制全球地震分布图

Cartopy是一个强大的地理空间数据处理库,可以创建专业的地图可视化:

python

复制

下载

import json
import matplotlib.pyplot as plt
import cartopy.crs as ccrs
import cartopy.feature as cfeature
from matplotlib.colors import Normalize
from matplotlib.cm import ScalarMappable# 设置中文字体
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = Falsedef load_earthquake_data(filename):"""加载地震JSON数据"""with open(filename, 'r', encoding='utf-8') as f:return json.load(f)def plot_earthquakes_cartopy(data, output_file='earthquake_map.png'):"""使用Cartopy绘制全球地震分布图"""lons = [eq['longitude'] for eq in data]lats = [eq['latitude'] for eq in data]magnitudes = [eq['magnitude'] for eq in data]depths = [eq['depth'] for eq in data]plt.figure(figsize=(15, 10))ax = plt.axes(projection=ccrs.PlateCarree())# 添加地图特征ax.add_feature(cfeature.LAND)ax.add_feature(cfeature.OCEAN)ax.add_feature(cfeature.COASTLINE)ax.add_feature(cfeature.BORDERS, linestyle=':')ax.add_feature(cfeature.LAKES, alpha=0.5)ax.add_feature(cfeature.RIVERS)ax.gridlines()# 创建颜色映射norm = Normalize(vmin=min(magnitudes), vmax=max(magnitudes))cmap = plt.cm.get_cmap('YlOrRd')# 绘制散点sc = ax.scatter(lons, lats, c=magnitudes, cmap=cmap, norm=norm,s=[d / 2 for d in depths], alpha=0.7,transform=ccrs.PlateCarree())# 添加颜色条cbar = plt.colorbar(ScalarMappable(norm=norm, cmap=cmap), ax=ax,orientation='vertical', fraction=0.02, pad=0.1)cbar.set_label('地震震级 (里氏)')plt.title('全球地震分布图\n点大小表示深度,颜色表示震级', fontsize=15)plt.savefig(output_file, dpi=300, bbox_inches='tight')plt.close()print(f"地图已保存为 {output_file}")if __name__ == "__main__":earthquake_data = load_earthquake_data('earthquakes.json')plot_earthquakes_cartopy(earthquake_data)

这段代码创建的地图包含以下专业元素:

  • 全球地图投影

  • 海岸线、国界等地理特征

  • 散点图表示地震位置

  • 点的大小表示地震深度

  • 颜色表示地震震级

  • 颜色条图例

  • 中文标题和标签

三、技术要点总结

  1. CSV处理最佳实践

    • 使用Python内置的csv模块处理CSV文件

    • DictReader/DictWriter提供字段名映射,代码更易读

    • 注意文件编码问题(推荐使用utf-8)

  2. JSON处理技巧

    • json模块简单易用,支持中文输出

    • 使用indent参数美化输出格式

    • 日期时间等特殊类型需要手动转换

  3. 数据可视化进阶

    • Matplotlib提供了高度可定制的图表

    • Cartopy适合地理空间数据可视化

    • 使用颜色和大小编码多个维度信息

    • 添加网格、图例等元素增强可读性

  4. 性能考虑

    • 大数据集考虑使用pandas读取CSV

    • 地理绘图可以使用更专业的GIS工具

    • 批量生成图表时注意内存管理

四、应用场景扩展

本文介绍的技术可以应用于多种场景:

  1. 气象数据分析

    • 长期气候趋势分析

    • 极端天气事件统计

    • 多城市天气对比

  2. 地震监测应用

    • 地震带分析

    • 震级-深度关系研究

    • 历史地震模式识别

  3. 商业数据分析

    • 销售数据可视化

    • 用户地理分布

    • 时间序列趋势分析

http://www.dtcms.com/a/299332.html

相关文章:

  • Rust Web框架性能对比与实战指南
  • 数据结构 二叉树(3)---层序遍历二叉树
  • SQLite 子查询详解
  • 告别复杂配置!Spring Boot优雅集成百度OCR的终极方案
  • C语言基础10——函数
  • Qt 与 WebService 交互开发
  • Linux学习 韦东山IMX6ULL(一)搭建环境并编译程序
  • SQL Developer Data Modeler:一款免费跨平台的数据库建模工具
  • 强化学习(第三课第三周)
  • Rust赋能土木工程数字化
  • AUTOSAR进阶图解==>AUTOSAR_SRS_TimeService
  • Raft 协议 Paxos协议 和zk协议的特点和异同
  • 【Pandas】pandas Index objects Index.shape
  • 【温度传感器】热电偶、热敏电阻、热电阻、热成像仪原理及精度解析
  • ASP.NET Core MVC中taghelper的ModelExpression详解
  • .NET Core中的配置系统
  • 记录和分享抓取的数字货币和大A时序数据
  • 去中心化时代的通信革命:briefing与cpolar技术融合带来的安全范式革新
  • AI代理性能提升实战:LangChain+LangGraph内存管理与上下文优化完整指南
  • 如何创建或查看具有 repo 权限的 GitHub 个人访问令牌(PAT)
  • kafka的消费者负载均衡机制
  • 《人性的弱点》重构【01】
  • Java:采用mybatis+pagehealper优雅的实现分页功能
  • Flutter 提取图像主色调 ColorScheme.fromImageProvider
  • Go 的时间包:理解单调时间与挂钟时间
  • SWC 深入全面讲解
  • 集成学习的相关理论阐述
  • RocketMQ学习系列之——特殊消息类型
  • 塞舌尔公司良好信誉证明Certificate of Good Standing证书的用途
  • 大众化餐饮:把日常过成诗