如何使用数据比例尺和数据比例尺在绘图框中显示Pandas?

2024-04-28 22:16:55 发布

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

我正在构建一个数据显示GUI,使用的是Tkinter(这里去掉了)。其目标是使用Tkinter缩放滑块在Pandas数据帧中选择列并在列之间移动,并将选定的数据列显示为嵌入式MatplotLib图表。 然而,我在绑定缩放滑块到熊猫数据帧列和图表显示的选择时遇到了很大的麻烦。 对于来自Tkinter Scale(S1)的事件,被调用的函数(fromScale)应该更新类变量(displayField),然后更新字符串(dField),它是Pandas数据帧(dar_MAST)中的列索引,以便在嵌入的图表中显示。 在我发疯之前,任何重新定义绑定以允许缩放滑块移动以允许“滚动”显示的数据帧数据列的任何帮助都将是非常感谢的… (使用python3.6.5,PyCharm) 提前谢谢

尝试过许多Tkinter“绑定”、命令函数、全局变量与类变量的配置,但都不起作用。已在此处使用类变量解决,但仍无法更新图表显示

import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import tkinter as tk
from tkinter import *
from tkinter import ttk
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg, NavigationToolbar2TkAgg

class dar(Frame):
    displayField = 0   # Class variable to identify the column in the dataframe to display

    def __init__(self, master=None):
        Frame.__init__(self, master)
        self.master = master
        self.init_window()
        container = Frame(self)
        container.pack(side='top', fill='both', expand=True)
        container.grid_rowconfigure(0, weight=1)
        container.grid_columnconfigure(0, weight=1)

    def init_window(self):
        self.master.title('dar_FN')
        content = ttk.Frame(root, padding=(3, 3, 3, 3))

        dField = 'Fld_' + str(dar.displayField)  # Column index for dataframe display

        datas = np.random.uniform(size=(100, 10))  # Dummy random dataset
        dar_MAST = pd.DataFrame(datas, columns=['Fld_0', 'Fld_1', 'Fld_2', 'Fld_3', 'Fld_4', 'Fld_5', 'Fld_6', 'Fld_7',
                                                'Fld_8', 'Fld_9'])

        frame6 = ttk.Notebook(content, width=465, height=150)   # Frame containing Scale Slider
        frame6_tab1 = ttk.Frame(frame6)
        frame6.add(frame6_tab1, text='tp Selection')
        frame6_tab1_canvas = tk.Canvas(frame6_tab1, width=464, height=145)  # creates MAX canvas in tab
        frame6.grid_rowconfigure(0, weight=1)
        frame6.grid_columnconfigure(0, weight=1)
        frame6_tab1_canvas.grid(column=20, row=60)

        S1 = Scale(frame6_tab1_canvas, from_=0, to=9, orient=HORIZONTAL, length=360,   # THE SCALE SLIDER
                   highlightcolor='lightblue', tickinterval=100, command=self.fromScale)
        S1.grid(row=1, column=1, columnspan=10)

        self.update_idletasks()

        frame1a = ttk.Notebook(content, width=480, height=750)   # Frame containing data display
        frame1a_tab1 = ttk.Frame(frame1a)
        frame1a.add(frame1a_tab1, text='1a')
        frame1a_tab1_canvas = tk.Canvas(frame1a_tab1, width=470, height=745)
        frame1a_tab1_canvas.grid(column=0, row=20, sticky='nsew')
        frame1a_tab1_chart = plt.figure(figsize=(4.55, 7.46), dpi=100)
        f1at1 = plt.subplot2grid((20, 25), (0, 0), rowspan=20, colspan=25)
        f1at1.grid(True)
        f1at1.set_ylim(0, 100, auto=False)

        f1at1.plot(dar_MAST[dField], dar_MAST[dField].index, linewidth=1, label=dField)
        f1at1.legend()

        canvas_f1at1 = FigureCanvasTkAgg(frame1a_tab1_chart, frame1a_tab1_canvas)
        canvas_f1at1.draw()
        canvas_f1at1.get_tk_widget().pack(side=tk.TOP, fill=tk.BOTH, expand=True)

        content.grid(column=0, row=0, sticky=(N, S, E, W))
        frame1a.grid(column=0, row=0, columnspan=3, rowspan=1, sticky=(N, S, E, W))
        frame6.grid(column=0, row=1, columnspan=3, rowspan=1, sticky=(N, S, E, W))
        root.columnconfigure(0, weight=1)
        root.rowconfigure(0, weight=1)

    def fromScale(self, val):   # Function to update Class displayField value from Scale Slider event
        dar.displayField = int(val)  # Update Class variable displayField

root = Tk()
app = dar(root)
app.mainloop()

刻度滑块的每次移动都应将显示的数据图表更改为darđMAST数据帧中的下一列或相关数据列,但只显示第一列数据,即:无绑定?在


Tags: 数据importselfcolumnframetab1tkgrid