【问题标题】:Making the matplotlib Figure to occupy entire Canvas Area使 matplotlib 图占据整个 Canvas 区域
【发布时间】:2019-08-23 05:56:41
【问题描述】:

我正在浏览“https://matplotlib.org/3.1.1/gallery/user_interfaces/embedding_in_tk_sgskip.html”处的以下 matplotlib 示例代码。我有一个疑问/问题:-运行代码后,它会将图形很好地绘制/绘制到“FigureCanvasTkAgg”上。现在,如果我使用“NavigationToolbar2Tk”的“平移轴”功能,我可以平移/移动绘图的轴,并相应地移动绘制/绘制的图形。现在我希望图形的轴应该与画布尺寸一致,即在画布上绘制图形后,绘图应该完全占据画布,如果我使用“平移轴”功能,图形应该在整个画布上移动如果轴在画布的特定区域中移动,则“顶部”/“底部”/“左侧”/“右侧”区域中没有空格。

在以下代码中,我尝试更改“fig = Figure(figsize=(5, 4), dpi=100)” 行中提到的图形大小/尺寸,但未能成功。


import tkinter

from matplotlib.backends.backend_tkagg import (
    FigureCanvasTkAgg, NavigationToolbar2Tk)
# Implement the default Matplotlib key bindings.
from matplotlib.backend_bases import key_press_handler
from matplotlib.figure import Figure

import numpy as np


root = tkinter.Tk()
root.wm_title("Embedding in Tk")

fig = Figure(figsize=(5, 4), dpi=100)
t = np.arange(0, 3, .01)
ax = fig.add_subplot(111)
ax.plot(t, 2 * np.sin(2 * np.pi * t))
canvas = FigureCanvasTkAgg(fig, master=root)  # A tk.DrawingArea.
canvas.draw()
canvas.get_tk_widget().pack(side=tkinter.TOP, fill=tkinter.BOTH, expand=1)

toolbar = NavigationToolbar2Tk(canvas, root)
toolbar.update()
canvas.get_tk_widget().pack(side=tkinter.TOP, fill=tkinter.BOTH, expand=1)


def on_key_press(event):
    print("you pressed {}".format(event.key))
    key_press_handler(event, canvas, toolbar)


canvas.mpl_connect("key_press_event", on_key_press)


def _quit():
    root.quit()     # stops mainloop
    root.destroy()  # this is necessary on Windows to prevent
                    # Fatal Python Error: PyEval_RestoreThread: NULL tstate


button = tkinter.Button(master=root, text="Quit", command=_quit)
button.pack(side=tkinter.BOTTOM)

tkinter.mainloop()
# If you put root.destroy() here, it will cause an error if the window is
# closed with the window manager.

作为预期结果的示例,我可以举一个 ARCMAP/QGIS 软件控制台的示例,其中绘图完全占据画布区域,如果我们移动绘图/平移绘图的轴,则图形会在整个区域移动画布区域而不是边界框内。

任何帮助都会很有用。

编辑的实际代码:

import tkinter

from matplotlib.backends.backend_tkagg import (
    FigureCanvasTkAgg, NavigationToolbar2Tk)
# Implement the default Matplotlib key bindings.
from matplotlib.backend_bases import key_press_handler
from matplotlib.figure import Figure
import matplotlib.pyplot as plt

root = tkinter.Tk()

fig = Figure(figsize=(5, 4), dpi=100)

canvas1 = FigureCanvasTkAgg(fig, master=root)
canvas1.draw()

toolbar = NavigationToolbar2Tk(canvas1,root)
toolbar.update()
toolbar.pack(side=tkinter.TOP, fill=tkinter.X, padx=8)

canvas1.get_tk_widget().pack(side=tkinter.TOP, fill=tkinter.BOTH, expand=1, padx=10, pady=5)

canvas1._tkcanvas.pack(side=tkinter.TOP, fill=tkinter.BOTH, expand=1, padx=10, pady=5)

def on_key_press(event):
    print("you pressed {}".format(event.key))
    key_press_handler(event, canvas1, toolbar)


canvas1.mpl_connect("key_press_event", on_key_press)

def _load():
    import rasterio as rio
    from rasterio.plot import show
    ax = fig.add_subplot(111)
    fig.subplots_adjust(bottom=0, right=1, top=1, left=0, wspace=0, hspace=0)

#    fig.tight_layout(pad=0)

    with rio.open(r'C:\Users\Desktop\t1.tif') as src_plot:
        show(src_plot, ax=ax, cmap='gist_gray')
    plt.close()
    ax.set(title="",xticks=[], yticks=[])
    ax.spines["top"].set_visible(False)
    ax.spines["right"].set_visible(False)
    ax.spines["left"].set_visible(False)
    ax.spines["bottom"].set_visible(False)
    canvas1.draw()

button = tkinter.Button(master=root, text="Load", command=_load)
button.pack(side=tkinter.BOTTOM)

root.mainloop()

这里的问题是在画布上绘制了“.tif”文件之后,然后如果我使用“平移轴”按钮,图形会在放置在画布内的框内移动,而不是像它一样跨越整个画布区域曾经发生在 ArcMap/QGIS 中。

【问题讨论】:

  • 您可以将ax = fig.add_subplot(111) 替换为ax = fig.add_axes([0,0,1,1])
  • 前面的评论也断了轴,不知道是不是你想要的?如果没有,fig.tight_layout(pad=0),甚至可能与ax.plot(..., clip_on=False) 结合使用可能会满足您的需求。
  • 感谢大家回复我的问题。对于上面提供的代码,解决方案运行良好。但是,当我尝试在我的实际代码中实现相同的逻辑时(请参阅编辑后的帖子),其中包含使用 rasterio 库在 tkinter 画布上显示“.tif”文件,问题仍然存在。请大家提出建议。

标签: python matplotlib tkinter


【解决方案1】:

运行程序后,转到子图设置并使用参数。

现在您知道需要将这些参数更改为特定值。使用此功能:

matplotlib.pyplot.subplots_adjust(left=None, bottom=None, right=None, top=None, wspace=None, hspace=None)

这里可以显示默认值:

https://matplotlib.org/3.1.1/api/_as_gen/matplotlib.pyplot.subplots_adjust.html

【讨论】:

  • 嗨 Mohammad El Assal....您的解决方案适用于我的原始帖子....但是当我尝试在我尝试显示“.tiff”的已编辑帖子中使用相同的解决方案时画布上的文件,然后它不工作....
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-05-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多