Как я могу встроить диаграмму stackedbar или png в холст Tkinter? - PullRequest
0 голосов
/ 27 мая 2020

Я загружаю csv через Pandas, очищаю и рисую его в виде гистограммы с накоплением, и все работает нормально. Я пытаюсь просто встроить свой столбчатый график с накоплением на холст с помощью tkinter, но у меня возникают проблемы, которые я не могу понять. Например, мой вывод на холсте будет представлять собой гистограмму, показывающую только значения одной отдельной строки вместо всего фрейма данных. Я даже попытался преобразовать вывод диаграммы stackedbar в изображение и вместо этого встроить его, но у меня не получилось. Я думаю, что мне что-то не хватает при создании фигуры, содержащей вложение. Любая помощь приветствуется.

import tkinter as tk
from tkinter import*
import numpy as np
import pandas as pd
import matplotlib
import matplotlib.pyplot as plt
from matplotlib.figure import Figure
from matplotlib.backend_bases import key_press_handler
from matplotlib.backends.backend_tkagg import (
    FigureCanvasTkAgg, NavigationToolbar2Tk)

#Root Page
root = tk.Tk()
root.geometry("1060x860")

#Main Frame
main_frame = tk.Frame(root)
main_frame.pack(fill = BOTH, expand = True)

#Home Page Frames
graph1_canvas = tk.Canvas(main_frame, bg='#ffffff', highlightbackground='black', highlightthickness=1)

#Main Page Placings
graph1_canvas.place(relwidth = 0.55, relheight = 0.50, relx = 0.375, rely = 0.05)

#CSV Sending
"""Import csv into dataframe"""
df = pd.read_csv('Data.csv')

"""Drop un-necessary columns"""
data = df.drop(["Group5", "Group6"], axis = 1)

"""Separate data into 2 separate data frames: one for the ints, one for the type"""
data_int = data.select_dtypes(include=["number"])
data_str = data.select_dtypes(exclude=["number"])

"""Find Z-Score and remove z > 3 """
from scipy import stats
idx = np.all(stats.zscore(data_int) < 3,axis=1)

"""And then recombine filtered int df with string df from data"""
data_filtered = pd.concat([data_int.loc[idx], data_str.loc[idx]], axis=1)

""""Groupby typeand average"""
a = data_filtered.groupby(['Type']).mean()

#Stacked bar plot
fig, ax = plt.subplots()

colors = pd.Series({    
    'Group1':'C0',
    'Group2':'C1',
    'Group3':'C2',
    'Group4':'C3',
})

for i,r in a.iterrows():
    row = r.sort_values(ascending=False).cumsum()[::-1]
    ax.bar([i]*len(row), row, color=row.index.map(colors))

#Plotting to Graph1 Frame
fig = matplotlib.pyplot.Figure()
canvas = FigureCanvasTkAgg(fig, graph1_canvas)
canvas.get_tk_widget().pack(fill=BOTH, expand=1)

ax1 = fig.add_subplot(211)
r.plot(kind='bar', stacked = True, ax=ax1)

#Ending
root.mainloop()

Фрейм данных выглядит так:

DF:
Type  Group 1   Group 2   Group 3   Group 4   Group 5   Group 6
A        4         2         3         1         1         1   
A        4         1         2         1         1         1   
B        3         4         1         1         1         1   
C        2         3         4         1         1         1   
D        4         1         2         1         1         1   
E        1         2         2         4         1         1   
E        2         3         3         4         1         1   
F        4         1         2         2         1         1 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...