繁体   English   中英

为什么我不能在我的图中添加散点?

[英]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()
  1. 使用plt.subplots创建一个可重复使用的ax并在所有数据plt.subplots指定ax=ax
  2. 分组后保留Date列,以便您可以针对实际datetime时间轴而不是mm-dd字符串进行绘图。 在进行lowerhigher比较时,这将需要一些重新索引,但它允许正确缩放所有图。
  3. 使用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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM