Python:将pandas图表嵌入Tkinter GUI

4
我正在使用Python 2.7中的pandas数据框架编写应用程序。我需要将我的数据框架列绘制到Tkinter窗口中。我知道可以使用DataFrame或Series的内置plot方法(它只是matplotlib plot函数的包装器)来绘制pandas数据框架列,如下所示:
import pandas as pd
df = pd.DataFrame({'one':[2,4,6,8], 'two':[3,5,7,9]})
df.plot('one')

此外,我找出了如何使用matplotlib绘制到Tkinter GUI窗口:

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()

这一切都按预期工作。我想做的是让pandas.DataFrame.plot()的输出显示在Tkinter窗口中,例如上面的Labelframe中。但我无法做到这一点。如果可能的话,我不想使用matplotlib的绘图工具,因为pandas的绘图工具更适合我的需求。有没有办法将pandas plot()与Tkinter结合起来?基本上,我想要的是代替这行代码:
dataPlot = FigureCanvasTkAgg(f, master=lf)
dataPlot.show()

我需要这个:
dataPlot = FigureCanvasTkAgg(df.plot('one'), master=lf)
dataPlot.show()
1个回答

4

pandas使用matplotlib进行绘图。大多数pandas绘图功能需要一个ax关键字参数,用于指定将要使用的轴对象。但有一些pandas函数无法以此方式使用,它们总是会使用pyplot创建自己的图形/轴对象。(例如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()

非常感谢,那个小改动解决了我的问题。如果要做像散点图这样的事情,我想我必须使用matplotlib绘制函数,因为没有可以传递的坐标轴对象? - Alarik

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接