一、作业要求
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()