我如何将Seaborn绘图集成到Tkinter GUI中 [英] How can I integrate Seaborn plot into Tkinter GUI

查看:92
本文介绍了我如何将Seaborn绘图集成到Tkinter GUI中的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正试图在Tkinter中使用Seaborn进行绘图.到目前为止,我的方法是不同的变体,我无法让它发挥作用.

我尝试了 matplotlib.use("Agg"),它在页面上的正常 Matplotlib 图形中运行良好,但似乎不适用于 Seaborn 图

  matplotlib.use("TkAgg")#'Agg'也不起作用从matplotlib.backends.backend_tkagg导入FigureCanvasTkAgg将 seaborn 作为 sns 导入将 tkinter 作为 tk 导入def graphspage():pf = tk.Tk()pf.geometry("1000x800")###作品f =图形(figsize =(5,5),dpi = 100)一个= f.add_subplot(111)a.plot(df['date'],daily_drawdown,'b-',df['date'],daily_drawdownbm,'k-',linewidth=1)f.tight_layout()画布 = FigureCanvasTkAgg(f,pf)canvas.get_tk_widget().grid(row=1,column=1)### 不起作用pct = diststats()[4]pctbm = diststats()[5]f =图形(figsize =(5,5),dpi = 100)a = f.add_subplot(111)a.sns.distplot(pct,label ='Portfolio')a.sns.distplot(pctbm,axlabel ='收益分配',label ='基准')canvas = FigureCanvasTkAgg(f,pf)canvas.get_tk_widget().grid(row=2,column=1)图表页面()

解决方案

如果我没有记错的话,OP的原始代码仅缺少 canvas.draw(). furas 也表明了这一点.我最近发现很难找到一个完整的示例,说明如何在Tkinter GUI上使用Seaborn进行绘制,尤其是如何在画布上进行重新绘制.

所以,让我为您提供一个完整但最小的代码片段,用于最初在每次按键时绘制和重绘的程序.

导入tkinterfrom 输入 import Callable将numpy导入为np将 seaborn 作为 sns 导入从 matplotlib.backend_bases 导入 key_press_handler从matplotlib.backends.backend_tkagg导入FigureCanvasTkAggfrom matplotlib.figure 导入图def init_gui(root, update_function: Callable) ->FigureCanvasTkAgg:def event_key_press(事件):print(您按下了{}".format(event.key))更新函数()key_press_handler(事件,画布)# 创建空图形并绘制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)# 调用按键事件canvas.mpl_connect("key_press_event", event_key_press)返回画布def create_figure() ->数字:#生成一些数据矩阵 = np.random.randint(20, size=(10, 10))# 绘制数据图=图(figsize =(6,6))ax = figure.subplots()sns.heatmap(矩阵,正方形=真,cbar =假,斧= ax)返回图def redraw_figure():图 = create_figure()canvas.figure =数字canvas.draw()sns.set()根 = tkinter.Tk()canvas = init_gui(root,update_function = redraw_figure)tkinter.mainloop()

我使用了 matplotlib 提供的一些

I am trying to plot using Seaborn in Tkinter. My approaches so far were different variations of this and I could not get it to work.

I tried the matplotlib.use("Agg"), which works fine one the normal Matplotlib graphs on the page but doesn't seem to work on the Seaborn plots

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()

解决方案

The OP's original code only lacked a canvas.draw(), if I'm not mistaken. This has also been indicated by furas. I recently found it difficult to find a full example of how to draw with Seaborn on a Tkinter GUI and especially, how to redraw on the canvas.

So, let me give you a fully working but mininmal snippet for a program that initially draws and redraws on every keypress.

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()

I used some example code provided by matplotlib.

This is how the code above looks when executed and when pressing some keys:

这篇关于我如何将Seaborn绘图集成到Tkinter GUI中的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆