【问题标题】:Plotting multiple graphs in separate tkinter figures within the same window在同一窗口中以单独的 tkinter 图形绘制多个图形
【发布时间】:2018-01-01 21:28:54
【问题描述】:

我正在尝试使用 tkinter 创建一个 GUI,它会在出现提示时绘制多个绘图。现在我的代码可以工作了,它把所有的图表都绘制到一个图上。我想在同一个 GUI 中将图表绘制在不同的数字上。

这是我在同一个 tkinter 图中绘制所有图表的代码:

import myModule
from myModule import *
import SA_apis
from SA_apis import *
import matplotlib
matplotlib.use("TkAgg")
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg,   NavigationToolbar2TkAgg
from matplotlib.figure import Figure
import tkinter as tk
from tkinter import ttk
from matplotlib import pyplot as plt

LARGE_FONT= ("Verdana", 12)
NORM_FONT= ("Verdana", 10)
SMALL_FONT= ("Verdana", 8)
plt.style.use("dark_background")
plt.style.use("seaborn-bright")

def popupmsg(msg):
    popup = tk.Tk()
    popup.wm_title("Menu")
    label = ttk.Label(popup, text=msg, font=NORM_FONT)
    label.pack(side="top", fill="x", pady=10)
    B1 = ttk.Button(popup, text="Okay", command = popup.destroy)
    B1.pack()
    popup.mainloop()


class TkGraph(tk.Tk):
    def __init__(self, *args, **kwargs):
        tk.Tk.__init__(self, *args, **kwargs)
        tk.Tk.wm_title(self, "TkGraph")

        container = tk.Frame(self)
        container.pack(side="top", fill="both", expand = True)
        container.grid_rowconfigure(0, weight=1)
        container.grid_columnconfigure(0, weight=1)

        menubar = tk.Menu(container)
        filemenu = tk.Menu(menubar, tearoff=0)
        filemenu.add_command(label="New", command = lambda: popupmsg("This is not yet supported"))
        filemenu.add_command(label="Add", command = lambda: popupmsg("This is not yet supported"))
        filemenu.add_command(label="Exit", command=quit)
        menubar.add_cascade(label="File", menu=filemenu)
        tk.Tk.config(self, menu=menubar)

        parameter = tk.Menu(menubar, tearoff=0)
        parameter.add_command(label="Selection", command = lambda: popupmsg("This is not yet supported"))
        menubar.add_cascade(label="Parameter", menu=parameter)
        tk.Tk.config(self, menu=menubar)

        timemenu = tk.Menu(menubar, tearoff=0)
        timemenu.add_command(label="Selection", command = lambda: popupmsg("This is not yet supported"))
        menubar.add_cascade(label="Time", menu=parameter)
        tk.Tk.config(self, menu=menubar)

        helpmenu = tk.Menu(menubar, tearoff=0)
        helpmenu.add_command(label="Selection", command = lambda: popupmsg("This is not yet supported"))
         menubar.add_cascade(label="Help", menu=parameter)
        tk.Tk.config(self, menu=menubar)

         self.frames = {}
        for F in (StartPage, PageOne):
            frame = F(container, self)
            self.frames[F] = frame
            frame.grid(row=0, column=0, sticky="nsew")
         self.show_frame(StartPage)
    def show_frame(self, cont):
        frame = self.frames[cont]
        frame.tkraise()

class StartPage(tk.Frame):
    def __init__(self, parent, controller):
        tk.Frame.__init__(self,parent)
        label = tk.Label(self, text="Home", font=LARGE_FONT)
        label.pack(pady=10,padx=10)
        button1 = ttk.Button(self, text="Graph",
        command=lambda: controller.show_frame(PageOne))
        button1.pack()


 class PageOne(tk.Frame):
    def __init__(self, parent, controller):
        tk.Frame.__init__(self, parent)
        label = tk.Label(self, text="Graph", font=LARGE_FONT)
        label.pack(pady=10,padx=10)
        button1 = ttk.Button(self, text="Back to Home",
                        command=lambda: controller.show_frame(StartPage))
        button1.pack()

    """This is the code for the plotted graph, for each parameter you wish to plot you need to have a seperate x, y coordinate system.
    You got the amount of points for each parameter on SA_apis now you just paste that number in the code."""

    #Graph Code
    x = (g[0].time[:111673])
    y = (g[0].data.f[:111673])
    x2 = (h[0].time[:142642])
    y2 = (h[0].data.f[:142642])
    x3 = (j[0].time[:134970])
    y3 = j[0].data.f[:134970]
    x4 = (p[0].time[:147542])
    y4 = (p[0].data.f[:147542])
    plt.subplot()
    fig = plt.figure()

    """For each parameters x,y coordinates you will need a seperate  plt.plot()"""
    plt.plot(x, y)
    plt.plot(x2, y2)
    plt.plot(x3, y3)
    plt.plot(x4, y4)
    #descr = (g[0].descr)
    plt.title('(descr)', fontsize = 15)
    plt.xlabel('Time', fontsize=12)
    plt.ylabel('Data', fontsize=12)
    plt.grid(linestyle = 'dashed')   

    canvas = FigureCanvasTkAgg(fig, self)
    canvas.show()
    canvas.get_tk_widget().pack(side=tk.BOTTOM, fill=tk.BOTH, expand=True)

    toolbar = NavigationToolbar2TkAgg(canvas, self)
    toolbar.update()
    canvas._tkcanvas.pack(side=tk.TOP, fill=tk.BOTH, expand=True)

app = TkGraph()
app.mainloop()

我尝试像这样分离图表:

    x = (g[0].time[:111673])
    y = (g[0].data.f[:111673])
    plt.plot(x, y)
    plt.title('(descr)', fontsize = 15)
    plt.xlabel('Time', fontsize=12)
    plt.ylabel('Data', fontsize=12)
    plt.grid(linestyle = 'dashed')
    fig = plt.figure()

    x2 = (h[0].time[:142642])
    y2 = (h[0].data.f[:142642])
    plt.plot(x2, y2)
    plt.title('(descr)', fontsize = 15)
    plt.xlabel('Time', fontsize=12)
    plt.ylabel('Data', fontsize=12)
    plt.grid(linestyle = 'dashed')
    fig = plt.figure()

    x3 = (j[0].time[:134970])
    y3 = (j[0].data.f[:134970])
    plt.plot(x3, y3)
    plt.title('(descr)', fontsize = 15)
    plt.xlabel('Time', fontsize=12)
    plt.ylabel('Data', fontsize=12)
    plt.grid(linestyle = 'dashed')
    fig = plt.figure()

    x4 = (p[0].time[:147542])
    y4 = (p[0].data.f[:147542])
    plt.plot(x4, y4)
    plt.title('(descr)', fontsize = 15)
    plt.xlabel('Time', fontsize=12)
    plt.ylabel('Data', fontsize=12)
    plt.grid(linestyle = 'dashed')
    fig = plt.figure()

但这很乏味,并且不会导致所有四个图形都绘制在同一个 tkinter 窗口中。这会导致清空 tkinter。

我的问题是:如何在同一个 tkinter 窗口中绘制多个图形但在不同的图形中。理想情况下,它们将彼此相邻绘制,我不想创建另一个窗口。我需要同时查看所有图表以进行比较。

【问题讨论】:

    标签: python user-interface tkinter


    【解决方案1】:

    您只需要使用Frame 小部件。

    您可以在同一个窗口中拥有多个框架,因此您可以为每个图表创建所需的每个框架并以这种方式使用它们。

    看到您已经在使用框架,您应该不难设置。

    【讨论】:

      【解决方案2】:

      您需要将参数放入 subplot 方法中。

      plt.subplot(421)
      plt.xlabel('Time in seconds')
      plt.ylabel('Amplitude')
      plt.title('%s HeartBeat ..' % beat_file1)
      plt.plot(timeArray1, Y_filtered1)
      
      plt.subplot(422)
      plt.xlabel('Time in seconds')
      plt.ylabel('Amplitude')
      plt.title('%s HeartBeat ..' % beat_file2)
      plt.plot(timeArray2, Y_filtered2)
      

      这里有一个例子:https://matplotlib.org/users/pyplot_tutorial.html

      【讨论】:

      • 我对你的回答感到困惑。什么是“421”、“422”、“以秒为单位的时间”、“幅度”和“心跳”,它们与我的代码有什么关系?您没有向我提供有关您在我的答案中发布的代码的足够信息。您链接的是使用 numpy 的代码,我使用了 pandas 数据框。
      • 这只是我自己做的一个程序。当我这样做时,我想在同一个窗口上绘制四个图,所以使用 plt.subplot 方法你可以做到这一点。举一个正方形的例子。如果要显示 4 个图,第一个图有:'plt.subplot(221)' 这是如何将第一个图放在左角。等等...
      • 您在链接中有一个示例.. 看看 :) 看不到另一行,只看 subplot() 方法
      猜你喜欢
      • 1970-01-01
      • 2021-07-27
      • 1970-01-01
      • 2019-09-05
      • 2012-06-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多