def plotter(fdict): """ Go """ pgconn = get_dbconn("asos") ctx = get_autoplot_context(fdict, get_description()) station = ctx["zstation"] syear = ctx["syear"] eyear = ctx["eyear"] groupby = ctx["groupby"] sts = datetime.date(syear, 1, 1) ets = datetime.date(eyear + 1, 1, 1) code = ctx["code"] if code == "PSN": code = "+SN" PDICT["+SN"] = PDICT["PSN"] if groupby == "week": data = np.ma.zeros((24, 52), "f") df = read_sql( """ WITH data as ( SELECT valid at time zone %s + '10 minutes'::interval as v from alldata where station = %s and array_to_string(wxcodes, '') LIKE '%%""" + code + """%%' and valid > %s and valid < %s), agg as ( SELECT distinct extract(week from v)::int as week, extract(doy from v)::int as doy, extract(year from v)::int as year, extract(hour from v)::int as hour from data) SELECT week, year, hour, count(*) from agg WHERE week < 53 GROUP by week, year, hour """, pgconn, params=(ctx["_nt"].sts[station]["tzname"], station, sts, ets), index_col=None, ) else: data = np.ma.zeros((24, 366), "f") df = read_sql( """ WITH data as ( SELECT valid at time zone %s + '10 minutes'::interval as v from alldata where station = %s and array_to_string(wxcodes, '') LIKE '%%""" + code + """%%' and valid > %s and valid < %s), agg as ( SELECT distinct extract(doy from v)::int as doy, extract(year from v)::int as year, extract(hour from v)::int as hour from data) SELECT doy, year, hour, count(*) from agg GROUP by doy, year, hour """, pgconn, params=(ctx["_nt"].sts[station]["tzname"], station, sts, ets), index_col=None, ) if df.empty: raise NoDataFound("No data was found, sorry!") minyear = df["year"].min() maxyear = df["year"].max() for _, row in df.iterrows(): data[row["hour"], row[groupby] - 1] += 1 data.mask = np.where(data == 0, True, False) fig = plt.figure(figsize=(8, 6)) ax = plt.axes([0.11, 0.25, 0.7, 0.65]) cax = plt.axes([0.82, 0.04, 0.02, 0.15]) res = ax.imshow( data, aspect="auto", rasterized=True, interpolation="nearest" ) fig.colorbar(res, cax=cax) xloc = plt.MaxNLocator(4) cax.yaxis.set_major_locator(xloc) cax.set_ylabel("Count") ax.set_ylim(-0.5, 23.5) ax.set_yticks((0, 4, 8, 12, 16, 20)) ax.set_ylabel("Local Time, %s" % (ctx["_nt"].sts[station]["tzname"],)) ax.set_yticklabels(("Mid", "4 AM", "8 AM", "Noon", "4 PM", "8 PM")) ax.set_title( ("[%s] %s %s Reports\n[%.0f - %.0f]" " by hour and %s") % ( station, ctx["_nt"].sts[station]["name"], PDICT[code], minyear, maxyear, PDICT2[groupby].replace("group ", ""), ) ) ax.grid(True) lax = plt.axes([0.11, 0.1, 0.7, 0.15]) if groupby == "week": ax.set_xticks(np.arange(0, 55, 7)) lax.bar(np.arange(0, 52), np.ma.sum(data, 0), facecolor="tan") lax.set_xlim(-0.5, 51.5) lax.set_xticks(np.arange(0, 55, 7)) lax.set_xticklabels( ( "Jan 1", "Feb 19", "Apr 8", "May 27", "Jul 15", "Sep 2", "Oct 21", "Dec 9", ) ) else: ax.set_xticks( [1, 32, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335, 365] ) lax.bar(np.arange(0, 366), np.ma.sum(data, 0), facecolor="tan") lax.set_xlim(-0.5, 365.5) lax.set_xticks( [1, 32, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335, 365] ) lax.set_xticklabels(calendar.month_abbr[1:]) plt.setp(ax.get_xticklabels(), visible=False) # Bottom grid lax.grid(True) yloc = plt.MaxNLocator(3) lax.yaxis.set_major_locator(yloc) lax.yaxis.get_major_ticks()[-1].label1.set_visible(False) # Right grid rax = plt.axes([0.81, 0.25, 0.15, 0.65]) rax.barh(np.arange(0, 24) - 0.4, np.ma.sum(data, 1), facecolor="tan") rax.set_ylim(-0.5, 23.5) rax.set_yticks([]) xloc = plt.MaxNLocator(3) rax.xaxis.set_major_locator(xloc) rax.xaxis.get_major_ticks()[0].label1.set_visible(False) rax.grid(True) return fig, df
def plotter(fdict): """ Go """ pgconn = get_dbconn('postgis') ctx = get_autoplot_context(fdict, get_description()) station = ctx['station'][:4] phenomena = ctx['phenomena'] significance = ctx['significance'] split = ctx['split'] opt = ctx['opt'] state = ctx['state'] nt = NetworkTable('WFO') wfolimiter = " wfo = '%s' " % (station, ) if opt == 'state': wfolimiter = " substr(ugc, 1, 2) = '%s' " % (state, ) if split == 'jan1': sql = """ SELECT extract(year from issue)::int as year, min(issue at time zone 'UTC') as min_issue, max(issue at time zone 'UTC') as max_issue, count(distinct wfo || eventid) from warnings where """ + wfolimiter + """ and phenomena = %s and significance = %s GROUP by year ORDER by year ASC """ else: sql = """ SELECT extract(year from issue - '6 months'::interval)::int as year, min(issue at time zone 'UTC') as min_issue, max(issue at time zone 'UTC') as max_issue, count(distinct wfo || eventid) from warnings where """ + wfolimiter + """ and phenomena = %s and significance = %s GROUP by year ORDER by year ASC """ df = read_sql(sql, pgconn, params=(phenomena, significance), index_col=None) if df.empty: raise ValueError("No data found for query") # Since many VTEC events start in 2005, we should not trust any # data that has its first year in 2005 if df['year'].min() == 2005: df = df[df['year'] > 2005] def myfunc(row): year = row[0] valid = row[1] if year == valid.year: return int(valid.strftime("%j")) else: days = (datetime.date(year + 1, 1, 1) - datetime.date(year, 1, 1)).days return int(valid.strftime("%j")) + days df['startdoy'] = df[['year', 'min_issue']].apply(myfunc, axis=1) df['enddoy'] = df[['year', 'max_issue']].apply(myfunc, axis=1) df.set_index('year', inplace=True) # allow for small bars when there is just one event df.loc[df['enddoy'] == df['startdoy'], 'enddoy'] = df['enddoy'] + 1 ends = df['enddoy'].values starts = df['startdoy'].values years = df.index.values fig = plt.figure(figsize=(8, 6)) ax = plt.axes([0.1, 0.1, 0.7, 0.8]) ax.barh(years, (ends - starts), left=starts, fc='blue', align='center') ax.axvline(np.average(starts[:-1]), lw=2, color='red') ax.axvline(np.average(ends[:-1]), lw=2, color='red') ax.set_xlabel(("Avg Start Date: %s, End Date: %s") % ((datetime.date(2000, 1, 1) + datetime.timedelta( days=int(np.average(starts[:-1])))).strftime("%-d %b"), (datetime.date(2000, 1, 1) + datetime.timedelta( days=int(np.average(ends[:-1])))).strftime("%-d %b")), color='red') title = "[%s] NWS %s" % (station, nt.sts[station]['name']) if opt == 'state': title = ("NWS Issued Alerts for State of %s") % ( reference.state_names[state], ) ax.set_title(("%s\nPeriod between First and Last %s") % (title, vtec.get_ps_string(phenomena, significance))) ax.grid() days = [1, 32, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335] days = days + [x + 365 for x in days] ax.set_xticks(days) ax.set_xticklabels(calendar.month_abbr[1:] + calendar.month_abbr[1:]) ax.set_xlim(df['startdoy'].min() - 10, df['enddoy'].max() + 10) ax.set_ylabel("Year") ax.set_ylim(years[0] - 0.5, years[-1] + 0.5) xFormatter = FormatStrFormatter('%d') ax.yaxis.set_major_formatter(xFormatter) ax = plt.axes([0.82, 0.1, 0.13, 0.8]) ax.barh(years, df['count'], fc='blue', align='center') ax.set_ylim(years[0] - 0.5, years[-1] + 0.5) plt.setp(ax.get_yticklabels(), visible=False) ax.grid(True) ax.set_xlabel("# Events") ax.yaxis.set_major_formatter(xFormatter) xloc = plt.MaxNLocator(3) ax.xaxis.set_major_locator(xloc) return fig, df
def plotter(fdict): """ Go """ pgconn = get_dbconn('asos') ctx = get_autoplot_context(fdict, get_description()) station = ctx['zstation'] network = ctx['network'] syear = ctx['syear'] eyear = ctx['eyear'] groupby = ctx['groupby'] sts = datetime.date(syear, 1, 1) ets = datetime.date(eyear + 1, 1, 1) nt = NetworkTable(network) code = ctx['code'] if code == 'PSN': code = "+SN" PDICT['+SN'] = PDICT['PSN'] if groupby == 'week': data = np.ma.zeros((24, 52), 'f') df = read_sql(""" WITH data as ( SELECT valid at time zone %s + '10 minutes'::interval as v from alldata where station = %s and array_to_string(wxcodes, '') LIKE '%%""" + code + """%%' and valid > %s and valid < %s), agg as ( SELECT distinct extract(week from v)::int as week, extract(doy from v)::int as doy, extract(year from v)::int as year, extract(hour from v)::int as hour from data) SELECT week, year, hour, count(*) from agg WHERE week < 53 GROUP by week, year, hour """, pgconn, params=(nt.sts[station]['tzname'], station, sts, ets), index_col=None) else: data = np.ma.zeros((24, 366), 'f') df = read_sql(""" WITH data as ( SELECT valid at time zone %s + '10 minutes'::interval as v from alldata where station = %s and array_to_string(wxcodes, '') LIKE '%%""" + code + """%%' and valid > %s and valid < %s), agg as ( SELECT distinct extract(doy from v)::int as doy, extract(year from v)::int as year, extract(hour from v)::int as hour from data) SELECT doy, year, hour, count(*) from agg GROUP by doy, year, hour """, pgconn, params=(nt.sts[station]['tzname'], station, sts, ets), index_col=None) if df.empty: raise ValueError("No data was found, sorry!") minyear = df['year'].min() maxyear = df['year'].max() for _, row in df.iterrows(): data[row['hour'], row[groupby] - 1] += 1 data.mask = np.where(data == 0, True, False) fig = plt.figure(figsize=(8, 6)) ax = plt.axes([0.11, 0.25, 0.7, 0.65]) cax = plt.axes([0.82, 0.04, 0.02, 0.15]) res = ax.imshow(data, aspect='auto', rasterized=True, interpolation='nearest') fig.colorbar(res, cax=cax) xloc = plt.MaxNLocator(4) cax.yaxis.set_major_locator(xloc) cax.set_ylabel("Count") ax.set_ylim(-0.5, 23.5) ax.set_yticks((0, 4, 8, 12, 16, 20)) ax.set_ylabel("Local Time, %s" % (nt.sts[station]['tzname'], )) ax.set_yticklabels(('Mid', '4 AM', '8 AM', 'Noon', '4 PM', '8 PM')) ax.set_title(("[%s] %s %s Reports\n[%.0f - %.0f]" " by hour and %s") % (station, nt.sts[station]['name'], PDICT[code], minyear, maxyear, PDICT2[groupby].replace("group ", ""))) ax.grid(True) lax = plt.axes([0.11, 0.1, 0.7, 0.15]) if groupby == 'week': ax.set_xticks(np.arange(0, 55, 7)) lax.bar(np.arange(0, 52), np.ma.sum(data, 0), facecolor='tan') lax.set_xlim(-0.5, 51.5) lax.set_xticks(np.arange(0, 55, 7)) lax.set_xticklabels(('Jan 1', 'Feb 19', 'Apr 8', 'May 27', 'Jul 15', 'Sep 2', 'Oct 21', 'Dec 9')) else: ax.set_xticks( [1, 32, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335, 365]) lax.bar(np.arange(0, 366), np.ma.sum(data, 0), facecolor='tan') lax.set_xlim(-0.5, 365.5) lax.set_xticks( [1, 32, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335, 365]) lax.set_xticklabels(calendar.month_abbr[1:]) plt.setp(ax.get_xticklabels(), visible=False) # Bottom grid lax.grid(True) yloc = plt.MaxNLocator(3) lax.yaxis.set_major_locator(yloc) lax.yaxis.get_major_ticks()[-1].label1.set_visible(False) # Right grid rax = plt.axes([0.81, 0.25, 0.15, 0.65]) rax.barh(np.arange(0, 24) - 0.4, np.ma.sum(data, 1), facecolor='tan') rax.set_ylim(-0.5, 23.5) rax.set_yticks([]) xloc = plt.MaxNLocator(3) rax.xaxis.set_major_locator(xloc) rax.xaxis.get_major_ticks()[0].label1.set_visible(False) rax.grid(True) return fig, df