Поместить seaborn.heatmap на Canvas

weamagic

Пользователь
Пользователь
Июл 11, 2020
149
13
18
Win 7/10
Python 3.7

Добрый день. Пытаюсь вывести тепловую карту в объект Canvas. Использую следующий код:

Python:
from tkinter import *
import pandas as pd
import seaborn as sbn
win=master
win.geometry('1024x720')
txt_path_to_file = Entry(win)
txt_path_to_file.place(x=5, y=5, width=300, height=25)
btn_sel_path_to_file = Button(win, text='Select')
btn_sel_path_to_file.place(x=310, y=5, width=100, height=25)
btn_sel_path_to_file.config(command=sel_path_to_file)
im_corr=Canvas(win, bg='white')
im_corr.place(x=220, y=350)
ddt_im_corr=BitmapImage()
win.mainloop()
def sel_path_to_file():
    path_to_file=filedialog.askopenfilename()
    txt_path_to_file.insert(END, path_to_file)
    ddt_im_corr.config(data=sbn.heatmap(pd.read_table(self.txt_path_to_file.get(), sep='\t', header=None).corr()))
    im_corr.config(image=ddt_im_corr)
Не понимаю, где допускаю ошибку. BitmapImage преобразовывает тепловую карту в изображение, которое должно загрузиться в Canvas без проблем. Разве только размеры подогнать, но это уже мелочи.
 

stud_55

Модератор
Команда форума
Модератор
Апр 3, 2020
1 522
672
113
Пришлось два куска переписывать почти с начала. Спасибо.
P.S. А проще способа не знаешь?
Вот укороченный вариант кода из примера по ссылке:
Python:
import tkinter
import numpy as np
import seaborn as sns
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
from matplotlib.figure import Figure


sns.set()
matrix = np.random.randint(20, size=(10, 10))
figure = Figure(figsize=(6, 6))
sns.heatmap(matrix, square=True, cbar=False, ax=figure.subplots())

root = tkinter.Tk()
canvas = FigureCanvasTkAgg(figure, master=root)
canvas.get_tk_widget().pack(side=tkinter.TOP, fill=tkinter.BOTH, expand=1)
tkinter.mainloop()
 

stud_55

Модератор
Команда форума
Модератор
Апр 3, 2020
1 522
672
113
Вот пример вывода heatmap на Canvas: ссылка.
 

weamagic

Пользователь
Пользователь
Июл 11, 2020
149
13
18
Вот пример вывода heatmap на Canvas: ссылка.
Видел его. Не работает. Ошибки нет - результата тоже.
Когда начинал ковырять данный вопрос, я просто набрал примеров и проверил их запуск, чтобы определить работ оспособность, вявить принцип. Этот не сработал. Совсем.
 

stud_55

Модератор
Команда форума
Модератор
Апр 3, 2020
1 522
672
113
Видел его. Не работает. Ошибки нет - результата тоже.
Код, который в вопросе - скорее всего не работает. Но код из ответа по ссылке работает (проверял). Там даже гифка есть, на которой показан результат работы.
 

weamagic

Пользователь
Пользователь
Июл 11, 2020
149
13
18
Код, который в вопросе - скорее всего не работает. Но код из ответа по ссылке работает (проверял). Там даже гифка есть, на которой показан результат работы.
Пришлось два куска переписывать почти с начала. Спасибо.
P.S. А проще способа не знаешь?
 

weamagic

Пользователь
Пользователь
Июл 11, 2020
149
13
18
Вот укороченный вариант кода из примера по ссылке:
Python:
import tkinter
import numpy as np
import seaborn as sns
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
from matplotlib.figure import Figure


sns.set()
matrix = np.random.randint(20, size=(10, 10))
figure = Figure(figsize=(6, 6))
sns.heatmap(matrix, square=True, cbar=False, ax=figure.subplots())

root = tkinter.Tk()
canvas = FigureCanvasTkAgg(figure, master=root)
canvas.get_tk_widget().pack(side=tkinter.TOP, fill=tkinter.BOTH, expand=1)
tkinter.mainloop()
Ага, примерно так и сделал. Спасибо ещё раз) Просто для решаемой задачи... Эх, ладно, уже флуд пошел.
 

weamagic

Пользователь
Пользователь
Июл 11, 2020
149
13
18
Решил обновить старую тему.
Как надо изменить код, чтобы можно было отображать и relplot?
 

stud_55

Модератор
Команда форума
Модератор
Апр 3, 2020
1 522
672
113
Решил обновить старую тему.
Как надо изменить код, чтобы можно было отображать и relplot?
Вот пример:
Python:
import matplotlib.pyplot as plt
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
import pandas as pd
import numpy as np
import seaborn as sns
import tkinter as tk


sns.set()
df = pd.DataFrame(dict(time=np.arange(500), value=np.random.randn(500).cumsum()))
g = sns.relplot(x="time", y="value", kind="line", data=df)
plt.close()

root = tk.Tk()
canvas = FigureCanvasTkAgg(g.fig, master=root)
canvas.get_tk_widget().pack(side=tk.TOP, fill=tk.BOTH, expand=1)
root.mainloop()
 

weamagic

Пользователь
Пользователь
Июл 11, 2020
149
13
18
Вот пример:
Python:
import matplotlib.pyplot as plt
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
import pandas as pd
import numpy as np
import seaborn as sns
import tkinter as tk


sns.set()
df = pd.DataFrame(dict(time=np.arange(500), value=np.random.randn(500).cumsum()))
g = sns.relplot(x="time", y="value", kind="line", data=df)
plt.close()

root = tk.Tk()
canvas = FigureCanvasTkAgg(g.fig, master=root)
canvas.get_tk_widget().pack(side=tk.TOP, fill=tk.BOTH, expand=1)
root.mainloop()
Не работает. Программа виснет. Прикладываю полный код и тестовые данные.
Python:
import matplotlib.pyplot as plt
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
from matplotlib.figure import Figure
from tkinter import *
from tkinter.ttk import Treeview, Scrollbar, Combobox
from tkinter import filedialog as fld
import seaborn as sns
import pandas as pd

def prev_log():
    data_x=[]
    data_y=[]
    for line in tbl_dataset.get_children():
        data_x.append(tbl_dataset.item(line)['values'][x_axis_name.current()])
        data_y.append(tbl_dataset.item(line)['values'][y_axis_name.current()])
    dt=pd.DataFrame({x_axis_name.get():data_x, y_axis_name.get():data_y})
    sns.set()
    g = sns.relplot(x=x_axis_name.get(), y=y_axis_name.get(), data=dt)
    plt.close()
    img_log=FigureCanvasTkAgg(g, master=win)
    img_log.get_tk_widget().place(x=5, y=5)
    print(dt)

win=Tk()
win.geometry("1024x728")
menu_win=Menu(win)
prj_menu=Menu(menu_win)
prj_menu.add_command(label='Open log', command=opn_ld)
menu_win.add_cascade(label='File', menu=prj_menu)
win.config(menu=menu_win)
tbl_dataset=Treeview(win)
tbl_dataset.place(x=210, y=5, width=500)
v_scrlbar=Scrollbar(orient=VERTICAL)
v_scrlbar.place(x=710, y=5, height=220)
tbl_dataset.config(yscrollcommand=v_scrlbar.set)
v_scrlbar.config(command=tbl_dataset.yview)
x_axis_name=Combobox(win)
x_axis_name.place(x=730, y=5)
y_axis_name=Combobox(win)
y_axis_name.place(x=730, y=30)
btn_prn=Button(win, text='Print', command=prev_log)
btn_prn.place(x=875, y=5, width=100, height=25)
win.mainloop()
 

Вложения

  • data_well_in.txt
    156,7 КБ · Просмотры: 1

stud_55

Модератор
Команда форума
Модератор
Апр 3, 2020
1 522
672
113
Вот пример с вашими данными:
Python:
import matplotlib.pyplot as plt
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
import pandas as pd
import numpy as np
import seaborn as sns
import tkinter as tk


def make_dataset():
    data = {'Time': [], 'Value1': [], 'Value2': []}
    with open('data_well_in.txt', 'r', encoding='utf-8') as f:
        next(f)
        for s in f:
            data['Time'].append(float(s.split()[0]))
            data['Value1'].append(float(s.split()[1]))
            data['Value2'].append(float(s.split()[2]))

    return pd.DataFrame(data)


sns.set()
df = make_dataset()
g1 = sns.relplot(x="Time", y="Value1", kind="line", data=df)
plt.close()
g2 = sns.relplot(x="Time", y="Value2", kind="line", data=df)
plt.close()

root = tk.Tk()
canvas1 = FigureCanvasTkAgg(g1.fig, master=root)
canvas1.get_tk_widget().pack(side=tk.TOP, fill=tk.BOTH, expand=1)
canvas2 = FigureCanvasTkAgg(g2.fig, master=root)
canvas2.get_tk_widget().pack(side=tk.TOP, fill=tk.BOTH, expand=1)
root.mainloop()
 

Форум IT Специалистов