Jump to content

Interagir com Gráfico em tempo Real .


adelcio

Postagens Recomendadas

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

Editado por adelcio
Link to comment
Compartilhe em outros sites

Crie uma conta ou entre para comentar 😀

Você precisa ser um membro para deixar um comentário.

Crie a sua conta

Participe da nossa comunidade, crie sua conta.
É bem rápido!

Criar minha conta agora

Entrar

Você já tem uma conta?
Faça o login agora.

Entrar agora


×
×
  • Create New...