From f0d4eadf28320286dff1794edd2af3c779dbd400 Mon Sep 17 00:00:00 2001 From: rnsrk Date: Tue, 3 Jan 2023 22:21:46 +0100 Subject: [PATCH] Now with prettier charts --- .gitignore | 3 ++- Main.py | 58 ++++++++++++++++++++++++++++++++++++++++++++---------- 2 files changed, 50 insertions(+), 11 deletions(-) diff --git a/.gitignore b/.gitignore index 2d8a3a2..22d268b 100644 --- a/.gitignore +++ b/.gitignore @@ -3,4 +3,5 @@ plots instance __pycache__ hedonodon_clientcred.secret -hedonodon_usercred.secret \ No newline at end of file +hedonodon_usercred.secret +.fleet \ No newline at end of file diff --git a/Main.py b/Main.py index 2dcdd3a..cd5ee0d 100644 --- a/Main.py +++ b/Main.py @@ -1,13 +1,15 @@ from CRUDManager import CRUDManager -from datetime import datetime +from datetime import datetime, date from DbSetup import init_db import locale from MastodonAccountManager import MastodonAccountManager import matplotlib.pyplot as plt +import matplotlib.dates as mdates +from matplotlib.ticker import MultipleLocator +import numpy as np from TootCrawler import TootCrawler -from sqlalchemy.sql import desc, select -locale.setlocale(locale.LC_TIME, "de_DE.UTF-8") +locale.setlocale(locale.LC_TIME, "en_EN.UTF-8") init_db() mastodonAccountManager = MastodonAccountManager() @@ -26,13 +28,22 @@ crudManager = CRUDManager() lastTootId = crudManager.getLastToot() tootsDataframe = tootCrawler.buildTootsDataframe(lastTootId) sentimentsYesterday = crudManager.calculateAggregates('sentiment', 'Count') + +colormap = { + 'negative"': '#ff9999', + 'neutral': '#ffcc99', + "positive": '#99ff99' +} + +todaysColors = [] +for sentiment in sentimentsYesterday['sentiment'].to_numpy(): + todaysColors.append(colormap[sentiment]) + compoundsYesterday = crudManager.calculateAggregates('compound', 'Avg') if not tootsDataframe.empty: crudManager.saveToDatabase(tootsDataframe, 'Toots', useIndex=False) crudManager.saveToDatabase(dataframe=sentimentsYesterday, table='Sentiments', useIndex=True) crudManager.saveToDatabase(dataframe=compoundsYesterday, table='Compounds', useIndex=True) - #print(sentimentsYesterday, 'sentimentsYesterday') - #print(compoundsYesterday, 'sentimentsYesterday') else: print('Nothing changed since last database insert!') @@ -42,16 +53,43 @@ dataframe4LineChart = crudManager.loadFromDatabase('Compounds', 'date').drop('in fig, axes = plt.subplots(nrows=2, ncols=1, figsize=(10,10)) +# Pie chart. pieChartlabels = dataframe4PieChart.index.to_numpy() -pieChart = dataframe4PieChart.plot.pie(ax=axes[0], y='sentimentCount', ylabel="", labels=dataframe4PieChart['sentimentCount'], title=f'Moods of the toots on {TodayDate} of the local timeline on fedihum.org', colors = ['red', 'grey', 'green']) +pieChart = dataframe4PieChart.plot.pie( + ax=axes[0], + y='sentimentCount', + ylabel="", + labels=dataframe4PieChart['sentimentCount'], + title=f'Moods of the toots on {TodayDate} of the local timeline on fedihum.org', + colors = todaysColors, + wedgeprops=dict(linewidth=3, edgecolor='w'), + startangle=90 +) + +axes[0].axis('equal') +centre_circle = plt.Circle((0,0),0.6,fc='white') +axes[0].add_patch(centre_circle) chartBox = axes[0].get_position() axes[0].set_position([chartBox.x0,chartBox.y0-0.2,chartBox.width,chartBox.height]) -axes[0].legend(pieChartlabels,loc='upper right', bbox_to_anchor=(1.3, 0.9)) -lineChart = dataframe4LineChart.plot.line(ax=axes[1], title='Compounds from max positive (1) to min neg (-1)') -axes[1].set_ylim([-1, 1]) +axes[0].legend(pieChartlabels,loc='upper right', bbox_to_anchor=(0.8, 0.9)) + +# Line chart. +lineChart = dataframe4LineChart.plot.line( + ax=axes[1], + title='Compounds from max positive (1) to min negative (-1)' + ) +axes[1].grid(True) +axes[1].set_xlim([date(2023, 1, 1), date(2023, 12, 31)]) +axes[1].set_ylim([-1, 1]) +axes[1].xaxis.set_major_locator(mdates.MonthLocator()) +axes[1].xaxis.set_minor_locator(mdates.MonthLocator(bymonthday=15)) +axes[1].xaxis.set_major_formatter(plt.NullFormatter()) +axes[1].xaxis.set_minor_formatter(mdates.DateFormatter('%h')) +axes[1].tick_params(which='minor', length=0) plotFileUrl = f'./plots/{TodayDate}.png' +plt.show() plt.savefig(plotFileUrl) media = mastodonInstance.media_post(plotFileUrl, mime_type="image/png", description=f"Sentiment analysis of local timeline on fedihum.org, showing the moods of the toots on, and the compounds up to {TodayDate}.") -mastodonInstance.status_post(f'The moods of the toots on and up to {TodayDate}.', media_ids=media, language='en') \ No newline at end of file +mastodonInstance.status_post(f'The moods of the toots on and up to {TodayDate}.', media_ids=media, language='en')