Python:在 Tkinter GUI 中嵌入 pandas 图
Python: Embed pandas plot in Tkinter GUI
我正在 Python 2.7 中使用 pandas DataFrames 编写应用程序。我需要将我的数据帧的列绘制到 Tkinter window。我知道我可以使用 DataFrame 或 Series 上的内置 plot 方法绘制 pandas DataFrames 列(这只是 matplotlib plot 函数的包装),如下所示:
import pandas as pd
df = pd.DataFrame({'one':[2,4,6,8], 'two':[3,5,7,9]})
df.plot('one')
此外,我想出了如何使用 matplotlib 绘制到 Tkinter GUI window:
import matplotlib
matplotlib.use('TkAgg')
from numpy import arange, sin, pi
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
from matplotlib.figure import Figure
import pandas as pd
import Tkinter as tk
import ttk
root = tk.Tk()
#-------------------------------------------------------------------------------
lf = ttk.Labelframe(root, text='Plot Area')
lf.grid(row=0, column=0, sticky='nwes', padx=3, pady=3)
f = Figure(figsize=(5,4), dpi=100)
a = f.add_subplot(111)
t = arange(0.0,3.0,0.01)
s = sin(2*pi*t)
a.plot(t,s)
dataPlot = FigureCanvasTkAgg(f, master=lf)
dataPlot.show()
dataPlot.get_tk_widget().grid(row=0, column=0)
#-------------------------------------------------------------------------------
root.mainloop()
这一切都按预期工作。我想要做的是在 Tkinter window 上输出 pandas.DataFrame.plot(),例如在上面的 Labelframe 中。我无法让它工作。如果可能的话,我不想使用 matplotlibs 绘图工具,因为 pandas 绘图工具更适合我的需要。有没有办法将 pandas plot() 与 Tkinter 结合起来?基本上代替这一行:
dataPlot = FigureCanvasTkAgg(f, master=lf)
dataPlot.show()
我需要这个:
dataPlot = FigureCanvasTkAgg(df.plot('one'), master=lf)
dataPlot.show()
pandas
使用 matplotlib
进行绘图。大多数 pandas
绘图功能采用 ax
kwarg 指定将使用的轴对象。有一些 pandas
函数不能以这种方式使用,并且总是会使用 pyplot
创建它们自己的 figure/axes。 (例如 scatter_matrix
)
然而,对于基于您的示例的简单案例:
import matplotlib
import numpy as np
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
from matplotlib.figure import Figure
import pandas as pd
import Tkinter as tk
import ttk
root = tk.Tk()
lf = ttk.Labelframe(root, text='Plot Area')
lf.grid(row=0, column=0, sticky='nwes', padx=3, pady=3)
t = np.arange(0.0,3.0,0.01)
df = pd.DataFrame({'t':t, 's':np.sin(2*np.pi*t)})
fig = Figure(figsize=(5,4), dpi=100)
ax = fig.add_subplot(111)
df.plot(x='t', y='s', ax=ax)
canvas = FigureCanvasTkAgg(fig, master=lf)
canvas.show()
canvas.get_tk_widget().grid(row=0, column=0)
root.mainloop()
我正在 Python 2.7 中使用 pandas DataFrames 编写应用程序。我需要将我的数据帧的列绘制到 Tkinter window。我知道我可以使用 DataFrame 或 Series 上的内置 plot 方法绘制 pandas DataFrames 列(这只是 matplotlib plot 函数的包装),如下所示:
import pandas as pd
df = pd.DataFrame({'one':[2,4,6,8], 'two':[3,5,7,9]})
df.plot('one')
此外,我想出了如何使用 matplotlib 绘制到 Tkinter GUI window:
import matplotlib
matplotlib.use('TkAgg')
from numpy import arange, sin, pi
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
from matplotlib.figure import Figure
import pandas as pd
import Tkinter as tk
import ttk
root = tk.Tk()
#-------------------------------------------------------------------------------
lf = ttk.Labelframe(root, text='Plot Area')
lf.grid(row=0, column=0, sticky='nwes', padx=3, pady=3)
f = Figure(figsize=(5,4), dpi=100)
a = f.add_subplot(111)
t = arange(0.0,3.0,0.01)
s = sin(2*pi*t)
a.plot(t,s)
dataPlot = FigureCanvasTkAgg(f, master=lf)
dataPlot.show()
dataPlot.get_tk_widget().grid(row=0, column=0)
#-------------------------------------------------------------------------------
root.mainloop()
这一切都按预期工作。我想要做的是在 Tkinter window 上输出 pandas.DataFrame.plot(),例如在上面的 Labelframe 中。我无法让它工作。如果可能的话,我不想使用 matplotlibs 绘图工具,因为 pandas 绘图工具更适合我的需要。有没有办法将 pandas plot() 与 Tkinter 结合起来?基本上代替这一行:
dataPlot = FigureCanvasTkAgg(f, master=lf)
dataPlot.show()
我需要这个:
dataPlot = FigureCanvasTkAgg(df.plot('one'), master=lf)
dataPlot.show()
pandas
使用 matplotlib
进行绘图。大多数 pandas
绘图功能采用 ax
kwarg 指定将使用的轴对象。有一些 pandas
函数不能以这种方式使用,并且总是会使用 pyplot
创建它们自己的 figure/axes。 (例如 scatter_matrix
)
然而,对于基于您的示例的简单案例:
import matplotlib
import numpy as np
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
from matplotlib.figure import Figure
import pandas as pd
import Tkinter as tk
import ttk
root = tk.Tk()
lf = ttk.Labelframe(root, text='Plot Area')
lf.grid(row=0, column=0, sticky='nwes', padx=3, pady=3)
t = np.arange(0.0,3.0,0.01)
df = pd.DataFrame({'t':t, 's':np.sin(2*np.pi*t)})
fig = Figure(figsize=(5,4), dpi=100)
ax = fig.add_subplot(111)
df.plot(x='t', y='s', ax=ax)
canvas = FigureCanvasTkAgg(fig, master=lf)
canvas.show()
canvas.get_tk_widget().grid(row=0, column=0)
root.mainloop()