Python气象绘图——线性填充图与柱状图

一、作业要求

1,线性填充图:计算1900-2023年 年平均的PDO指数,并把每一年的年变化范围填色(每一年的最值作为上下边界)

2,柱状图:在一张图上,分别用不同颜色的柱状图,画出1900-2023年1月和7月的PDO指数

二、数据来源

 PDO from ERSST V5 https://psl.noaa.gov/pdo/ Using EOF from 1920 to 2014 for N Pacific (see webpage)

三、代码

1、准备

引入需要的库以及对绘图的中文显示以及负号的显示进行处理

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

from pylab import *
mpl.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False

2、读取数据

filename = 'timeseries.pdo.ersstv5.csv'  # (路径+)文件名,文件与代码在同一目录下可以不用路径
df = pd.read_csv(filename, sep=',', header=0) # 读取数据,间隔为逗号,第一行为表头
pdo = df[1632:2040] # 利用切片读取对应年份PDO数据,数据是每月一个
pdo = np.array(pdo) # 将数据转为数组
JanPDO = df[1632: 2040: 12] # 读取历年一月的PDO指数,间隔12个月读取
janpdo = np.array(JanPDO) # 转为数组
JulPDO = df[1638: 2046: 12] # 读取历年七月的PDO指数
julpdo = np.array(JulPDO) # 转为数组

将读取的数据转为数组,可以更方便得对数据进行操作

3、数据处理

pdoymean = np.zeros(34)  # PDO指数的年平均,一共34年,定义一个数组用于储存PDO指数的年平均
ymin = np.zeros(34) # 历年PDO指数的最小值,某一年中最小的PDO指数
ymax = np.zeros(34) # 历年PDO指数的最大值
j=0
for i in range(0,408,12):
    pdoymean[j] = np.mean(pdo[i:i+12, 1]) # 利用循环求取历年的平均值,np.mean用于求取一组数组的最小值
    ymin[j] = np.min(pdo[i:i + 12, 1]) # 求取某一年12个月中的最小值,np.min用于求取一组数组的最小值
    ymax[j] = np.max(pdo[i:i+12, 1]) # 同上,求取最大值
    j = j+1  # 索引加一

numpy库中自带的mean、min以及max函数十分方便且用途很多,大家可以查询了解更多。

4、绘图

1、线性填充图

# 线性填充图
fig, ax1 = plt.subplots(figsize=(12, 5))
x = np.arange(1990,2024) # 设置横坐标为年份1990-2023年(python中创建数组为左闭右开)
ax1.axis('auto')  # 参数 'scale','auto','square'
ax1.plot(x, pdoymean,  c='steelblue', linewidth=2,linestyle='-',label='PDO指数',alpha=1) # 绘制折线图,颜色、线宽、线的样式、以及透明度可调整
ax1.fill_between(x,ymin,ymax,color='steelblue',alpha=0.5,label='min/max') # 绘制填充,下边界为历年最小值,上边界为历年最大值,颜色、透明度以及标注可调整
ax1.set_xlabel('年份', fontsize=11) # 设置横坐标名称
ax1.set_ylabel('PDO指数年平均', fontsize=11) # 设置纵坐标名称
ax1.legend(loc='best') # 设置标注位置
ax1.set_title('1990-2023年平均PDO指数',fontsize=15) # 设置图片名称,默认放置在图片正上方
ax1.grid(axis='both', ls='-')  # axis = 'both','x','y' # 设置横纵网格,以及线型
xticks = np.arange(1990,2024,2) # 横坐标标识,间隔2
ax1.set_xticks(xticks) # 设置横坐标
ax1.set_xlim(1990,2023) # 限制横坐标显示范围
ax1.set_ylim(-3,3) # 限制纵坐标显示范围
ax1.tick_params(right=True, direction='in',labelsize=11)
ax1.legend(loc='upper right',fontsize=10, edgecolor='black') # 标注设置
# 以下可以搜索查询更详细的介绍
ax1.spines['bottom'].set_linewidth(1.5)
ax1.spines['left'].set_linewidth(1.5)
ax1.spines['top'].set_linewidth(1.5)
ax1.spines['right'].set_linewidth(1.5)

plt.show()

2、柱形图

# 柱状图绘图
fig, ax2 = plt.subplots(figsize=(12, 4))
x = np.arange(1990,2024)
ax2.axis('auto')  # 参数 'scale','auto','square'
ax2.grid(axis='both', ls='--')  # axis = 'both','x','y'
bar_width = 0.4 # 设置柱形宽度
ax2.bar(x-(bar_width/2),janpdo[:,1],color='indianred',edgecolor='r',label='1月',width=bar_width,alpha=0.6) # 绘制柱状图,横坐标的位置需要向左移动半个柱形宽度
ax2.bar(x+(bar_width/2), julpdo[:,1],color='steelblue',edgecolor='navy',label='7月',width=bar_width,alpha=0.6) #横坐标向右偏移半个柱形宽度,这样两个柱形的位置才关于横坐标中心对称
ax2.set_ylabel('PDO指数',fontsize=12) # 接下来的设置不再赘述
xticks = np.arange(1988,2024,2)
ax2.set_xticks(xticks)
plt.xlim(1989.5, 2023.4)# 右边和上边的刻度都显示,且刻度向内。
plt.ylim(-2.5,2.5)
ax2.set_title('1990-2023年1月和7月PDO指数',fontsize=15)
ax2.tick_params(right=True, direction='in',labelsize=11)
ax2.legend(loc='upper right',fontsize=10, edgecolor='black')
ax2.spines['bottom'].set_linewidth(1.5)
ax2.spines['left'].set_linewidth(1.5)
ax2.spines['top'].set_linewidth(1.5)
ax2.spines['right'].set_linewidth(1.5)
plt.show()

4、结果展示

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值