#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()