Я загружаю 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