最近想看下某地区近几年降雨量如何变化,获得的数据是分年分月的,打算绘制按年份累积每月降雨量的条形图。搜索教程,主要有以下几种方法。
barplot()
函数,在 x 相同位置,分别绘制1barplot()
函数。参考文章点这里bar()
函数,按年分别绘制每月的降雨量条形图,通过参数bottom
指定所绘制的月份条形图下方是哪个月的条形图,相当于一层一层的柱子码起来。需要调用12次 bar()
函数。参考文章点这里histplot()
函数,设置 multiple
参数为 stack
,weights
参数为需要累积的量,既可绘制累积条形图。只需条用1次 histplot()
函数。参考文章点这里。这篇文章另外还介绍了如何使用 matplotlib、pandas、plotnine、altair 绘制累积条形图。前两种方法太繁琐,采用第3种方法。搜相关教程有个感悟,要想快速准确找到资料,搜英文文章,或者直接在 seaborn 官方教程找。
下面开始代码操练。
pythonimport pandas as pd
import seaborn as sns
from matplotlib import pyplot as plt
import matplotlib.font_manager as font_manager
%matplotlib inline
rc = {'axes.unicode_minus': False}
sns.set(context='notebook', style='ticks', font='Noto Sans SC', rc=rc)
temps = pd.read_csv('泾河站-2006-2021-月度气象数据-来自WheatA-整理后.csv', encoding="gbk")
ax = sns.histplot(
data=temps,
x='年份',
# Use the value variable here to turn histogram counts into weighted
# values.
weights='降水量(mm)',
hue='月份',
multiple='stack'
)
绘制出来的图确实是个月降雨量累积,但有以下几个问题:
bins
参数指定柱子数量。解决以上问题,优化后代码如下。具体参数说明见代码注释。
python# rc 参数中设置显示负号、图幅尺寸
rc = {'axes.unicode_minus': False, 'figure.figsize':(11.0, 6.0)}
# 设置绘图样式、中文字体
sns.set(context='notebook', style='ticks', font='Noto Sans SC', rc=rc)
# 绘制累积条形图
ax = sns.histplot(
data=temps,
x='年份',
# 将累积量作为加权
weights='降水量(mm)',
# 不同月份按不同颜色显示
hue='月份',
# 指定为累积
multiple='stack',
# 在柱子间添加白线
edgecolor='white',
# 按指定比例缩小柱子宽度,以避免柱子互相紧挨
shrink=0.8,
# 指定柱子数量
bins=16,
# 将x轴刻度线置于柱子下方正中间
discrete=True,
# 指定色盘,采用绿色为基础色,生成12个颜色,适用于离散性数据
palette=sns.light_palette('seagreen', n_colors=12),
)
# 指定x轴刻度线位置
x = range(2006, 2022)
ax.set_xticks(x)
# 指定x轴刻度线标签
xlabs = range(2006, 2022)
ax.set_xticklabels(xlabs)
# 设置x、y轴标签及字体大小
ax.set_ylabel("降雨量/mm", fontsize=14)
ax.set_xlabel("年份", fontsize=14)
# 设置图名及字体大小
ax.set_title('年降雨量', fontsize=14)
本文作者:tsingk
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!