Как я могу в matplotlib сделать граф из списка чисел? - PullRequest
1 голос
/ 11 апреля 2020

Я новичок в программировании. Может ли кто-нибудь помочь мне с созданием графа из списка чисел? Чтобы быть более точным c: прочитайте числа из списка и используйте их в y = x1 * 2 для создания графика. Спасибо за ответы.

import matplotlib.pyplot as plt
import numpy as np
import tkinter
from tkinter import *
from matplotlib.backends.backend_tkagg import (FigureCanvasTkAgg, NavigationToolbar2Tk)
from matplotlib.figure import Figure
root=Tk()

fig=Figure(figsize=(5,4), dpi=100)


class Win1:
    def start1():
        window1=tkinter.Toplevel()
        Label(window1, text="Zadej hodnoty x, pro které chceš vypočítat").grid(row=0)
        global e1
        e1=Entry(window1)
        e1.grid(row=0, column=1)
        fw=tkinter.Button(window1, text="vykresli",command=Win1.vykreli1)
        fw.grid(row=0,column=2)

    def vykreli1():
        get1=e1.get()
        x1=list(get1) #I made list of numbers from Entry
        y=x1*2
        plt.plot(x1,y)
        plt.show()

pica=Win1
f1=tkinter.Button(root, text="try1", command=pica.start1)
f2=tkinter.Button(root, text="try2")
f1.pack()
f2.pack()
root.mainloop()

1 Ответ

0 голосов
/ 11 апреля 2020

Привет и добро пожаловать в stackoverflow.

Вы столкнулись со следующей проблемой:

Пользователь вводит некоторый текст. Например 5, 6, 12, 5.3. Ваша программа читает этот текст в строке get1 = e1.get(). Теперь переменная get1 становится строкой "5, 6, 12, 5.3". Но вам нужен список! Вы хотите иметь переменную, равную [5, 6, 12, 5.3].

Это означает, что вы должны разобрать строку get1 в список чисел. Это очень сложная задача! Но есть и хорошие новости: Python может сделать это за вас!

Импортировать модуль ast. Используйте функцию ast.literal_eval.

Вы можете применить его следующим образом:

x1 = ast.literal_eval(get1)
x1 = list(x1)

Вторая строка x1 = list(x1) гарантирует, что x1 действительно список. Потому что возможно, что пользователь вводит только «5», а не «5,6».

Теперь мы можем рассчитать и отобразить значения y следующим образом:

ys = [x * 2 for x in x1]
plt.plot(xs, ys, marker=".")

Возможно также, что пользователь допускает другие ошибки. Он может ввести что-то глупое, как «5, привет!, 7,8».

Итак, нам нужна обработка исключений. Я сделал это для вас в следующем примере. Я также переименовал несколько ваших переменных. И я использую некоторые операторы print, чтобы упростить понимание происходящего.


import ast
from tkinter import messagebox

import matplotlib.pyplot as plt
import numpy as np
import tkinter
from tkinter import *
from matplotlib.backends.backend_tkagg import (FigureCanvasTkAgg, NavigationToolbar2Tk)
from matplotlib.figure import Figure

root = Tk()

fig = Figure(figsize=(5, 4), dpi=100)


class Win1:
    def start1():
        window1 = tkinter.Toplevel()
        Label(window1, text="Zadej hodnoty x, pro které chceš vypočítat").grid(row=0)
        global e1
        e1 = Entry(window1)
        e1.grid(row=0, column=1)
        fw = tkinter.Button(window1, text="vykresli", command=Win1.vykreli1)
        fw.grid(row=0, column=2)

    def vykreli1():
        user_input = e1.get()

        print(f"user entered '{user_input}'")
        if not user_input.strip():
            messagebox.showerror("Missing entry", "You did not enter any text")
            return

        try:
            processed_user_input = ast.literal_eval(user_input)
            print(f"processed_user_input: {processed_user_input}")
            xs = list(processed_user_input)
        except Exception as e:
            print(f"parsing error {e}")
            messagebox.showerror("Unparsable", "Please enter a list of numbers like 5,6.0,20,50.2")
            return

        ys = [x * 2 for x in xs]
        plt.plot(xs, ys, marker=".")

        plt.show()


if __name__ == '__main__':
    pica = Win1
    f1 = tkinter.Button(root, text="try1", command=pica.start1)
    f2 = tkinter.Button(root, text="try2")
    f1.pack()
    f2.pack()
    root.mainloop()


Мне удалось запустить эту программу. Я мог ввести несколько цифр, и затем я увидел график.

enter image description here

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...