如何以峰峦图展示降水数据

前言

本期使用joypy对降水数据处理,探索气象可视化的多元性。

降水数据是气象学中一个重要的指标,它对于了解和预测天气变化非常关键。在本期中,我们将使用 joypy 库来进行降水数据的可视化,展示降水的变化趋势和分布情况。

joypy 是一个基于 matplotlib 的 Python 库,用于创建美观的峰峦图(Ridge Plot)。峰峦图可以同时显示多个组别的分布情况,非常适合用于展示降水数据的多元性。

在接下来的代码中,我们将使用 joypy 来创建降水数据的峰峦图,并展示降水的季节变化和年际变化。让我们开始吧!
joypy地址:https://github.com/sbebo/joypy
镜像:气象分析3.9

In [42]:

!pip install joypy -i https://pypi.mirrors.ustc.edu.cn/simple/
Looking in indexes: https://pypi.mirrors.ustc.edu.cn/simple/
Requirement already satisfied: joypy in /opt/conda/lib/python3.9/site-packages (0.2.6)
Requirement already satisfied: pandas>=0.20.0 in /opt/conda/lib/python3.9/site-packages (from joypy) (1.5.3)
Requirement already satisfied: numpy>=1.16.5 in /opt/conda/lib/python3.9/site-packages (from joypy) (1.24.4)
Requirement already satisfied: scipy>=0.11.0 in /opt/conda/lib/python3.9/site-packages (from joypy) (1.10.1)
Requirement already satisfied: matplotlib in /opt/conda/lib/python3.9/site-packages (from joypy) (3.7.2)
Requirement already satisfied: python-dateutil>=2.8.1 in /opt/conda/lib/python3.9/site-packages (from pandas>=0.20.0->joypy) (2.8.1)
Requirement already satisfied: pytz>=2020.1 in /opt/conda/lib/python3.9/site-packages (from pandas>=0.20.0->joypy) (2021.1)
Requirement already satisfied: six>=1.5 in /opt/conda/lib/python3.9/site-packages (from python-dateutil>=2.8.1->pandas>=0.20.0->joypy) (1.16.0)
Requirement already satisfied: cycler>=0.10 in /opt/conda/lib/python3.9/site-packages (from matplotlib->joypy) (0.10.0)
Requirement already satisfied: pillow>=6.2.0 in /opt/conda/lib/python3.9/site-packages (from matplotlib->joypy) (8.4.0)
Requirement already satisfied: fonttools>=4.22.0 in /opt/conda/lib/python3.9/site-packages (from matplotlib->joypy) (4.42.1)
Requirement already satisfied: pyparsing<3.1,>=2.3.1 in /opt/conda/lib/python3.9/site-packages (from matplotlib->joypy) (2.4.7)
Requirement already satisfied: importlib-resources>=3.2.0 in /opt/conda/lib/python3.9/site-packages (from matplotlib->joypy) (5.4.0)
Requirement already satisfied: kiwisolver>=1.0.1 in /opt/conda/lib/python3.9/site-packages (from matplotlib->joypy) (1.3.1)
Requirement already satisfied: contourpy>=1.0.1 in /opt/conda/lib/python3.9/site-packages (from matplotlib->joypy) (1.1.1)
Requirement already satisfied: packaging>=20.0 in /opt/conda/lib/python3.9/site-packages (from matplotlib->joypy) (23.1)
Requirement already satisfied: zipp>=3.1.0 in /opt/conda/lib/python3.9/site-packages (from importlib-resources>=3.2.0->matplotlib->joypy) (3.4.1)

简单示例

In [1]:

import joypy
import pandas as pd
import numpy as np
from matplotlib import pyplot as plt
from matplotlib import cm
from sklearn.datasets import load_iris

np.random.seed(42)
df = pd.DataFrame(np.random.poisson(10,(24,7)))
df.columns = ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"]
df.head()

Out[1]:

MondayTuesdayWednesdayThursdayFridaySaturdaySunday
01261114789
111810711118
2126781053
391386131213
491488121513

In [2]:

%matplotlib inline

x_range = list(range(24))
fig, axes = joypy.joyplot(df, kind="values", x_range=x_range)
axes[-1].set_xticks(x_range);

生成随机降水月数据

In [3]:

time = pd.date_range(start='2000-01-01', end='2023-12-31', freq='d')
np.random.seed(42)
rain = np.random.uniform(0, 100, size=len(time))
pre = pd.DataFrame({'datetime':time, 'rain(mm)':rain})
print(pre)
       datetime   rain(mm)
0    2000-01-01  37.454012
1    2000-01-02  95.071431
2    2000-01-03  73.199394
3    2000-01-04  59.865848
4    2000-01-05  15.601864
...         ...        ...
8761 2023-12-27  67.136801
8762 2023-12-28  52.315815
8763 2023-12-29  89.863893
8764 2023-12-30  16.439268
8765 2023-12-31  80.410925

[8766 rows x 2 columns]

计算极端降水日数

先设置一个极端降水阈值。设为95%。

In [4]:

# 将日期列设置为索引:
pre['datetime'] = pd.to_datetime(pre['datetime'])
pre.set_index('datetime', inplace=True)

# 计算极端降水阈值:
threshold = pre['rain(mm)'].quantile(0.95)

# 按年份分组,然后计算每月的极端降水日数:
extreme_precipitation_days = pre[pre['rain(mm)'] > threshold].resample('M').size()
# 添加年份和极端降水日数到原始表格中:
pre['year'] = pre.index.year
pre['quarter'] = pre.index.quarter
pre['month'] = pre.index.month
pre['extreme_precipitation_days'] = extreme_precipitation_days

这样你就可以得到一个包含每年极端降水日数的pandas Series对象extreme_precipitation_days

In [5]:

pre

Out[5]:

rain(mm)yearquartermonthextreme_precipitation_days
datetime
2000-01-0137.454012200011NaN
2000-01-0295.071431200011NaN
2000-01-0373.199394200011NaN
2000-01-0459.865848200011NaN
2000-01-0515.601864200011NaN
..................
2023-12-2767.1368012023412NaN
2023-12-2852.3158152023412NaN
2023-12-2989.8638932023412NaN
2023-12-3016.4392682023412NaN
2023-12-3180.41092520234122.0

8766 rows × 5 columns

绘图部分

In [6]:

%matplotlib inline
labels=[y if y%1==0 else None for y in list(pre.year.unique())]
fig, axes = joypy.joyplot(pre, by="year", column="extreme_precipitation_days", labels=labels, range_style='own', 
                          grid="y", linewidth=1, legend=False, fade=True, figsize=(20,12),
                          title="joypy preciption test",
                          kind="counts", bins=50)

显示效果欠佳,还是直接看降水量分布

In [7]:

# 创建山峦图
fig, ax = joypy.joyplot(pre, 
                        by='year', 
                        column='rain(mm)', 
                        range_style='own', 
                        grid='y', 
                        linewidth=1,
                        fade=True,
                        legend=False, 
                          kind="counts", bins=30,
                          figsize=(20,12),
                        title='Precipitation Over Years')

设置一下x轴范围,画一下年分布、季度分布、月分布

In [8]:

fig, ax = joypy.joyplot(pre, 
                        by='year', 
                        column='rain(mm)', 
                        grid='y', 
                        linewidth=1,
                        fade=True,
                        legend=False, 
                        range_style='all', 
                        x_range=[0,110],
                          kind="counts", bins=50,
                          figsize=(20,12),
                        title='Precipitation Over Years')

In [11]:

fig, ax = joypy.joyplot(pre, 
                        by='quarter', 
                        column='rain(mm)', 
                        grid='y', 
                        linewidth=0.8,
                        fade=True,
                        legend=False, 
                        range_style='all', 
                        x_range=[0,110],
                          kind="counts", bins=50,
                          figsize=(20,12),
                        title='Precipitation Over quarter	')
/opt/conda/lib/python3.9/site-packages/joypy/joyplot.py:582: UserWarning: Glyph 9 (	) missing from current font.
  fig.tight_layout(h_pad=h_pad)
/opt/conda/lib/python3.9/site-packages/IPython/core/events.py:89: UserWarning: Glyph 9 (	) missing from current font.
  func(*args, **kwargs)
/opt/conda/lib/python3.9/site-packages/IPython/core/pylabtools.py:134: UserWarning: Glyph 9 (	) missing from current font.
  fig.canvas.print_figure(bytes_io, **kw)

In [10]:

fig, ax = joypy.joyplot(pre, 
                        by='month', 
                        column='rain(mm)', 
                        grid='y', 
                        linewidth=0.8,
                        fade=True,
                        legend=False, 
                        range_style='all', 
                        x_range=[0,110],
                          kind="counts", bins=50,
                          figsize=(20,12),
                        title='Precipitation Over months')
  • 7
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

暴躁的秋秋

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值