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

在数据分析和可视化领域,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)

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

  • 全球地图投影

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

  • 散点图表示地震位置

  • 点的大小表示地震深度

  • 颜色表示地震震级

  • 颜色条图例

  • 中文标题和标签

三、技术要点总结

  1. CSV处理最佳实践

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

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

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

  2. JSON处理技巧

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

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

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

  3. 数据可视化进阶

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

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

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

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

  4. 性能考虑

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

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

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

四、应用场景扩展

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

  1. 气象数据分析

    • 长期气候趋势分析

    • 极端天气事件统计

    • 多城市天气对比

  2. 地震监测应用

    • 地震带分析

    • 震级-深度关系研究

    • 历史地震模式识别

  3. 商业数据分析

    • 销售数据可视化

    • 用户地理分布

    • 时间序列趋势分析

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值