Уведомления

Группа в Telegram: @pythonsu

#1 Янв. 31, 2018 18:08:31

PROkaZZZniK
Зарегистрирован: 2018-01-27
Сообщения: 7
Репутация: +  0  -
Профиль   Отправить e-mail  

PyQt5(QWidget) + matplotlib

Доброго времени суток.
Python 3.5
PyQt5(Qt Designer + PyUic)
Накидал в дизайнере форму.(рис 1.)
Есть скрипт который выводит на экран анимированный график matplotlib.

 import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation
import matplotlib
# import pylab
import numpy as np
R = 5
T = 19
def x_rez(t):
    return R * (t - np.sin(t))
def y_rez(t):
    return R * (1 - np.cos(t))
def f_res():
    list1 = []
    X = []
    Y = []
    t = 0
    while t < T:
        X.append(x_rez(t))
        Y.append(y_rez(t))
        t += 0.01
    list1.append(X)
    list1.append(Y)
    return list1
def init():
    ax.set_xlim(-10, 2 * np.pi * R * 3 + 1)
    ax.set_ylim(-2, R * 5 + 20)
    return ln,
def update(frame):
    x_frame = x_rez(frame)
    y_frame = y_rez(frame)
    xdata.append(x_frame)
    ydata.append(y_frame)
    x, y = patch.center
    x = x_frame
    patch.center = (x, y)
    ln.set_data(xdata, ydata)
    patchC.center = (x_frame, y_frame)
    #patchLine.set_data([x_frame, x], [y_frame, y])
    #print(x_frame, y_frame)
    #ax.add_line(patchLine)
    ax.add_patch(patch)
    ax.add_patch(patchC)
    return ln, patch, patchC,
if __name__ == "__main__":
    # res1 = f_res()
    # print('res1', type(res1), res1)
    # plt.plot(res1[0], res1[1])
    # plt.ylim(-2, R*5)
    # plt.xlim(-10, 2*math.pi*R*3+1)
    fig, ax = plt.subplots()
    xdata, ydata = [], []
    ln, = plt.plot([], [], animated=True)
    fig.set_size_inches(10, 5)
    ax.set_ylim(-2, (x_rez(19) + 5)/2)
    ax.set_xlim(-10, x_rez(19) + 5)
    # axes = pylab.gca()
    # axes.set_aspect("equal")
    patch = plt.Circle((0, R), R, fill=False, color='r')
    patchC = plt.Circle((0, 0), 0.5,  fc='y')
    patchLine = plt.Line2D([0, 0], [R, 0], color="k")
    ani = FuncAnimation(fig, update,
                        frames=np.linspace(0, 19, 128),
                        blit=True,
                        interval=100,
                        init_func=init,
                        repeat=False)
    plt.show()
хочу сделать чтобы данные R и t можно было вводить с формы, и поместить этот график в виджет на форму. Но к сожалению ничего не получается.
 # -*- coding: utf-8 -*-
from PyQt5 import QtWidgets, QtCore
import aza_rc
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
import matplotlib.pyplot as plt
class MyWindow(QtWidgets.QWidget, aza_rc.Ui_Form):
    def __init__(self, parent=None):
        super().__init__(parent, QtCore.Qt.Window)
        self.setupUi(self)
        self.fig, self.ax = plt.subplots()
        self.fig.set_size_inches(10, 5)
        self.canvas = FigureCanvas(self.fig)
        self.verticalLayout_2.addWidget(self.canvas)
        self.pushButton.clicked.connect(self.plot)
    def plot(self):
        ''' plot some random stuff '''
        self.canvas.draw()
Помогите, пожалуйста.

Офлайн

#2 Фев. 1, 2018 03:23:00

pyuser
От:
Зарегистрирован: 2007-05-13
Сообщения: 658
Репутация: +  36  -
Профиль   Отправить e-mail  

PyQt5(QWidget) + matplotlib

Офлайн

#3 Фев. 2, 2018 15:06:43

PROkaZZZniK
Зарегистрирован: 2018-01-27
Сообщения: 7
Репутация: +  0  -
Профиль   Отправить e-mail  

PyQt5(QWidget) + matplotlib

pyuser
Первая ссылка в google
Спасибо, Вам, за отклик. Посмотрел, потыкался 2 дня, ничего не получилось(

Офлайн

#4 Фев. 3, 2018 16:54:39

PROkaZZZniK
Зарегистрирован: 2018-01-27
Сообщения: 7
Репутация: +  0  -
Профиль   Отправить e-mail  

PyQt5(QWidget) + matplotlib

Вроде бы что-то получается, но вылетают ошибки. Помогите исправить.

еще в файле azaxa.py
Функция plot, по клику на кнопку помещает canvas на виджет,
если повторно начать на кнопку, то добавляет еще один ниже. Как сделать так, чтобы первый затирался(удалялся)?

     def plot(self):
        self.canvas = GuiExample.CustomFigCanvas(self)
        self.verticalLayout_2.addWidget(self.canvas)
Спасибо.

Прикреплённый файлы:
attachment matplotlib.rar (2,7 KБ)

Офлайн

#5 Фев. 6, 2018 10:26:13

PEHDOM
Зарегистрирован: 2016-11-28
Сообщения: 2196
Репутация: +  294  -
Профиль   Отправить e-mail  

PyQt5(QWidget) + matplotlib

PROkaZZZniK
Как сделать так, чтобы первый затирался(удалялся)?
логично предположить что для того чтобы он удалялся его нужно удалять, для этого в компоновщике в противоположность методу addWidget()-который помещает виджет в компоновщик есть метод removeWidget() котороый удаляет виджет из компоновщика.



==============================
Помещайте код в теги:
[code python][/code]
Бериегите свое и чужое время.

Офлайн

#6 Фев. 6, 2018 17:13:07

PROkaZZZniK
Зарегистрирован: 2018-01-27
Сообщения: 7
Репутация: +  0  -
Профиль   Отправить e-mail  

PyQt5(QWidget) + matplotlib

PEHDOM
removeWidget()
Да, то что и искал. А я все привязался и искал метод с clear…

Можете еще посмотреть так ли я закидываю график на форму?

Вылетают ошибки(но с ними анимация работает)
Traceback (most recent call last):
File “C:\Python35-32\lib\site-packages\matplotlib\backends\backend_qt5agg.py”, line 155, in __draw_idle_agg
self.draw()
File “C:\Python35-32\lib\site-packages\matplotlib\backends\backend_qt5agg.py”, line 128, in draw
self.update()
TypeError: update() missing 1 required positional argument: ‘frame’
Traceback (most recent call last):
File “C:\Python35-32\lib\site-packages\matplotlib\backends\backend_qt5agg.py”, line 155, in __draw_idle_agg
self.draw()
File “C:\Python35-32\lib\site-packages\matplotlib\backends\backend_qt5agg.py”, line 128, in draw
self.update()
TypeError: update() missing 1 required positional argument: ‘frame’
Traceback (most recent call last):
File “C:\Python35-32\lib\site-packages\matplotlib\backends\backend_qt5agg.py”, line 155, in __draw_idle_agg
self.draw()
File “C:\Python35-32\lib\site-packages\matplotlib\backends\backend_qt5agg.py”, line 128, in draw
self.update()
TypeError: update() missing 1 required positional argument: ‘frame’

Как я понимаю функции update() требуется аргумент ‘frame’, а я его не передаю?

Но я его передаю:
         FuncAnimation.__init__(self, self.fig,
                               self.update,
                               frames=np.linspace(0, 19, 128),
                               blit=True,
                               interval=50,
                               init_func=self.init,
                               repeat=False
                               )
frames=np.linspace(0, 19, 128),

Отредактировано PROkaZZZniK (Фев. 6, 2018 17:13:30)

Офлайн

#7 Фев. 6, 2018 17:21:56

PROkaZZZniK
Зарегистрирован: 2018-01-27
Сообщения: 7
Репутация: +  0  -
Профиль   Отправить e-mail  

PyQt5(QWidget) + matplotlib

Нашел проблему. Одноименный пользовательский метод.

Но у меня остался еще один вопрос.
С помощью matplotlib.animation можно сделать анимацию. Если выключить повтор, дождаться окончания анимации, и далее к примеру изменить масштаб окна, то нарисованный(ранее анимированный) график исчезает. Есть возможность его удержать?

Отредактировано PROkaZZZniK (Фев. 6, 2018 17:24:24)

Офлайн

#8 Фев. 7, 2018 20:41:54

PEHDOM
Зарегистрирован: 2016-11-28
Сообщения: 2196
Репутация: +  294  -
Профиль   Отправить e-mail  

PyQt5(QWidget) + matplotlib

PROkaZZZniK
С помощью matplotlib.animation можно сделать анимацию. Если выключить повтор, дождаться окончания анимации, и далее к примеру изменить масштаб окна, то нарисованный(ранее анимированный) график исчезает. Есть возможность его удержать?
честно ХЗ, нужно пример перед собой иметь чтобы разобраться…



==============================
Помещайте код в теги:
[code python][/code]
Бериегите свое и чужое время.

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version