histlearn commited on
Commit
3f5b07d
·
verified ·
1 Parent(s): df59a77

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +30 -22
app.py CHANGED
@@ -204,7 +204,7 @@ def plotar_evolucao_bimestres(disciplinas_dados, temp_dir):
204
  if n_disciplinas == 0:
205
  raise ValueError("Nenhuma disciplina válida encontrada para plotar.")
206
 
207
- plt.figure(figsize=(11.69, 8.27)) # Tamanho A4 em polegadas
208
 
209
  cores = gerar_paleta_cores(n_disciplinas)
210
  marcadores = ['o', 's', '^', 'D', 'v', '<', '>', 'p', 'h', '*']
@@ -212,13 +212,13 @@ def plotar_evolucao_bimestres(disciplinas_dados, temp_dir):
212
 
213
  plt.grid(True, linestyle='--', alpha=0.3, zorder=0)
214
 
215
- # Configurar deslocamentos para evitar sobreposição
216
- deslocamentos = np.linspace(-0.1, 0.1, n_disciplinas)
217
 
218
  # Dicionário para armazenar valores por posição
219
  notas_por_posicao = {}
220
 
221
- # Primeira passagem: coletar todos os valores considerando os deslocamentos
222
  for idx, disc_data in enumerate(disciplinas_dados):
223
  notas = pd.Series(disc_data['notas'])
224
  bimestres_cursados = disc_data['bimestres_cursados']
@@ -230,16 +230,14 @@ def plotar_evolucao_bimestres(disciplinas_dados, temp_dir):
230
 
231
  for bim, nota in zip(bimestres, notas_validas):
232
  if nota is not None:
233
- # Arredonda para uma casa decimal para agrupar valores próximos
234
- nota_arredondada = round(nota, 1)
235
- bim_arredondado = round(bim, 1) # Considerar posição com deslocamento
236
- if bim_arredondado not in notas_por_posicao:
237
- notas_por_posicao[bim_arredondado] = {}
238
- if nota_arredondada not in notas_por_posicao[bim_arredondado]:
239
- notas_por_posicao[bim_arredondado][nota_arredondada] = []
240
- notas_por_posicao[bim_arredondado][nota_arredondada].append((idx, bim))
241
 
242
- # Segunda passagem: plotar os pontos e anotações
243
  for idx, disc_data in enumerate(disciplinas_dados):
244
  notas = pd.Series(disc_data['notas'])
245
  bimestres_cursados = disc_data['bimestres_cursados']
@@ -251,6 +249,7 @@ def plotar_evolucao_bimestres(disciplinas_dados, temp_dir):
251
  bimestres_deslocados = [bim + desloc for bim in bimestres]
252
 
253
  if notas_validas:
 
254
  plt.plot(bimestres_deslocados, notas_validas,
255
  color=cores[idx % len(cores)],
256
  marker=marcadores[idx % len(marcadores)],
@@ -260,19 +259,28 @@ def plotar_evolucao_bimestres(disciplinas_dados, temp_dir):
260
  linestyle=estilos_linha[idx % len(estilos_linha)],
261
  alpha=0.8)
262
 
263
- # Adicionar anotações apenas para o primeiro ponto de cada valor único
264
  for bim_orig, bim_desloc, nota in zip(bimestres, bimestres_deslocados, notas_validas):
265
  if nota is not None:
266
- nota_arredondada = round(nota, 1)
267
- bim_arredondado = round(bim_desloc, 1)
268
- # Adicionar anotação apenas se este for o primeiro índice para este valor
269
- if notas_por_posicao[bim_arredondado][nota_arredondada][0][0] == idx:
270
- plt.annotate(f"{nota_arredondada:.1f}",
 
 
 
 
271
  (bim_desloc, nota),
272
  textcoords="offset points",
273
- xytext=(0, 5),
274
  ha='center',
275
- fontsize=8)
 
 
 
 
 
276
 
277
  plt.title('Evolução das Médias por Disciplina ao Longo dos Bimestres',
278
  pad=20, fontsize=12, fontweight='bold')
@@ -286,7 +294,7 @@ def plotar_evolucao_bimestres(disciplinas_dados, temp_dir):
286
  plt.text(0.02, LIMITE_APROVACAO_NOTA + 0.1, 'Média mínima para aprovação',
287
  transform=plt.gca().get_yaxis_transform(), color='r', alpha=0.5)
288
 
289
- # Ajustar legenda baseado no número de disciplinas
290
  if n_disciplinas > 8:
291
  plt.legend(bbox_to_anchor=(1.05, 1), loc='upper left', fontsize=8,
292
  ncol=max(1, n_disciplinas // 12))
 
204
  if n_disciplinas == 0:
205
  raise ValueError("Nenhuma disciplina válida encontrada para plotar.")
206
 
207
+ plt.figure(figsize=(11.69, 8.27))
208
 
209
  cores = gerar_paleta_cores(n_disciplinas)
210
  marcadores = ['o', 's', '^', 'D', 'v', '<', '>', 'p', 'h', '*']
 
212
 
213
  plt.grid(True, linestyle='--', alpha=0.3, zorder=0)
214
 
215
+ # Deslocamento menor para manter as linhas mais próximas mas ainda distinguíveis
216
+ deslocamentos = np.linspace(-0.05, 0.05, n_disciplinas)
217
 
218
  # Dicionário para armazenar valores por posição
219
  notas_por_posicao = {}
220
 
221
+ # Primeira passagem: coletar todos os valores
222
  for idx, disc_data in enumerate(disciplinas_dados):
223
  notas = pd.Series(disc_data['notas'])
224
  bimestres_cursados = disc_data['bimestres_cursados']
 
230
 
231
  for bim, nota in zip(bimestres, notas_validas):
232
  if nota is not None:
233
+ # Usar valor exato para agrupar apenas notas idênticas
234
+ if bim not in notas_por_posicao:
235
+ notas_por_posicao[bim] = {}
236
+ if nota not in notas_por_posicao[bim]:
237
+ notas_por_posicao[bim][nota] = []
238
+ notas_por_posicao[bim][nota].append((idx, nota))
 
 
239
 
240
+ # Segunda passagem: plotar e adicionar anotações
241
  for idx, disc_data in enumerate(disciplinas_dados):
242
  notas = pd.Series(disc_data['notas'])
243
  bimestres_cursados = disc_data['bimestres_cursados']
 
249
  bimestres_deslocados = [bim + desloc for bim in bimestres]
250
 
251
  if notas_validas:
252
+ # Plotar linha e pontos
253
  plt.plot(bimestres_deslocados, notas_validas,
254
  color=cores[idx % len(cores)],
255
  marker=marcadores[idx % len(marcadores)],
 
259
  linestyle=estilos_linha[idx % len(estilos_linha)],
260
  alpha=0.8)
261
 
262
+ # Adicionar anotações com posicionamento inteligente
263
  for bim_orig, bim_desloc, nota in zip(bimestres, bimestres_deslocados, notas_validas):
264
  if nota is not None:
265
+ # Verificar quantas notas iguais existem nesta posição
266
+ notas_iguais = notas_por_posicao[bim_desloc].get(nota, [])
267
+ idx_atual = notas_iguais.index((idx, nota))
268
+
269
+ if idx_atual == 0: # Apenas anotar a primeira ocorrência
270
+ # Calcular deslocamento vertical baseado no número de notas próximas
271
+ y_offset = 5 + (len(notas_iguais) * 2)
272
+
273
+ plt.annotate(f"{nota:.1f}",
274
  (bim_desloc, nota),
275
  textcoords="offset points",
276
+ xytext=(0, y_offset),
277
  ha='center',
278
+ va='bottom',
279
+ fontsize=8,
280
+ bbox=dict(facecolor='white',
281
+ edgecolor='none',
282
+ alpha=0.7,
283
+ pad=0.5))
284
 
285
  plt.title('Evolução das Médias por Disciplina ao Longo dos Bimestres',
286
  pad=20, fontsize=12, fontweight='bold')
 
294
  plt.text(0.02, LIMITE_APROVACAO_NOTA + 0.1, 'Média mínima para aprovação',
295
  transform=plt.gca().get_yaxis_transform(), color='r', alpha=0.5)
296
 
297
+ # Ajustar legenda
298
  if n_disciplinas > 8:
299
  plt.legend(bbox_to_anchor=(1.05, 1), loc='upper left', fontsize=8,
300
  ncol=max(1, n_disciplinas // 12))