如何将Seaborn plot集成到Tkinter GUI中

2024-09-29 23:16:39 发布

您现在位置:Python中文网/ 问答频道 /正文

我想用特金特的Seaborn来策划。到目前为止,我的方法是不同的变化,我无法使它发挥作用。在

我试过了matplotlib.使用(“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()

Tags: importaddmatplotlibasseabornaggtkfigure
2条回答

如果我没弄错的话,OP的原始代码只缺少canvas.draw()。furas也表明了这一点。我最近发现很难找到一个完整的例子来说明如何用Seaborn在tkintergui上绘图,尤其是如何在画布上重画。在

所以,让我给你一个完整的程序片段,这个程序最初在每次按键时都会绘制和重画。在

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提供的一些example code。在

上面的代码在执行和按某些键时的外观如下:

Preview of Tkinter with Seaborn plot

我取了example from Seaborn page-这样我就可以运行它了-我把tkinter放进去了

create_plot中的代码使用matplotlibseaborn创建绘图,并返回{}。
稍后,这段代码将figure添加到tkinter的窗口中

canvas = FigureCanvasTkAgg(fig, master=root)
canvas.draw()
canvas.get_tk_widget().pack()

示例不需要matplotlib.use('TkAgg')也不需要matplotlib.use('Agg')

tkinter.Label,Seaborn的plot和tkinter.Button,但我也有{}的例子

完整代码:

^{pr2}$

enter image description here

相关问题 更多 >

    热门问题