多年来每个月的平均值的多个子图的散点图
scatter plotting with multiple subplots of each month's mean throughout the years
嘿,网络上的人们,
我有一个正在创建“show_monthly_temp”的函数,我试图在其中绘制一个包含 12 个散点子图的图形,其中每个子图的下一行提到的目的。
函数
打印以下内容(DATE 是一个日期时间对象):
现在,我试图做的(未成功)是绘制 12 个子图,代表整个采样年中一年中每个月的平均值。
有什么想法可以这样做吗?
强调一下我的目标:
每个子图都是一个月,其中 Y 代表当年测量的温度,X 代表样本年份。
谢谢! :-)
完整代码在这里:
import pandas as pd
from datetime import datetime
import numpy as np
import scipy as stats
import matplotlib.pyplot as plt
def show_monthly_temp(tmax):
print(tmax)
# getting averages for months
# tmax_grouped_avg = tmax.groupby([tmax.index.month,tmax.index.year]).mean()
tmax_grouped_avg = tmax.groupby(tmax.index.strftime("%m/%Y")).mean()
print(type(tmax_grouped_avg))
fig, axes = plt.subplots(6,2)
print(tmax_grouped_avg)
# tmax_grouped_avg = pd.to_datetime(tmax_grouped_avg)
plt.show()
if __name__ == '__main__':
df = pd.read_csv("2961941.csv")
# set date column as index, drop the 'DATE' column to avoid repititions + create as datetime object
# speed up parsing using infer_datetime_format=True.
df.index = pd.to_datetime(df['DATE'], infer_datetime_format=True)
# create new tables
tmax = df.filter(['TMAX'], axis=1).dropna()
snow = df.filter(['SNOW']).dropna()
# count number of snow day samples - make sure at least >= 28
snow_grouped = snow.groupby(pd.Grouper(level='DATE', freq="M")).transform('count')
snow = (snow[snow_grouped['SNOW'] >= 28])
# count number of tmax day samples - make sure at least >= 28
tmax_grouped = tmax.groupby(pd.Grouper(level='DATE', freq="M")).transform('count')
tmax = (tmax[tmax_grouped['TMAX'] >= 28])
################ Until here - initialized data ###############
show_monthly_temp(tmax)
如果我没理解错的话,你可以这样做:
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import calendar
# Fake data - generating 'tmax_grouped_avg'.
df = pd.DataFrame({'Date': pd.date_range('1990-10-01', '2023-05-01')})
df['TMAX'] = np.random.random((len(df)))*30
tmax_grouped_avg = df.groupby(df['Date'].dt.strftime('%m/%Y')).mean()
# New code here.
tmax_grouped_avg['datetime'] = pd.to_datetime(tmax_grouped_avg.index)
tmax_grouped_avg['Year'] = tmax_grouped_avg['datetime'].dt.year
groups = tmax_grouped_avg.groupby(tmax_grouped_avg['datetime'].dt.month)
f, axes = plt.subplots(nrows=3, ncols=4, figsize=(12, 6))
for (grp_id, grp_df), ax in zip(groups, axes.ravel()):
# Check if you want sharex and sharey.
grp_df.plot.scatter(ax=ax, x='Year', y='TMAX', title=f'{calendar.month_name[grp_id]}', legend=False,
sharey=True, sharex=True)
plt.suptitle('Maximum temperature for each month')
plt.tight_layout()
plt.show()
结果:
嘿,网络上的人们,
我有一个正在创建“show_monthly_temp”的函数,我试图在其中绘制一个包含 12 个散点子图的图形,其中每个子图的下一行提到的目的。
函数
打印以下内容(DATE 是一个日期时间对象):
现在,我试图做的(未成功)是绘制 12 个子图,代表整个采样年中一年中每个月的平均值。
有什么想法可以这样做吗?
强调一下我的目标:
每个子图都是一个月,其中 Y 代表当年测量的温度,X 代表样本年份。
谢谢! :-)
完整代码在这里:
import pandas as pd
from datetime import datetime
import numpy as np
import scipy as stats
import matplotlib.pyplot as plt
def show_monthly_temp(tmax):
print(tmax)
# getting averages for months
# tmax_grouped_avg = tmax.groupby([tmax.index.month,tmax.index.year]).mean()
tmax_grouped_avg = tmax.groupby(tmax.index.strftime("%m/%Y")).mean()
print(type(tmax_grouped_avg))
fig, axes = plt.subplots(6,2)
print(tmax_grouped_avg)
# tmax_grouped_avg = pd.to_datetime(tmax_grouped_avg)
plt.show()
if __name__ == '__main__':
df = pd.read_csv("2961941.csv")
# set date column as index, drop the 'DATE' column to avoid repititions + create as datetime object
# speed up parsing using infer_datetime_format=True.
df.index = pd.to_datetime(df['DATE'], infer_datetime_format=True)
# create new tables
tmax = df.filter(['TMAX'], axis=1).dropna()
snow = df.filter(['SNOW']).dropna()
# count number of snow day samples - make sure at least >= 28
snow_grouped = snow.groupby(pd.Grouper(level='DATE', freq="M")).transform('count')
snow = (snow[snow_grouped['SNOW'] >= 28])
# count number of tmax day samples - make sure at least >= 28
tmax_grouped = tmax.groupby(pd.Grouper(level='DATE', freq="M")).transform('count')
tmax = (tmax[tmax_grouped['TMAX'] >= 28])
################ Until here - initialized data ###############
show_monthly_temp(tmax)
如果我没理解错的话,你可以这样做:
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import calendar
# Fake data - generating 'tmax_grouped_avg'.
df = pd.DataFrame({'Date': pd.date_range('1990-10-01', '2023-05-01')})
df['TMAX'] = np.random.random((len(df)))*30
tmax_grouped_avg = df.groupby(df['Date'].dt.strftime('%m/%Y')).mean()
# New code here.
tmax_grouped_avg['datetime'] = pd.to_datetime(tmax_grouped_avg.index)
tmax_grouped_avg['Year'] = tmax_grouped_avg['datetime'].dt.year
groups = tmax_grouped_avg.groupby(tmax_grouped_avg['datetime'].dt.month)
f, axes = plt.subplots(nrows=3, ncols=4, figsize=(12, 6))
for (grp_id, grp_df), ax in zip(groups, axes.ravel()):
# Check if you want sharex and sharey.
grp_df.plot.scatter(ax=ax, x='Year', y='TMAX', title=f'{calendar.month_name[grp_id]}', legend=False,
sharey=True, sharex=True)
plt.suptitle('Maximum temperature for each month')
plt.tight_layout()
plt.show()
结果: