基于 SPC 的强风暴历史数据,仅简单分析历年的龙卷风分布情况。主要用到 pandas 处理 csv 数据,并利用 matplotlib,seaborn绘制箱线图,小提琴图,条形图,散点图等图形。
seaborn 是基于 matplotlib 的可视化库,主要应用于统计分析可视化,而且在统计分析可视化上非常好用且非常强大。
示例也给出了子图的绘制,大部分语句都给出了注释,数据同样见最后链接。
import matplotlib.pyplot as plt
import pandas as pd
import seaborn as sns
sns.set(style='darkgrid', color_codes = True)
data = pd.read_csv(r'F:\SPC\stormevents\legacy\Stormdata_2012.csv')
data2 = pd.read_csv(r'F:\SPC\stormevents\legacy\Stormdata_2013.csv')
tor = data[~data['TOR_F_SCALE'].isnull()]
tor2 = data2[~data2['TOR_F_SCALE'].isnull()]
# 合并两个 DataFrame
tora = pd.concat([tor, tor2])
fig, ax = plt.subplots(2, 2, figsize = (16, 8))
# 绘制箱线图
sns.boxplot(x = tora.TOR_F_SCALE, y = tora.TOR_WIDTH, order=["EF0", "EF1", "EF2", "EF3", "EF4"], palette='vlag', ax = ax[0, 0])
# 类似箱线图,但是将每个点绘制到图中
sns.swarmplot(x = tora.TOR_F_SCALE, y = tora.TOR_WIDTH, size = 2, color = '.3', linewidth = 0, ax = ax[0, 1])
# 箱线图和核密度估计曲线整合
sns.violinplot(x = tora.TOR_F_SCALE, y = tora.TOR_LENGTH, order=["EF0", "EF1", "EF2", "EF3", "EF4"], palette='vlag', ax = ax [1, 0])
plt.scatter(tora.TOR_LENGTH, tora.TOR_WIDTH, s = 12, axes = ax[1, 1])
# 设置X和Y轴的 label
ax[1, 1].set_xlabel('Tornado Length')
ax[1, 1].set_ylabel('Tornado Width')
# 保存图,设置图形分辨率 dpi, 将保存图形的空白区域最小化 bbox_inches
plt.savefig(r'F:\subplots.jpeg', dpi = 400, bbox_inches = 'tight')
fig, ax = plt.subplots()
# 绘制散点图,拟合线性相关曲线,并添加核密度估计曲线
sns.jointplot(tora.TOR_LENGTH, tora.TOR_WIDTH, kind = 'reg', color = 'r', size = 8)
plt.savefig(r'F:\jointplot.jpeg', dpi = 400, bbox_inches = 'tight')
# 以 STATE 列为基础,统计 TOR_F_SCALE 列的独一无二数据及其数目
fws = tora.groupby('STATE')['TOR_F_SCALE'].value_counts()
fwsu = fws.unstack()
fig, ax = plt.subplots(figsize = (16, 9))
sns.set_color_codes('pastel')
sns.barplot(fwsu.sum(axis = 1), fwsu.index, color = 'b', label = 'Total')
sns.set_color_codes('muted')
sns.barplot(fwsu.EF3 + fwsu.EF4, fwsu.index, color = 'b', label = 'EF3+')
# 设置 Y 轴标签及属性
#ax.yaxis.set_ticklabels(fwsu.index, fontsize = 8)
ax.legend(ncol = 3, loc="lower right", frameon = True)
ax.set_xlabel('Total Tornadoes of State in U.S.')
ax.set_ylabel('')
plt.savefig(r'F:\tornadoes_bar.jpeg', dpi = 400, bbox_inches = 'tight')
plt.show()
不同强度的龙卷风的宽度也存在着差异,EF2级以下的龙卷风的宽度变化不是非常明显,但是EF3+龙卷风的宽度是比较显著的。EF2-以下龙卷风长度变化分布较EF3+龙卷风长度分布集中。
龙卷风的宽度和长度分布比较集中,宽度主要在 1000 以下,而长度在 20 以下。图中存在的长度和宽度的离散点可能是异常点。
美国龙卷主要分布在大平原的几个州,EF3+龙卷也主要分布在这几个州。
链接: https://pan.baidu.com/s/1pKXSXEb 密码: eb7f