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