[英]Why can't I add scatter points to my plot?
我正在处理的数据: https : //drive.google.com/file/d/1xb7icmocz-SD2Rkq4ykTZowxW0uFFhBl/view?usp=sharing
我不明白为什么我的代码不起作用。 当我尝试将数据框“更高”和“更低”添加到我的图中时,问题就出现了。 我相信我犯了一个非常基本的错误,但无法弄清楚它是什么。 有任何想法吗??
对于某些一般情况,我想将 2015 年最低/最高温度低于/高于 2005-2014 年期间的数据绘制为点。
非常感谢任何帮助!!
get_ipython().magic("matplotlib inline")
df = pd.read_csv("data/C2A2_data/BinnedCsvs_d400/fb441e62df2d58994928907a91895ec62c2c42e6cd075c2700843b89.csv")
df['degrees']=df['Data_Value']/10
df['Date'] = pd.to_datetime(df['Date'])
df2 = df[df['Date']<'2015-01-01']
df3 = df[df['Date']>='2015-01-01']
fmt_str = '%m-%d'
max_temp = df2.groupby(df2.Date.dt.strftime(fmt_str))['degrees'].max()
min_temp = df2.groupby(df2.Date.dt.strftime(fmt_str))['degrees'].min()
max_temp=max_temp.drop('02-29')
min_temp=min_temp.drop('02-29')
max_temp2 = df3.groupby(df3.Date.dt.strftime(fmt_str))['degrees'].max()
min_temp2 = df3.groupby(df3.Date.dt.strftime(fmt_str))['degrees'].min()
dfmin = min_temp.to_frame().reset_index()
dfmin2 = min_temp2.to_frame().reset_index()
dfmax = max_temp.to_frame().reset_index()
dfmax2 = max_temp2.to_frame().reset_index()
lower = dfmin2[dfmin2['degrees']<dfmin['degrees']]
higher = dfmax2[dfmax2['degrees']>dfmax['degrees']]
max_temp.plot(x ='Date', y='degrees', kind = 'line')
min_temp.plot(x ='Date',y='degrees', kind= 'line')
lower.plot(x = 'Date', y='degrees', kind='scatter')
higher.plot(x = 'Date', y='degrees', kind='scatter')
plt.fill_between(range(len(min_temp)),min_temp, max_temp, color='C0', alpha=0.2)
ax = plt.gca()
ax.set(xlabel="Date",
ylabel="Temperature",
title="Extreme Weather in 2015")
plt.legend()
plt.tight_layout()
x = plt.gca().xaxis
ax.legend(['Record high temperatures 2005-2014', 'Record low temperatures 2005-2014'])
month=['Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec']
DayOfMonth=[1,32,60,91,121,152,182,213,244,274,305,335]
plt.xticks(DayOfMonth)
plt.xticks(DayOfMonth,month)
for item in x.get_ticklabels():
item.set_rotation(45)
plt.show()
plt.subplots
创建一个可重复使用的ax
并在所有数据plt.subplots
指定ax=ax
。Date
列,以便您可以针对实际datetime
时间轴而不是mm-dd
字符串进行绘图。 在进行lower
和higher
比较时,这将需要一些重新索引,但它允许正确缩放所有图。matplotlib.dates.DateFormatter
将 x 刻度格式化为月份缩写。df = pd.read_csv('data/C2A2_data/BinnedCsvs_d400/fb441e62df2d58994928907a91895ec62c2c42e6cd075c2700843b89.csv')
df['degrees'] = df['Data_Value'] / 10
df['Date'] = pd.to_datetime(df['Date'])
df2 = df[df['Date'] < '2015-01-01']
df3 = df[df['Date'] >= '2015-01-01']
# keep the Date column after grouping and set as index
fmt_str = '%m-%d'
max_temp = df2.groupby(df2['Date'].dt.strftime(fmt_str), as_index=False)[['Date', 'degrees']].max().set_index('Date')
min_temp = df2.groupby(df2['Date'].dt.strftime(fmt_str), as_index=False)[['Date', 'degrees']].min().set_index('Date')
max_temp2 = df3.groupby(df3['Date'].dt.strftime(fmt_str), as_index=False)[['Date', 'degrees']].max().set_index('Date')
min_temp2 = df3.groupby(df3['Date'].dt.strftime(fmt_str), as_index=False)[['Date', 'degrees']].min().set_index('Date')
# change all years to 2015 since we only care about month/day
max_temp.index = max_temp.index + pd.offsets.DateOffset(year=2015)
min_temp.index = min_temp.index + pd.offsets.DateOffset(year=2015)
# reindex to allow direct series comparison
min_temp2 = min_temp2.reindex(min_temp.index)
max_temp2 = max_temp2.reindex(max_temp.index)
lower = min_temp2[min_temp2 < min_temp]
higher = max_temp2[max_temp2 > max_temp]
# create reusable ax
fig, ax = plt.subplots()
# plot onto ax
max_temp.reset_index().plot(ax=ax, x='Date', y='degrees', label='Record high temperatures 2005-2014')
min_temp.reset_index().plot(ax=ax, x='Date', y='degrees', label='Record low temperatures 2005-2014')
lower.reset_index().plot.scatter(ax=ax, x='Date', y='degrees', c='k')
higher.reset_index().plot.scatter(ax=ax, x='Date', y='degrees', c='k')
ax.fill_between(min_temp.index, min_temp.values.ravel(), max_temp.values.ravel(), color='C0', alpha=0.2)
# format x ticks into month abbreviations
ax.xaxis.set_major_formatter(matplotlib.dates.DateFormatter('%b'))
ax.xaxis.set_major_locator(matplotlib.dates.MonthLocator(interval=1))
ax.set_xlim('2015-01-01', '2015-12-31')
plt.xticks(rotation=45, rotation_mode='anchor')
ax.set_xlabel('Date')
ax.set_ylabel('Temperature')
ax.set_title('Extreme Weather in 2015')
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.