Boa tarde, é uma honra, estar aqui. Sou novo em PY, e no meu primeiro projeto estou esbarrando em uma questão que não consigo resolver.
Em um dos módulos do programa é criado um gráfico, que obtém sempre apenas 1 informação , numeros com "," exemplo 10,2345. Essa lista de numeros vem de um arquivo TXT. O grafico é 2d e usa esses valores para os pontos Y. Os pontos X são atribuídos sequencialmente conforme é feito a leitura, ou seja Linha 1 , X1, Linha 2, X2.
Até ai tudo certo, é plotado o gráfico e tudo mais.
A ideia é quando o mouse selecionar um determinado ponto desse gráfico, pois é informado em um text_box, pressiona o botão esquerdo e arrasta para cima ou para baixo, alterando esse valor Y.
Porem fiz varias tentativas e ele não assume o novo valor. Pois após soltar o botão ele deveria atualizar o gráfico com aquele novo valor de Y.
Então X inicial nunca muda pois ele é o ID dos dados, mais o Y eu posso alterar. Alguém pode me ajudar. segue o código desse modulo. Segue o arquivo txt em anexo. Agradeço e peço desculpas por algo.
---------------------------------------
import matplotlib.pyplot as plt
from matplotlib.lines import Line2D
import mplcursors
# Leitura dos dados do arquivo
try:
with open('velocidade.txt', 'r') as file:
velocidades = [float(line.strip().replace(',', '.')) for line in file]
except IOError:
print("Erro ao ler o arquivo.")
# Configuração do gráfico
fig, ax = plt.subplots(figsize=(10, 6))
plt.subplots_adjust(bottom=0.2)
# Variáveis globais para armazenar o estado do ponto arrastado
dragging = False
drag_start_y = None
drag_index = None
# Função para atualizar o valor da velocidade
def update_speed(y):
text_box.set_text(f'Velocidade: {y:.2f}')
velocidades[drag_index] = y
line_blue.set_ydata(velocidades)
fig.canvas.draw_idle()
# Função chamada quando o mouse é pressionado
def on_press(event):
nonlocal dragging, drag_start_y, drag_index
if event.inaxes != ax:
return
contains, attrd = line_blue.contains(event)
if not contains:
return
dragging = True
drag_start_y = event.ydata
drag_index = int(round(event.xdata)) - 1
cursor.enabled = False # Desativa mplcursors durante o arrasto
# Função chamada quando o mouse é solto
def on_release(event):
nonlocal dragging
if dragging:
dragging = False
drag_start_y = None
drag_index = None
cursor.enabled = True # Reativa mplcursors após o soltar do mouse
# Função chamada quando o mouse é movido
def on_motion(event):
nonlocal dragging
if not dragging:
return
if event.inaxes != ax:
return
y = event.ydata
update_speed(y)
# Configuração da caixa de texto
text_box = ax.text(0.05, 0.95, '', transform=ax.transAxes, va='top')
# Plot inicial do gráfico
x = range(1, len(velocidades) + 1)
line_blue, = ax.plot(x, velocidades, 'b-', lw=2)
line_red = Line2D([x[0], x[-1]], [0, 0], color='red', lw=2)
ax.add_line(line_red)
# Configuração dos limites dos eixos
ax.set_xlim(1, len(velocidades))
ax.set_ylim(min(velocidades), max(velocidades))
# Conecta os eventos de mouse
fig.canvas.mpl_connect('motion_notify_event', on_motion)
fig.canvas.mpl_connect('button_press_event', on_press)
fig.canvas.mpl_connect('button_release_event', on_release)
# Configura mplcursors para exibir informações sobre o ponto
cursor = mplcursors.cursor(line_blue, hover=True)
cursor.connect('add', lambda sel: sel.annotation.set_text(f'x: {sel.target[0]:.0f}\ny: {sel.target[1]:.2f}'))
# Exibe o gráfico
plt.show()
velocidade.txt