up réseau de personnages et graph des intrigues
This commit is contained in:
parent
499ec2154a
commit
b4b4398bb0
24 changed files with 6836 additions and 33 deletions
|
@ -4,6 +4,9 @@
|
|||
|
||||
import csv
|
||||
from datetime import date, timedelta, datetime
|
||||
import matplotlib.pyplot as plt
|
||||
import numpy as np
|
||||
from scipy.interpolate import make_interp_spline
|
||||
|
||||
def mise_a_jour_suivi(fichier_csv, fichier_livre, fichier_personnages):
|
||||
# Lire le fichier livre.org
|
||||
|
@ -41,8 +44,27 @@ def analyse_csv(fichier_csv):
|
|||
donnees = list(reader)
|
||||
|
||||
# Récupérer les dates et les nombres de mots
|
||||
dates = [datetime.fromisoformat(donnee[0]).date() for donnee in donnees]
|
||||
mots = [int(donnee[1]) for donnee in donnees]
|
||||
dates_raw = [datetime.fromisoformat(donnee[0]) for donnee in donnees]
|
||||
mots_raw = [int(donnee[1]) for donnee in donnees]
|
||||
chapitres_raw = [int(donnee[5]) for donnee in donnees]
|
||||
|
||||
# Gérer les entrées dupliquées en gardant la dernière valeur pour chaque date
|
||||
date_data = {}
|
||||
for i, dt in enumerate(dates_raw):
|
||||
date_key = dt.date()
|
||||
date_data[date_key] = {
|
||||
'mots': mots_raw[i],
|
||||
'chapitres': chapitres_raw[i]
|
||||
}
|
||||
|
||||
# Trier les dates et extraire les valeurs uniques
|
||||
dates = sorted(date_data.keys())
|
||||
mots = [date_data[d]['mots'] for d in dates]
|
||||
chapitres = [date_data[d]['chapitres'] for d in dates]
|
||||
|
||||
# Créer les graphiques en aire adoucie
|
||||
create_smooth_area_chart(dates, mots, "Evolution du nombre de mots", "evolution_mots.png")
|
||||
create_smooth_area_chart(dates, chapitres, "Evolution du nombre de chapitres", "evolution_chapitres.png")
|
||||
|
||||
|
||||
# Récupérer la date du jour
|
||||
|
@ -99,4 +121,76 @@ def analyse_csv(fichier_csv):
|
|||
print("Total : ", most_recent," mots")
|
||||
mise_a_jour_suivi(fichier_csv, fichier_livre, fichier_personnages)
|
||||
|
||||
def create_smooth_area_chart(dates, values, title, filename):
|
||||
"""
|
||||
Crée un graphique en aire adoucie à partir des dates et des valeurs.
|
||||
|
||||
Args:
|
||||
dates: Liste des dates
|
||||
values: Liste des valeurs correspondantes
|
||||
title: Titre du graphique
|
||||
filename: Nom du fichier pour sauvegarder le graphique
|
||||
"""
|
||||
# Vérifier qu'il y a assez de données pour créer un graphique
|
||||
if len(dates) < 2:
|
||||
print(f"Pas assez de données pour créer le graphique {title}")
|
||||
return
|
||||
|
||||
# Convertir les dates en nombres (jours depuis la première date)
|
||||
date_nums = [(d - dates[0]).days for d in dates]
|
||||
|
||||
# Créer des points x pour l'interpolation (plus de points pour une courbe plus lisse)
|
||||
if len(date_nums) > 2:
|
||||
x_smooth = np.linspace(min(date_nums), max(date_nums), 300)
|
||||
|
||||
# Créer la spline pour l'interpolation
|
||||
spl = make_interp_spline(date_nums, values, k=min(3, len(dates)-1))
|
||||
y_smooth = spl(x_smooth)
|
||||
else:
|
||||
# Si seulement 2 points, utiliser une interpolation linéaire
|
||||
x_smooth = np.linspace(min(date_nums), max(date_nums), 300)
|
||||
y_smooth = np.interp(x_smooth, date_nums, values)
|
||||
|
||||
# Créer la figure
|
||||
plt.figure(figsize=(10, 6))
|
||||
|
||||
# Tracer l'aire sous la courbe
|
||||
plt.fill_between(x_smooth, y_smooth, alpha=0.5, color='skyblue')
|
||||
|
||||
# Tracer la ligne
|
||||
plt.plot(x_smooth, y_smooth, color='blue', linewidth=2)
|
||||
|
||||
# Ajouter les points de données réels
|
||||
plt.scatter(date_nums, values, color='darkblue', s=30)
|
||||
|
||||
# Configurer les étiquettes de l'axe x (dates)
|
||||
if len(dates) > 1:
|
||||
# Sélectionner quelques dates pour l'affichage
|
||||
num_ticks = min(10, len(dates))
|
||||
tick_indices = np.linspace(0, len(dates)-1, num_ticks, dtype=int)
|
||||
tick_positions = [date_nums[i] for i in tick_indices]
|
||||
tick_labels = [dates[i].strftime('%Y-%m-%d') for i in tick_indices]
|
||||
|
||||
plt.xticks(tick_positions, tick_labels, rotation=45)
|
||||
|
||||
# Ajouter les titres et les étiquettes
|
||||
plt.title(title, fontsize=16)
|
||||
plt.xlabel('Date', fontsize=12)
|
||||
plt.ylabel('Valeur', fontsize=12)
|
||||
|
||||
# Ajouter une grille
|
||||
plt.grid(True, linestyle='--', alpha=0.7)
|
||||
|
||||
# Ajuster la mise en page
|
||||
plt.tight_layout()
|
||||
|
||||
# Sauvegarder le graphique
|
||||
plt.savefig(filename, dpi=150, bbox_inches='tight')
|
||||
plt.savefig(filename.replace('.png', '.svg'), format='svg', bbox_inches='tight')
|
||||
|
||||
# Fermer la figure pour libérer la mémoire
|
||||
plt.close()
|
||||
|
||||
print(f"Graphique '{title}' sauvegardé sous {filename} et {filename.replace('.png', '.svg')}")
|
||||
|
||||
analyse_csv(fichier_csv)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue