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

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +38 -29
app.py CHANGED
@@ -198,7 +198,7 @@ def gerar_paleta_cores(n_cores):
198
  return cores_base[:n_cores]
199
 
200
  def plotar_evolucao_bimestres(disciplinas_dados, temp_dir):
201
- """Plota gráfico de evolução das notas por bimestre."""
202
  n_disciplinas = len(disciplinas_dados)
203
 
204
  if n_disciplinas == 0:
@@ -212,32 +212,31 @@ def plotar_evolucao_bimestres(disciplinas_dados, temp_dir):
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']
225
- desloc = deslocamentos[idx]
226
 
227
  if bimestres_cursados:
228
  notas_validas = [nota for i, nota in enumerate(notas, 1) if i in bimestres_cursados and nota is not None]
229
- bimestres = [bim + desloc for bim in bimestres_cursados if notas[bim-1] is not None]
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']
@@ -253,34 +252,44 @@ def plotar_evolucao_bimestres(disciplinas_dados, temp_dir):
253
  plt.plot(bimestres_deslocados, notas_validas,
254
  color=cores[idx % len(cores)],
255
  marker=marcadores[idx % len(marcadores)],
256
- markersize=8,
257
- linewidth=2,
258
  label=disc_data['disciplina'],
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')
 
198
  return cores_base[:n_cores]
199
 
200
  def plotar_evolucao_bimestres(disciplinas_dados, temp_dir):
201
+ """Plota gráfico de evolução das notas por bimestre com visualização refinada."""
202
  n_disciplinas = len(disciplinas_dados)
203
 
204
  if n_disciplinas == 0:
 
212
 
213
  plt.grid(True, linestyle='--', alpha=0.3, zorder=0)
214
 
215
+ # Deslocamento ainda menor e mais refinado
216
+ deslocamentos = np.linspace(-0.03, 0.03, n_disciplinas)
217
 
218
+ # Estrutura para armazenar as posições das anotações já utilizadas
219
+ anotacoes_usadas = {} # formato: {bimestre: [(y, texto)]}
220
 
221
+ # Primeira passagem: coletar todos os valores e determinar grupos
222
+ grupos_notas = {} # {bimestre: {nota: [índices]}}
223
  for idx, disc_data in enumerate(disciplinas_dados):
224
  notas = pd.Series(disc_data['notas'])
225
  bimestres_cursados = disc_data['bimestres_cursados']
 
226
 
227
  if bimestres_cursados:
228
  notas_validas = [nota for i, nota in enumerate(notas, 1) if i in bimestres_cursados and nota is not None]
229
+ bimestres = [bim for bim in bimestres_cursados if notas[bim-1] is not None]
230
 
231
  for bim, nota in zip(bimestres, notas_validas):
232
  if nota is not None:
233
+ if bim not in grupos_notas:
234
+ grupos_notas[bim] = {}
235
+ if nota not in grupos_notas[bim]:
236
+ grupos_notas[bim][nota] = []
237
+ grupos_notas[bim][nota].append(idx)
 
238
 
239
+ # Segunda passagem: plotar e anotar
240
  for idx, disc_data in enumerate(disciplinas_dados):
241
  notas = pd.Series(disc_data['notas'])
242
  bimestres_cursados = disc_data['bimestres_cursados']
 
252
  plt.plot(bimestres_deslocados, notas_validas,
253
  color=cores[idx % len(cores)],
254
  marker=marcadores[idx % len(marcadores)],
255
+ markersize=7, # Reduzido para menor sobreposição
256
+ linewidth=1.5, # Linha mais fina
257
  label=disc_data['disciplina'],
258
  linestyle=estilos_linha[idx % len(estilos_linha)],
259
  alpha=0.8)
260
 
261
+ # Adicionar anotações com posicionamento otimizado
262
  for bim_orig, bim_desloc, nota in zip(bimestres, bimestres_deslocados, notas_validas):
263
  if nota is not None:
264
+ # Verificar se é o primeiro índice para esta nota neste bimestre
265
+ if grupos_notas[bim_orig][nota][0] == idx:
266
+ # Determinar posição vertical da anotação
267
+ if bim_orig not in anotacoes_usadas:
268
+ anotacoes_usadas[bim_orig] = []
269
+
270
+ # Encontrar posição vertical disponível
271
+ y_base = nota
272
+ y_offset = 10
273
+ texto = f"{nota:.1f}"
274
 
275
+ # Verificar sobreposição com anotações existentes
276
+ while any(abs(y - (y_base + y_offset/20)) < 0.4 for y, _ in anotacoes_usadas.get(bim_orig, [])):
277
+ y_offset += 5
278
+
279
+ # Adicionar anotação
280
+ plt.annotate(texto,
281
+ (bim_orig, nota),
282
  textcoords="offset points",
283
  xytext=(0, y_offset),
284
  ha='center',
285
  va='bottom',
286
  fontsize=8,
287
+ bbox=dict(facecolor='white',
288
  edgecolor='none',
289
+ alpha=0.8,
290
  pad=0.5))
291
+
292
+ anotacoes_usadas[bim_orig].append((nota + y_offset/20, texto))
293
 
294
  plt.title('Evolução das Médias por Disciplina ao Longo dos Bimestres',
295
  pad=20, fontsize=12, fontweight='bold')