Задать вопрос
@We1rd

Как добавить готовый график в Figure (matplotlib)?

Есть график, построенный с помощью SymPy. Из него надо сделать фигуру, чтобы поместить в гуй на tkinter. В гугле нашел только способ добавить график в фигуру и с нуля его настраивать. Можно ли готовый Plot превратить в Figure?
  • Вопрос задан
  • 327 просмотров
Подписаться 1 Средний 1 комментарий
Решения вопроса 1
Maksim_64
@Maksim_64
Data Analyst
Ты уверен что ты понимаешь что такое объект Figure в matplotlib? Это канва, на которой ты размещаешь axes (оси координат и уже на этих осях ты непосредственно рисуешь графики). Прямого api что бы засунуть sympy plot на matplolib figure, не существует. Потому что это не оси с графиками а своя ФИГУРА с осями и на них графиками.

Можно ли это обойти, да конечно можно создать урода и присобачить на figure sympy plot.
import matplotlib.pyplot as plt
import numpy as np
from sympy import Symbol
from sympy.plotting import plot
x = Symbol('x')
X = np.linspace(-3,3,100)
y = np.cos(X)
def add_plot(p, ax):
    backend = p.backend(p)
    backend.ax = ax
    
    backend._process_series(backend.parent._series, ax, backend.parent)
    backend.ax.spines['right'].set_color('none')
    backend.ax.spines['bottom'].set_position('zero')
    backend.ax.spines['top'].set_color('none')
    plt.close(backend.fig)

p = plot(x**2, (x, 0, 3), show=False)

fig, ax  = plt.subplots(1,2, figsize=(18,9))
ax[0].plot(X,y)
add_plot(p, ax[1]);


Вот мы имеем фигуру с двумя осями, одна нормальная matplob'вская вторая из sympy.
Вот здесь кто то постарался и прикрутил. Почитай, что пишут.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
Vindicar
@Vindicar
RTFM!
Ты можешь добраться до фигуры так
from matplotlib import pyplot
plot: Plot = ...  # тут твой Plot
fig: pyplot.Figure = plot.backend.fig

И дальше работать с ней в твоём GUI, как обычно.

Альтернативно, можно почитать исходники класса MatplotlibBackend, сделать его копию, и модифицировать её так, чтобы вместо
self.fig = self.plt.figure(figsize=parent.size)
твой бэкэнд принимал Figure как параметр конструктора.
Ответ написан
Комментировать
Viktor_T2
@Viktor_T2
python developer
Вот держи:
from sympy import *
from sympy.plotting import plot

import matplotlib
matplotlib.use("TkAgg")
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg, NavigationToolbar2Tk

import tkinter as tk


x=Symbol('x')
plt = plot(x**2, line_color='red', show=False)

backend = plt.backend(plt)
backend.process_series() # Обработать данные графика
                         # без этого не сработает
                         
fig = backend.fig        # Получили Figure


# ---------------------- Окно Tk: ------------------------
win = tk.Tk()
# Положение и размер окна
win.geometry("{0}x{1}+0+0".format(int(win.winfo_screenwidth()*1), int(win.winfo_screenheight()*0.9)))

# График
chart = FigureCanvasTkAgg(fig, win) # холст Tk для графика matplotlib
chart.draw()
chart.get_tk_widget().pack(fill=tk.BOTH, expand=True)

# Тулбар
toolbar = NavigationToolbar2Tk(chart, win)
toolbar.update()
toolbar.pack(side=tk.BOTTOM, fill=tk.X)

win.mainloop()
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы