histlearn commited on
Commit
b00ebbf
·
verified ·
1 Parent(s): 41e939e

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +111 -18
app.py CHANGED
@@ -304,32 +304,125 @@ def gerar_paleta_cores(n_cores: int) -> List[str]:
304
  def plotar_evolucao_bimestres(disciplinas_dados: List[Dict], temp_dir: str,
305
  titulo: Optional[str] = None,
306
  nome_arquivo: Optional[str] = None) -> str:
307
- plt.style.use('seaborn-v0_8-darkgrid')
 
 
 
 
 
 
 
308
  fig, ax = plt.subplots(figsize=(11.69, 8.27))
 
 
 
 
 
 
 
 
 
 
 
309
 
310
- # (Configurações do gráfico e plotagem dos dados aqui)
311
-
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
312
  plt.tight_layout()
313
- fig.canvas.draw() # Adicionado para garantir a renderização do gráfico
 
314
  nome_arquivo = nome_arquivo or 'evolucao_notas.png'
315
  plot_path = os.path.join(temp_dir, nome_arquivo)
316
  plt.savefig(plot_path, bbox_inches='tight', dpi=300,
317
  facecolor='white', edgecolor='none')
318
  plt.close()
319
- return plot_path
320
-
321
- def plotar_graficos_destacados(disciplinas_dados: List[Dict], temp_dir: str) -> str:
322
- plt.style.use('seaborn')
323
- fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(12, 10))
324
-
325
- # (Configurações do gráfico e plotagem dos dados aqui)
326
-
327
- plt.tight_layout()
328
- fig.canvas.draw() # Adicionado para garantir a renderização do gráfico
329
- plot_path = os.path.join(temp_dir, 'medias_frequencias.png')
330
- plt.savefig(plot_path, bbox_inches='tight', dpi=300,
331
- facecolor='white', edgecolor='none')
332
- plt.close()
333
  return plot_path
334
 
335
  # Funções de processamento do PDF e geração de relatórios
 
304
  def plotar_evolucao_bimestres(disciplinas_dados: List[Dict], temp_dir: str,
305
  titulo: Optional[str] = None,
306
  nome_arquivo: Optional[str] = None) -> str:
307
+ """Plota gráfico de evolução das notas com visual aprimorado."""
308
+ n_disciplinas = len(disciplinas_dados)
309
+
310
+ if n_disciplinas == 0:
311
+ raise ValueError("Nenhuma disciplina válida encontrada para plotar.")
312
+
313
+ # Configuração do estilo
314
+ plt.style.use('seaborn-v0_8-darkgrid') # Use o estilo atualizado
315
  fig, ax = plt.subplots(figsize=(11.69, 8.27))
316
+
317
+ # Configurar grid mais suave
318
+ ax.grid(True, linestyle='--', alpha=0.2, color='gray')
319
+ ax.set_axisbelow(True)
320
+
321
+ # Paleta de cores e outros parâmetros de estilo
322
+ cores = gerar_paleta_cores(n_disciplinas)
323
+ marcadores = ['o', 's', '^', 'D', 'v', '<', '>', 'p']
324
+ estilos_linha = ['-', '--', '-.', ':']
325
+ deslocamentos = np.linspace(-0.02, 0.02, n_disciplinas)
326
+ anotacoes_usadas = {}
327
 
328
+ for idx, disc_data in enumerate(disciplinas_dados):
329
+ notas = pd.Series(disc_data['notas'])
330
+ bimestres_cursados = disc_data['bimestres_cursados']
331
+ desloc = deslocamentos[idx]
332
+
333
+ if bimestres_cursados:
334
+ notas_validas = [nota for i, nota in enumerate(notas, 1)
335
+ if i in bimestres_cursados and nota is not None]
336
+ bimestres = [bim for bim in bimestres_cursados
337
+ if notas[bim-1] is not None]
338
+ bimestres_deslocados = [bim + desloc for bim in bimestres]
339
+
340
+ if notas_validas:
341
+ # Linha com sombreamento
342
+ plt.plot(bimestres_deslocados, notas_validas,
343
+ color=cores[idx % len(cores)],
344
+ marker=marcadores[idx % len(marcadores)],
345
+ markersize=8,
346
+ linewidth=2.5,
347
+ label=disc_data['disciplina'],
348
+ linestyle=estilos_linha[idx % len(estilos_linha)],
349
+ alpha=0.8,
350
+ zorder=3)
351
+
352
+ # Área sombreada sob a linha
353
+ plt.fill_between(bimestres_deslocados, 0, notas_validas,
354
+ color=cores[idx % len(cores)],
355
+ alpha=0.1)
356
+
357
+ # Anotações das notas
358
+ for bim, nota in zip(bimestres_deslocados, notas_validas):
359
+ if nota is not None:
360
+ y_offset = 10
361
+ while any(abs(y - (nota + y_offset/20)) < 0.4
362
+ for y, _ in anotacoes_usadas.get(bim, [])):
363
+ y_offset += 5
364
+
365
+ plt.annotate(f"{nota:.1f}",
366
+ (bim, nota),
367
+ xytext=(0, y_offset),
368
+ textcoords="offset points",
369
+ ha='center',
370
+ va='bottom',
371
+ fontsize=9,
372
+ bbox=dict(
373
+ facecolor='white',
374
+ edgecolor=cores[idx % len(cores)],
375
+ alpha=0.8,
376
+ pad=2,
377
+ boxstyle='round,pad=0.5'
378
+ ))
379
+
380
+ if bim not in anotacoes_usadas:
381
+ anotacoes_usadas[bim] = []
382
+ anotacoes_usadas[bim].append((nota + y_offset/20, nota))
383
+
384
+ # Estilização do gráfico
385
+ titulo_grafico = titulo or 'Evolução das Médias por Disciplina'
386
+ plt.title(titulo_grafico, pad=20, fontsize=14, fontweight='bold')
387
+ plt.xlabel('Bimestres', fontsize=12, labelpad=10)
388
+ plt.ylabel('Notas', fontsize=12, labelpad=10)
389
+
390
+ # Remover bordas desnecessárias
391
+ ax.spines['top'].set_visible(False)
392
+ ax.spines['right'].set_visible(False)
393
+
394
+ plt.xticks([1, 2, 3, 4], ['1º Bim', '2º Bim', '3º Bim', '4º Bim'],
395
+ fontsize=10)
396
+ plt.ylim(0, ESCALA_MAXIMA_NOTAS)
397
+
398
+ # Linha de aprovação estilizada
399
+ plt.axhline(y=LIMITE_APROVACAO_NOTA, color=COR_REPROVADO,
400
+ linestyle='--', alpha=0.3, linewidth=2)
401
+ plt.text(0.02, LIMITE_APROVACAO_NOTA + 0.1,
402
+ 'Média mínima para aprovação',
403
+ transform=plt.gca().get_yaxis_transform(),
404
+ color=COR_REPROVADO, alpha=0.7)
405
+
406
+ # Legenda
407
+ if n_disciplinas > 8:
408
+ plt.legend(bbox_to_anchor=(1.05, 1), loc='upper left',
409
+ fontsize=9, framealpha=0.8,
410
+ fancybox=True, shadow=True,
411
+ ncol=max(1, n_disciplinas // 12))
412
+ else:
413
+ plt.legend(bbox_to_anchor=(1.05, 1), loc='upper left',
414
+ fontsize=10, framealpha=0.8,
415
+ fancybox=True, shadow=True)
416
+
417
  plt.tight_layout()
418
+
419
+ # Salvar o gráfico em alta qualidade
420
  nome_arquivo = nome_arquivo or 'evolucao_notas.png'
421
  plot_path = os.path.join(temp_dir, nome_arquivo)
422
  plt.savefig(plot_path, bbox_inches='tight', dpi=300,
423
  facecolor='white', edgecolor='none')
424
  plt.close()
425
+
 
 
 
 
 
 
 
 
 
 
 
 
 
426
  return plot_path
427
 
428
  # Funções de processamento do PDF e geração de relatórios