在数据分析和可视化领域,CSV和JSON是两种最常用的数据格式。本文将介绍如何使用Python处理这两种格式的数据,并利用Matplotlib和Cartopy等库生成专业的可视化图表。
一、CSV数据处理与温度变化图
1.1 生成模拟天气数据
我们首先创建一个生成模拟天气数据的Python脚本,将结果保存为CSV格式:
python
复制
下载
import csv import random from datetime import datetime, timedelta def 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 data def 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 datetime def 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, temperatures def 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, timedelta def 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 earthquakes def 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'] = False def 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)
这段代码创建的地图包含以下专业元素:
-
全球地图投影
-
海岸线、国界等地理特征
-
散点图表示地震位置
-
点的大小表示地震深度
-
颜色表示地震震级
-
颜色条图例
-
中文标题和标签
三、技术要点总结
-
CSV处理最佳实践:
-
使用Python内置的csv模块处理CSV文件
-
DictReader/DictWriter提供字段名映射,代码更易读
-
注意文件编码问题(推荐使用utf-8)
-
-
JSON处理技巧:
-
json模块简单易用,支持中文输出
-
使用indent参数美化输出格式
-
日期时间等特殊类型需要手动转换
-
-
数据可视化进阶:
-
Matplotlib提供了高度可定制的图表
-
Cartopy适合地理空间数据可视化
-
使用颜色和大小编码多个维度信息
-
添加网格、图例等元素增强可读性
-
-
性能考虑:
-
大数据集考虑使用pandas读取CSV
-
地理绘图可以使用更专业的GIS工具
-
批量生成图表时注意内存管理
-
四、应用场景扩展
本文介绍的技术可以应用于多种场景:
-
气象数据分析:
-
长期气候趋势分析
-
极端天气事件统计
-
多城市天气对比
-
-
地震监测应用:
-
地震带分析
-
震级-深度关系研究
-
历史地震模式识别
-
-
商业数据分析:
-
销售数据可视化
-
用户地理分布
-
时间序列趋势分析
-