add counts on the bars, based on code provided by Svardsten53
This commit is contained in:
+29
-6
@@ -33,6 +33,18 @@ def get_data(now=None):
|
|||||||
return df, now
|
return df, now
|
||||||
|
|
||||||
|
|
||||||
|
# Function to show value on bars - from https://stackoverflow.com/questions/43214978/seaborn-barplot-displaying-values
|
||||||
|
def show_values_on_bars(ax, label):
|
||||||
|
for i, p in enumerate(ax.patches):
|
||||||
|
x = p.get_x() + p.get_width() * 0.9
|
||||||
|
y = p.get_y() + p.get_height() / 2
|
||||||
|
value = '{:.0%}'.format(label[i])
|
||||||
|
# Uncomment for Species Count Total
|
||||||
|
value = '{:n}'.format(p.get_width())
|
||||||
|
bbox = {'facecolor': 'lightgrey', 'edgecolor': 'none', 'pad': 1.0}
|
||||||
|
ax.text(x, y, value, bbox=bbox, ha='center', va='center', size=9, color='darkgreen')
|
||||||
|
|
||||||
|
|
||||||
def create_plot(df_plt_today, now, is_top=None):
|
def create_plot(df_plt_today, now, is_top=None):
|
||||||
if is_top is not None:
|
if is_top is not None:
|
||||||
readings = 10
|
readings = 10
|
||||||
@@ -47,8 +59,8 @@ def create_plot(df_plt_today, now, is_top=None):
|
|||||||
df_plt_selection_today = df_plt_today[df_plt_today.Com_Name.isin(plt_selection_today.index)]
|
df_plt_selection_today = df_plt_today[df_plt_today.Com_Name.isin(plt_selection_today.index)]
|
||||||
|
|
||||||
# Set up plot axes and titles
|
# Set up plot axes and titles
|
||||||
f, axs = plt.subplots(1, 2, figsize=(10, 4), gridspec_kw=dict(width_ratios=[3, 6]), facecolor='#77C487')
|
height = max(readings / 3, 0) + 1.06
|
||||||
plt.subplots_adjust(left=None, bottom=None, right=None, top=None, wspace=0, hspace=0)
|
f, axs = plt.subplots(1, 2, figsize=(10, height), gridspec_kw=dict(width_ratios=[3, 6]), facecolor='#77C487')
|
||||||
|
|
||||||
# generate y-axis order for all figures based on frequency
|
# generate y-axis order for all figures based on frequency
|
||||||
freq_order = df_plt_selection_today['Com_Name'].value_counts().index
|
freq_order = df_plt_selection_today['Com_Name'].value_counts().index
|
||||||
@@ -80,8 +92,11 @@ def create_plot(df_plt_today, now, is_top=None):
|
|||||||
plot = sns.countplot(y='Com_Name', hue='Com_Name', legend=False, data=df_plt_selection_today,
|
plot = sns.countplot(y='Com_Name', hue='Com_Name', legend=False, data=df_plt_selection_today,
|
||||||
palette=colors, order=freq_order, ax=axs[0])
|
palette=colors, order=freq_order, ax=axs[0])
|
||||||
|
|
||||||
|
# Prints Max Confidence on bars
|
||||||
|
show_values_on_bars(axs[0], confmax)
|
||||||
|
|
||||||
# Try plot grid lines between bars - problem at the moment plots grid lines on bars - want between bars
|
# Try plot grid lines between bars - problem at the moment plots grid lines on bars - want between bars
|
||||||
yticklabels = ['\n'.join(textwrap.wrap(ticklabel.get_text(), 15)) for ticklabel in plot.get_yticklabels()]
|
yticklabels = ['\n'.join(textwrap.wrap(ticklabel.get_text(), 16)) for ticklabel in plot.get_yticklabels()]
|
||||||
plot.set_yticklabels(yticklabels, fontsize=10)
|
plot.set_yticklabels(yticklabels, fontsize=10)
|
||||||
plot.set(ylabel=None)
|
plot.set(ylabel=None)
|
||||||
plot.set(xlabel="Detections")
|
plot.set(xlabel="Detections")
|
||||||
@@ -108,7 +123,7 @@ def create_plot(df_plt_today, now, is_top=None):
|
|||||||
if int(label.get_text()) == now.hour:
|
if int(label.get_text()) == now.hour:
|
||||||
label.set_color('yellow')
|
label.set_color('yellow')
|
||||||
|
|
||||||
plot.set_xticklabels(plot.get_xticklabels(), rotation=0, size=7)
|
plot.set_xticklabels(plot.get_xticklabels(), rotation=0, size=8)
|
||||||
|
|
||||||
# Set heatmap border
|
# Set heatmap border
|
||||||
for _, spine in plot.spines.items():
|
for _, spine in plot.spines.items():
|
||||||
@@ -117,8 +132,11 @@ def create_plot(df_plt_today, now, is_top=None):
|
|||||||
plot.set(ylabel=None)
|
plot.set(ylabel=None)
|
||||||
plot.set(xlabel="Hour of Day")
|
plot.set(xlabel="Hour of Day")
|
||||||
# Set combined plot layout and titles
|
# Set combined plot layout and titles
|
||||||
f.subplots_adjust(top=0.9)
|
y = 1 - 8 / (height * 100)
|
||||||
plt.suptitle(f"{plot_type} {readings} Last Updated: {now.strftime('%Y-%m-%d %H:%M')}")
|
plt.suptitle(f"{plot_type} {readings} Last Updated: {now.strftime('%Y-%m-%d %H:%M')}", y=y)
|
||||||
|
f.tight_layout()
|
||||||
|
top = 1 - 40 / (height * 100)
|
||||||
|
f.subplots_adjust(left=0.125, right=0.9, top=top, wspace=0)
|
||||||
|
|
||||||
# Save combined plot
|
# Save combined plot
|
||||||
save_name = os.path.expanduser(f"~/BirdSongs/Extracted/Charts/{name}-{now.strftime('%Y-%m-%d')}.png")
|
save_name = os.path.expanduser(f"~/BirdSongs/Extracted/Charts/{name}-{now.strftime('%Y-%m-%d')}.png")
|
||||||
@@ -141,6 +159,11 @@ def main(daemon, sleep_m):
|
|||||||
last_run = None
|
last_run = None
|
||||||
while True:
|
while True:
|
||||||
now = datetime.now()
|
now = datetime.now()
|
||||||
|
# now = datetime.strptime('2023-12-13T23:59:59', "%Y-%m-%dT%H:%M:%S")
|
||||||
|
# now = datetime.strptime('2024-01-02T23:59:59', "%Y-%m-%dT%H:%M:%S")
|
||||||
|
# now = datetime.strptime('2024-02-26T23:59:59', "%Y-%m-%dT%H:%M:%S")
|
||||||
|
# now = datetime.strptime('2024-04-03T23:59:59', "%Y-%m-%dT%H:%M:%S")
|
||||||
|
# now = datetime.strptime('2024-04-07T23:59:59', "%Y-%m-%dT%H:%M:%S")
|
||||||
if last_run and now.day != last_run.day:
|
if last_run and now.day != last_run.day:
|
||||||
print("getting yesterday's dataset")
|
print("getting yesterday's dataset")
|
||||||
yesterday = last_run.replace(hour=23, minute=59)
|
yesterday = last_run.replace(hour=23, minute=59)
|
||||||
|
|||||||
Reference in New Issue
Block a user