如何在tkinter中显示matplotlib图表

fnvucqvd  于 2021-07-14  发布在  Java
关注(0)|答案(1)|浏览(348)

我试图在tkinter窗口中显示4个或更多图表,但它们放错了位置,我想我还需要一个滚动条。代码如下:

root = tk.Tk()

    figure1 = plt.Figure(figsize=(2,2), dpi=100)

    ax1 = figure1.add_subplot(221)
    ax1.plot(df1['year'], df1['personal'], color='red')
    scatter1 = FigureCanvasTkAgg(figure1, root)
    scatter1.get_tk_widget().pack()
    ax1.legend([''])
    ax1.set_xlabel('valeur de personals')
    ax1.set_title('ev de personal ')

    figure2 = plt.Figure(figsize=(2,2), dpi=100)
    ax2 = figure2.add_subplot(222)
    scatter2 = FigureCanvasTkAgg(figure2, root)
    scatter2.get_tk_widget().pack(side=tk.RIGHT)
    ax2.legend([''])
    ax2.set_xlabel('valeur BSA')
    ax2.set_title('Evolutiion des valeurs BSA depuis 1990 ')
    ax2.plot(df2['year'], df2['value'], color='red')

    figure3 = plt.Figure(figsize=(2,2), dpi=100)
    ax3 = figure3.add_subplot(223)
    #the same code for the reste 

    root.mainloop()

但结果是:

zz2j4svz

zz2j4svz1#

我看到两个问题
第一:
创建4个画布 FigureCanvasTkAgg 在你使用的每一块画布上 add_subplot(222) 为4个绘图(2x2)创建位置,但在每个画布中仅使用一个位置。你只能用一块画布。
第二:
你需要 pack(fill="both", expand=True) 调整绘图大小并使用窗口中的所有空间。
你也使用 pack(side=tk.RIGHT) 这会造成布局上的问题
最小工作代码

import tkinter as tk
import pandas as pd
import matplotlib.pyplot as plt

import matplotlib
matplotlib.use("TkAgg")

from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg

# from matplotlib.figure import Figure

df1 = pd.DataFrame({
    'year': [2001, 2002, 2003],
    'value': [1, 3, 2],
    'personal': [9, 1, 5],
})

df2 = pd.DataFrame({
    'year': [2001, 2002, 2003],
    'value': [1, 3, 2],
    'personal': [9, 1, 5],
})

# ---

root = tk.Tk()

figure = plt.Figure(figsize=(2,2), dpi=100)

scatter = FigureCanvasTkAgg(figure, root)
scatter.get_tk_widget().pack() #fill='both', expand=True)

# ---

ax1 = figure.add_subplot(221)
ax1.plot(df1['year'], df1['personal'], color='red')

ax1.legend([''])
ax1.set_xlabel('valeur de personals')
ax1.set_title('ev de personal ')

# ---

ax2 = figure.add_subplot(222)
ax2.plot(df2['year'], df2['value'], color='red')

ax2.legend([''])
ax2.set_xlabel('valeur BSA')
ax2.set_title('Evolutiion des valeurs BSA depuis 1990 ')

# ---

ax3 = figure.add_subplot(223)
ax3.plot(df1['year'], df1['personal'], color='red')

ax3.legend([''])
ax3.set_xlabel('valeur de personals')
ax3.set_title('ev de personal ')

# ---

ax4 = figure.add_subplot(224)
ax4.plot(df2['year'], df2['value'], color='red')

ax4.legend([''])
ax4.set_xlabel('valeur BSA')
ax4.set_title('Evolutiion des valeurs BSA depuis 1990 ')

# ---

root.mainloop()

结果:

编辑:
与4个画布相同-并且每个画布使用 add_plot('111') -但这次我用 grid() 而不是 pack() 组织起来。
它需要 columnconfigure , rowconfigure 调整单元格大小并使用窗口中的所有空间。以及 grid( ..., sticky='news') 将画布调整为单元格大小。

import tkinter as tk
import pandas as pd
import matplotlib.pyplot as plt

import matplotlib
matplotlib.use("TkAgg")

from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg

# from matplotlib.figure import Figure

df1 = pd.DataFrame({
    'year': [2001, 2002, 2003],
    'value': [1, 3, 2],
    'personal': [9, 1, 5],
})

df2 = pd.DataFrame({
    'year': [2001, 2002, 2003],
    'value': [1, 3, 2],
    'personal': [9, 1, 5],
})

# ---

root = tk.Tk()

# resize grid

root.columnconfigure(0, weight=1)
root.columnconfigure(1, weight=1)
root.rowconfigure(0, weight=1)
root.rowconfigure(1, weight=1)

# ---

figure1 = plt.Figure(figsize=(2,2), dpi=100)

scatter1 = FigureCanvasTkAgg(figure1, root)
scatter1.get_tk_widget().grid(row=0, column=0, sticky='news')

# scatter1.get_tk_widget().pack(fill='both', expand=True)

ax1 = figure1.add_subplot(111)
ax1.plot(df1['year'], df1['personal'], color='red')

ax1.legend([''])
ax1.set_xlabel('valeur de personals')
ax1.set_title('ev de personal ')

# ---

figure2 = plt.Figure(figsize=(2,2), dpi=100)

scatter2 = FigureCanvasTkAgg(figure2, root)
scatter2.get_tk_widget().grid(row=0, column=1, sticky='news')

# scatter2.get_tk_widget().pack(side='right', fill='both', expand=True)

ax2 = figure2.add_subplot(111)
ax2.plot(df2['year'], df2['value'], color='red')

ax2.legend([''])
ax2.set_xlabel('valeur BSA')
ax2.set_title('Evolutiion des valeurs BSA depuis 1990 ')

# ---

figure3 = plt.Figure(figsize=(2,2), dpi=100)

scatter3 = FigureCanvasTkAgg(figure3, root)
scatter3.get_tk_widget().grid(row=1, column=0, sticky='news')

# scatter3.get_tk_widget().pack(fill='both', expand=True)

ax3 = figure3.add_subplot(111)
ax3.plot(df1['year'], df1['personal'], color='red')

ax3.legend([''])
ax3.set_xlabel('valeur de personals')
ax3.set_title('ev de personal ')

# ---

figure4 = plt.Figure(figsize=(2,2), dpi=100)

scatter4 = FigureCanvasTkAgg(figure4, root)
scatter4.get_tk_widget().grid(row=1, column=1, sticky='news')

# scatter4.get_tk_widget().pack(fill='both', expand=True)

ax4 = figure4.add_subplot(111)
ax4.plot(df2['year'], df2['value'], color='red')

ax4.legend([''])
ax4.set_xlabel('valeur BSA')
ax4.set_title('Evolutiion des valeurs BSA depuis 1990 ')

# ---

root.mainloop()

结果:
现在,地块的利润率越来越小。

相关问题