当前位置: 首页 > 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.lryc.cn/news/600904.html

相关文章:

  • 卫星通信终端天线对星之:参考星对星
  • DOM元素添加技巧全解析
  • 单片机CPU内部的定时器——滴答定时器
  • Linux DNS 服务器正反向解析
  • Mybatis学习之配置文件(三)
  • Linux随记(二十一)
  • 变频器实习DAY15
  • Linux内核设计与实现 - 第13章 虚拟文件系统(VFS)
  • Linux shuf命令随机打乱行顺序
  • 差模干扰 共模干扰
  • 利用RAII与析构函数避免C++资源泄漏
  • kafka的部署和jmeter连接kafka
  • 20250726-2-Kubernetes 网络-Service 定义与创建_笔记
  • C++/CLI vs 标准 C++ vs C# 语法对照手册
  • Java 大视界 -- Java 大数据在智能医疗影像数据标注与疾病辅助诊断模型训练中的应用(366)
  • greenhills编译出错问题
  • 20250726-1-Kubernetes 网络-Service存在的意义_笔记
  • 【Spring AI】大模型服务平台-阿里云百炼
  • 高可用集群KEEPALIVED的详细部署
  • 【MySQL】MySQL 缓存方案
  • 使用Clion开发STM32(Dap调试)
  • 在 Scintilla 中为 Squirrel 语言设置语法解析器的方法
  • Flutter控件归纳总结
  • 面试150 IPO
  • 达梦[-2894]:间隔表达式与分区列类型不匹配
  • 大语言模型困惑度:衡量AI语言能力的核心指标
  • Windows Server容器化应用的资源限制设置
  • 小白成长之路-部署Zabbix7(二)
  • Word文档试卷处理新方案:答案提取与格式化一键完成
  • MongoDB数据库高并发商业实践优化·运行优化之不可使用root账户进行MongoDB运行-优雅草卓伊凡