Python 如何将Seaborn plot集成到Tkinter GUI中

Python 如何将Seaborn plot集成到Tkinter GUI中,python,matplotlib,tkinter,seaborn,sis,Python,Matplotlib,Tkinter,Seaborn,Sis,我正试图利用特金特的Seaborn进行绘图。到目前为止,我的方法与此不同,我无法让它发挥作用 我尝试了matplotlib.use(“Agg”),它在页面上正常的matplotlib图上运行良好,但在Seaborn图上似乎不起作用 matplotlib.use(“TkAgg”)#“Agg”也不起作用 从matplotlib.backends.backend_tkagg导入图CAVASTKAGG 导入seaborn作为sns 将tkinter作为tk导入 def graphpage(): pf=t

我正试图利用特金特的Seaborn进行绘图。到目前为止,我的方法与此不同,我无法让它发挥作用

我尝试了matplotlib.use(“Agg”),它在页面上正常的matplotlib图上运行良好,但在Seaborn图上似乎不起作用

matplotlib.use(“TkAgg”)#“Agg”也不起作用
从matplotlib.backends.backend_tkagg导入图CAVASTKAGG
导入seaborn作为sns
将tkinter作为tk导入
def graphpage():
pf=tk.tk()
pf.几何形状(“1000x800”)
###工作
f=图(figsize=(5,5),dpi=100)
a=f.add_子批次(111)
a、 绘图(df['date'],日缩尺,'b-',df['date'],日缩尺Bm,'k-',线宽=1)
f、 紧凑的布局()
画布=图CAVASTKAGG(f,pf)
canvas.get_tk_widget().grid(行=1,列=1)
###不起作用
pct=diststats()[4]
pctbm=diststats()[5]
f=图(figsize=(5,5),dpi=100)
a=f.add_子批次(111)
a、 sns.distplot(pct,标签='Portfolio')
a、 sns.distplot(pctbm,axlabel='Distribution of returns',label='Benchmark')
画布=图CAVASTKAGG(f,pf)
canvas.get_tk_widget().grid(行=2,列=1)
图页()
我拿了-这样我就可以运行它了-我把tkinter放进去了

create\u plot中的代码使用matplotlibseaborn创建绘图,并返回
稍后,此代码将
添加到tkinter的窗口中

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

我拿了——这样我就可以运行它了——然后我放进了tkinter

create\u plot中的代码使用matplotlibseaborn创建绘图,并返回
稍后,此代码将
添加到tkinter的窗口中

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()
。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提供的一些

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


如果我没有弄错的话,OP的原始代码只缺少一个
canvas.draw()
。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提供的一些

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


您是否看到任何在tkinter中使用Seaborn的示例?而不是
a.sns.distplot(pct,label='Portfolio')
它需要是
sns.distplot(pct,label='Portfolio',ax=a)
创建我们可以运行的代码。现在有一些
df
diststats()
所以我们不能运行它。你看到任何使用Seaborn in tkinter的例子了吗?不是
a.sns.distplot(pct,label='Portfolio')
它需要是
sns.distplot(pct,label='Portfolio',ax=a)
创建我们可以运行的代码。现在有一些
df
diststats()
所以我们无法运行它。我有一个错误:AttributeError:“非类型”对象没有属性“正在保存”当我按下键盘时我有一个错误:AttributeError:“非类型”对象没有属性“正在保存”