2016-01-20 2 views
1

Я пишу приложение, используя pandas DataFrames в Python 2.7. Мне нужно построить столбцы моих DataFrames в окне Tkinter. Я знаю, что я могу построить панда DataFrames столбцов, используя встроенный метод участка на DataFrame или сериях (это только обертка функции Matplotlib участка), например так:Python: Вставить участок панды в Tkinter GUI

import pandas as pd 
df = pd.DataFrame({'one':[2,4,6,8], 'two':[3,5,7,9]}) 
df.plot('one') 

Кроме того, я понял, как для построения графического окна Tkinter с использованием matplotlib:

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, как указано выше. Я не могу заставить это работать. Если это возможно, я не хочу использовать инструменты построения matplotlibs, поскольку инструменты pandas plot подходят для моих потребностей намного лучше. Есть ли способ объединить pandas plot() с Tkinter? В принципе, вместо этой строки:

dataPlot = FigureCanvasTkAgg(f, master=lf) 
dataPlot.show() 

мне это нужно:

dataPlot = FigureCanvasTkAgg(df.plot('one'), master=lf) 
dataPlot.show() 

ответ

2

pandas использует matplotlib для печати. Для большинства функций pandas для построения графика используется ax kwarg, который определяет объект осей, который будет использоваться. Есть несколько функций 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() 
+0

Большое спасибо, что небольшое изменение решить мою проблему. Если дело доходило до того, что я делал что-то вроде разброса, думаю, мне пришлось бы использовать функцию графика matplotlib, потому что нет объекта осей, который можно передать? – Alarik