Как интегрировать сюжет Seaborn в графический интерфейс Tkinter?
Я пытаюсь построить с использованием Seaborn в Tkinter. Мои подходы до сих пор были разными вариантами этого, и я не мог заставить его работать.
Я попробовал matplotlib.use("Agg"), который отлично работает на обычных графиках Matplotlib на странице, но, похоже, не работает на графиках Seaborn
matplotlib.use("TkAgg") # 'Agg' doesnt work either
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
import seaborn as sns
import tkinter as tk
def graphspage():
pf = tk.Tk()
pf.geometry("1000x800")
### Works
f = Figure(figsize=(5, 5), dpi=100)
a = f.add_subplot(111)
a.plot(df['date'],daily_drawdown, 'b-',df['date'], daily_drawdownbm, 'k-', linewidth=1)
f.tight_layout()
canvas = FigureCanvasTkAgg(f,pf)
canvas.get_tk_widget().grid(row=1,column=1)
### Doesnt Work
pct = diststats()[4]
pctbm = diststats()[5]
f = Figure(figsize=(5, 5), dpi=100)
a = f.add_subplot(111)
a.sns.distplot(pct,label = 'Portfolio')
a.sns.distplot(pctbm,axlabel='Distribution of returns',label='Benchmark')
canvas = FigureCanvasTkAgg(f,pf)
canvas.get_tk_widget().grid(row=2,column=1)
graphspage()
1 ответ
Я взял пример со страницы Seaborn - чтобы я мог его запустить - и вставил в tkinter
Код в create_plot
использования matplotlib
с seaborn
создать сюжет и он возвращается figure
,
Позже этот код добавляет figure
к окну Ткинтера
canvas = FigureCanvasTkAgg(fig, master=root)
canvas.draw()
canvas.get_tk_widget().pack()
Пример не нужен matplotlib.use('TkAgg')
ни matplotlib.use('Agg')
Есть tkinter.Label
, Участок Seaborn и tkinter.Button
но у меня есть также пример с NavigationToolbar2Tk
Полный код:
# seaborn in matplotlib - tkinter doesn't need it
#import matplotlib
#matplotlib.use('TkAgg')
# embed matplotlib in tkinter
import tkinter
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
# seaborn example
from string import ascii_letters
import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
def create_plot():
sns.set(style="white")
# Generate a large random dataset
rs = np.random.RandomState(33)
d = pd.DataFrame(data=rs.normal(size=(100, 26)),
columns=list(ascii_letters[26:]))
# Compute the correlation matrix
corr = d.corr()
# Generate a mask for the upper triangle
mask = np.zeros_like(corr, dtype=np.bool)
mask[np.triu_indices_from(mask)] = True
# Set up the matplotlib figure
f, ax = plt.subplots(figsize=(11, 9))
# Generate a custom diverging colormap
cmap = sns.diverging_palette(220, 10, as_cmap=True)
# Draw the heatmap with the mask and correct aspect ratio
sns.heatmap(corr, mask=mask, cmap=cmap, vmax=.3, center=0,
square=True, linewidths=.5, cbar_kws={"shrink": .5})
return f
# --- main ---
root = tkinter.Tk()
root.wm_title("Embedding in Tk")
label = tkinter.Label(root, text="Matplotlib with Seaborn in Tkinter")
label.pack()
fig = create_plot()
canvas = FigureCanvasTkAgg(fig, master=root) # A tk.DrawingArea.
canvas.draw()
canvas.get_tk_widget().pack()
button = tkinter.Button(root, text="Quit", command=root.destroy)
button.pack()
tkinter.mainloop()
В исходном коде OP не хватало только canvas.draw()
, если я не ошибаюсь. На это также указывают фуры. Недавно мне было трудно найти полный пример того, как рисовать с помощью Seaborn в графическом интерфейсе Tkinter, и особенно, как перерисовывать на холсте.
Итак, позвольте мне дать вам полностью рабочий, но миниатюрный фрагмент программы, которая изначально рисует и перерисовывает при каждом нажатии клавиши.
import tkinter
from typing import Callable
import numpy as np
import seaborn as sns
from matplotlib.backend_bases import key_press_handler
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
from matplotlib.figure import Figure
def init_gui(root, update_function: Callable) -> FigureCanvasTkAgg:
def event_key_press(event):
print("you pressed {}".format(event.key))
update_function()
key_press_handler(event, canvas)
# create empty figure and draw
init_figure = create_figure()
canvas = FigureCanvasTkAgg(init_figure, master=root)
canvas.draw()
canvas.get_tk_widget().pack(side=tkinter.TOP, fill=tkinter.BOTH, expand=1)
# call key press event
canvas.mpl_connect("key_press_event", event_key_press)
return canvas
def create_figure() -> Figure:
# generate some data
matrix = np.random.randint(20, size=(10, 10))
# plot the data
figure = Figure(figsize=(6, 6))
ax = figure.subplots()
sns.heatmap(matrix, square=True, cbar=False, ax=ax)
return figure
def redraw_figure():
figure = create_figure()
canvas.figure = figure
canvas.draw()
sns.set()
root = tkinter.Tk()
canvas = init_gui(root, update_function=redraw_figure)
tkinter.mainloop()
Я использовал пример кода, предоставленный matplotlib.
Вот как выглядит приведенный выше код при выполнении и при нажатии некоторых клавиш: