【发布时间】: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