python - PySimpleGUI 窗口选项卡中嵌入的可缩放 +/- 功能的 matplotlib 窗口

标签 python matplotlib pysimplegui

我有以下代码(基于 Matplotlib plot zooming with scroll wheel )。我尝试将其嵌入到 PySimpleGUI 窗口选项卡中,但到目前为止我还无法做到这一点。

我设法让它与 Tkinter 窗口一起工作,但我的主要 GUI 主要是 PySImpleGUI。

from matplotlib.pyplot import figure, show 
import numpy import PySimpleGUI as sg 
import matplotlib.pyplot as plt

class ZoomPan:
    def __init__(self):
        self.press = None
        self.cur_xlim = None
        self.cur_ylim = None
        self.x0 = None
        self.y0 = None
        self.x1 = None
        self.y1 = None
        self.xpress = None
        self.ypress = None

    def zoom_factory(self, ax, base_scale = 2.):
        def zoom(event):
            cur_xlim = ax.get_xlim()
            cur_ylim = ax.get_ylim()

            xdata = event.xdata # get event x location
            ydata = event.ydata # get event y location

            if event.button == 'up':
                # deal with zoom in
                scale_factor = 1 / base_scale
            elif event.button == 'down':
                # deal with zoom out
                scale_factor = base_scale
            else:
                # deal with something that should never happen
                scale_factor = 1
                print (event.button)

            new_width = (cur_xlim[1] - cur_xlim[0]) * scale_factor
            new_height = (cur_ylim[1] - cur_ylim[0]) * scale_factor

            relx = (cur_xlim[1] - xdata)/(cur_xlim[1] - cur_xlim[0])
            rely = (cur_ylim[1] - ydata)/(cur_ylim[1] - cur_ylim[0])

            ax.set_xlim([xdata - new_width * (1-relx), xdata + new_width * (relx)])
            ax.set_ylim([ydata - new_height * (1-rely), ydata + new_height * (rely)])
            ax.figure.canvas.draw()

        fig = ax.get_figure() # get the figure of interest
        fig.canvas.mpl_connect('scroll_event', zoom)

        return zoom

    def pan_factory(self, ax):
        def onPress(event):
            if event.inaxes != ax: return
            self.cur_xlim = ax.get_xlim()
            self.cur_ylim = ax.get_ylim()
            self.press = self.x0, self.y0, event.xdata, event.ydata
            self.x0, self.y0, self.xpress, self.ypress = self.press

        def onRelease(event):
            self.press = None
            ax.figure.canvas.draw()

        def onMotion(event):
            if self.press is None: return
            if event.inaxes != ax: return
            dx = event.xdata - self.xpress
            dy = event.ydata - self.ypress
            self.cur_xlim -= dx
            self.cur_ylim -= dy
            ax.set_xlim(self.cur_xlim)
            ax.set_ylim(self.cur_ylim)

            ax.figure.canvas.draw()

        fig = ax.get_figure() # get the figure of interest

        # attach the call back
        fig.canvas.mpl_connect('button_press_event',onPress)
        fig.canvas.mpl_connect('button_release_event',onRelease)
        fig.canvas.mpl_connect('motion_notify_event',onMotion)

        #return the function
        return onMotion

"FIGURE"
plt.figure(1) 
fig = plt.gcf()   
ax = fig.add_subplot(111) 
ax.clear()
ax.set_title('') 

"RANDOM PLOT"
x,y,s,c = numpy.random.rand(4,200) s *= 200   
ax.scatter(x,y,s,c, label='label')

"FIGURE CONSTANT"
ax.grid() 
ax.set_xlabel('COORDENADA ESTE', size=15) 
ax.set_ylabel('COORDENADA NORTE', size=15) 
plt.tight_layout(pad=0.05, h_pad=0.05, w_pad=0.05, rect=(0.05,-0.05,0.95,0.95)) 
ax.legend(loc=2, bbox_to_anchor=(-0.15, 1)) 
mng = plt.get_current_fig_manager() 
mng.window.showMaximized()

"PLOT"
zp = ZoomPan() 
figZoom = zp.zoom_factory(ax, base_scale = 1.1) 
figPan= zp.pan_factory(ax) 
show()

最佳答案

您像平常一样开始绘图,然后您必须为 pysimplegui 窗口 Canvas 创建实际的无花果,如下所示:

def draw_figure(canvas, figure, loc=(0, 0)):
    figure_canvas_agg = FigureCanvasTkAgg(figure, canvas)
    figure_canvas_agg.draw()
    figure_canvas_agg.get_tk_widget().pack(side='top', fill='both', expand=1)
    return figure_canvas_agg

如:

fig_canvas_agg = draw_figure(window['canvas'].TKCanvas, fig)

在 PYSImpleGUI 的窗口布局上使用 fig= plt.figure()window['canvas']=sg.Canvas(key='canvas'),然后应用 ZoomPan 类,如下所示:

zp = plot_func()
figZoom = zp.zoom_factory(ax1, base_scale=1.7)
figPan = zp.pan_factory(ax1)

关于python - PySimpleGUI 窗口选项卡中嵌入的可缩放 +/- 功能的 matplotlib 窗口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60145965/

相关文章:

Python Argparse 子解析器

python - 使用命令行工具组合多个图像

python - 如何在 pysimplegui 中增加 inputText 框?

python - 如何在 Windows 上挂载和卸载

python - 使用线路分析器进行性能统计时出现`TypeError:' module ' object is not callable`

python - 使用 subplot2grid 时如何共享

Python/Matplotlib -> to_rgba : Invalid rgba arg

python - Matplotlib.pyplot 标签不在标签中显示印地语文本,

python - 如何在 PySimple GUI 中根据按钮点击显示不同的布局? (持续窗口循环)

python - 如何在此处使用 While 循环计时器?