Как построить несколько строк в соответствии со значениями списков на одной оси, на pysimplegui, на python

#python #plot #pysimplegui

#питон #сюжет #pysimplegui

Вопрос:

У меня есть проект, в котором я нахожу частоту сердечных сокращений пользователя и должен построить ее на графике в соответствии с целевой зоной, которую я нахожу в соответствии с другой частотой сердечных сокращений.

Я получил этот код для построения списка значений на линейном графике из демо-версии pysimplegui, однако я изо всех сил пытаюсь построить три разных списка одновременно.

Списки, которые мне нужно построить, следующие: ListHR PlotMax (прямая линия) ПлотМин (прямая линия)

 import PySimpleGUI as sg from PySimpleGUI.PySimpleGUI import execute_py_file import json import datetime  plotMin = [123]*60 plotMax = [200]*60 listBPM = [65,67,70,72,80,85,90,95,110,115,130]  BAR_WIDTH = 10 # BAR_WIDTH = 5 BAR_SPACING = 16 # BAR_SPACING = 6 EDGE_OFFSET = 3 GRAPH_SIZE = (550,500) DATA_SIZE = (500,200) graph = sg.Graph(GRAPH_SIZE, (0,-30), DATA_SIZE, background_color='white',)  sg.theme('DarkAmber') # Add a touch of color  layout = [[sg.Text('chart demo')],  [graph],  [sg.Button('OK')]]  window = sg.Window('Window Title', layout)  before_value = 0 while True:  event, values = window.Read()  graph.Erase()  if event is None:  break  for i in range(0,len(listBPM)-1): # have to find out how to plot three different lines  graph_value = listBPM[i 1] #variable not changing...   if i gt; 0:  graph.DrawLine(((i-1) * BAR_SPACING   EDGE_OFFSET  BAR_WIDTH/2 , before_value) , (i * BAR_SPACING   EDGE_OFFSET  BAR_WIDTH/2 , graph_value ),color='blue', width=1 )   graph.DrawText(text=graph_value, location=(i*BAR_SPACING EDGE_OFFSET 2, graph_value 10))   graph.DrawPoint((i * BAR_SPACING   EDGE_OFFSET  BAR_WIDTH/2 ,graph_value), size=3 ,color='blue',)  before_value = graph_value  window.Close()  

Ответ №1:

Чтобы нарисовать фигуру, что-то, возможно, касается,

  • Сгенерируйте все точки с помощью функции преобразования
  • Найдите диапазон x и y, чтобы подтвердить, какой вид для рисунка
  • Чтобы нарисовать соединенные линии или трассировку, вы можете вызвать метод draw_lines sg.Graph

Демонстрационный код

 import PySimpleGUI as sg  def new_point(i, y):  return (i * BAR_SPACING   EDGE_OFFSET   BAR_WIDTH/2, y)  listBPM = [65,67,70,72,80,85,90,95,110,115,130] plotMin = [123]*len(listBPM) plotMax = [200]*len(listBPM)  BAR_WIDTH = 10 BAR_SPACING = 16 EDGE_OFFSET = 3 GRAPH_SIZE = (550,500)  # Generate all data points lines = [  [new_point(i, y) for i, y in enumerate(listBPM)],  [new_point(i, y) for i, y in enumerate(plotMin)],  [new_point(i, y) for i, y in enumerate(plotMax)], ] sg.theme('DarkAmber')  # Find the range for data min_x, min_y, max_x, max_y = 10000, 10000, 0, 0 for line in lines:  for x, y in line:  min_x, min_y = min(min_x, x), min(min_y, y)  max_x, max_y = max(max_x, x), max(max_y, y)  graph = sg.Graph(  GRAPH_SIZE,  (min_x - EDGE_OFFSET - BAR_WIDTH/2, min_y - EDGE_OFFSET - BAR_WIDTH/2),  (max_x   EDGE_OFFSET   BAR_WIDTH/2, max_y   EDGE_OFFSET   BAR_WIDTH/2),  background_color='white')  layout = [  [sg.Text('chart demo'), sg.Button('OK')],  [graph], ] window = sg.Window('Window Title', layout)  while True:   event, values = window.read()   if event is None:  break  elif event == 'OK':  graph.erase()  for line in lines:  graph.draw_lines(line, color='blue', width=1)  for x, y in lines[0]:  graph.draw_text(text=y, location=(x, y 10))  graph.draw_point((x, y), size=3 ,color='blue')  window.Close()  

введите описание изображения здесь