python - 如何将 Seaborn 绘图集成到 Tkinter GUI
问题描述
我正在尝试在 Tkinter 中使用 Seaborn 进行绘图。到目前为止,我的方法是不同的变体,我无法让它发挥作用。
我尝试了 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()
解决方案
canvas.draw()
如果我没记错的话,OP 的原始代码只缺少 a 。furas也表明了这一点。我最近发现很难找到一个完整的例子来说明如何在 Tkinter GUI 上使用 Seaborn 进行绘图,尤其是如何在画布上重绘。
所以,让我给你一个完整的工作但最小的程序片段,该程序最初在每次按键时都绘制和重绘。
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 提供的一些示例代码。
这是上面的代码在执行和按下某些键时的样子:
推荐阅读
- ios - 合并 iCloud 冲突的 UIDocument 更改
- android - Camera2 和 MediaRecorder 仅在三星 Galaxy S7 Edge 上录制空白视频
- wxwidgets - 滚动后如何填充设备上下文的背景?
- angular - 角度使用 [innerHTML] 和 *ngFor 变量引用
- c# - 无法从 V4.6.1 WCF 服务项目引用 netcore2.0 DLL
- firebase - 我正在尝试通过在 POSTMAN 中请求 GET 来检查是否接收到数据。但是显示这样的错误
- selenium - 元素选择不适用于混合应用程序,但可以在 Appium 中使用本机应用程序
- php - 如何使用带有数组作为第二个参数的 mysqli::bind_param
- bash - shell 脚本有很多命令行参数是不是很奇怪
- java - 如果我得到响应,如何等待 30 秒或完成?