将Matplotlib图形拟合到wxpnel

我试图在wxpanel中显示一个图,以便在初始化时它与左上边缘和右边缘之间有5像素的间隙。

我尝试了下面的代码,但看起来在创建绘图时,它一直粘贴在面板的右边缘。调整大小后出现间隙。

# -*- coding: utf-8 -*-

import wx
#import pandas as pd
import matplotlib.pyplot as plt
from matplotlib.backends.backend_wxagg import FigureCanvasWxAgg as FigureCanvas
from relpermtable import RelPermTable as RelPermCl

class KrPanel(wx.Panel):

    def __init__(self,parent):
        super().__init__(parent)
        main_sizer = wx.BoxSizer(wx.VERTICAL)

        self.list_ctrl = wx.ListCtrl(
                self,size = (-1,300),style = wx.LC_REPORT | wx.BORDER_SUNKEN
        )

        self.list_ctrl.InsertColumn(0,'Sw',width=100)
        self.list_ctrl.InsertColumn(1,'Krw',width=100)
        self.list_ctrl.InsertColumn(2,'Krg',width=100)
        self.list_ctrl.InsertColumn(3,'Pc',width=100)
        main_sizer.Add(self.list_ctrl,wx.ALL | wx.EXPAND,5)

        self.SetSizer(main_sizer)

    def load_KrPc_data(self,in_dfr):
        for index,row in in_dfr.iterrows():
            self.list_ctrl.InsertItem(index,str(row["Sg"]))
            self.list_ctrl.SetItem(index,1,str(row["Krg"]))
            self.list_ctrl.SetItem(index,2,str(row["Krw"]))
            self.list_ctrl.SetItem(index,3,str(row["Pc"]))

class PlotPanel(wx.Panel):
    def __init__(self,parent):
        super().__init__(parent)

    def PlotKrPcData(self,df_in,in_swco,in_sgco):
        right_sizer = wx.BoxSizer(wx.VERTICAL)
        self.fig,self.ax1 = plt.subplots() # figsize=(5,5)
#        self.ax2 = self.ax1.twinx()
        self.ax1.plot(df_in['Sg'],df_in['Krg'],'r-')
        self.ax1.plot(df_in['Sg'],df_in['Krw'],'g-')
#        self.ax2.plot(new_df['Sg'],new_df['Pc'],'b-')
        self.ax1.plot((1-in_swco),'go')
        self.ax1.annotate('1-SWL',((1-in_swco),0.05))
        self.ax1.plot((in_sgco),'go',label = 'SGL')
        self.ax1.annotate('SGL',(in_sgco,0.05))
        self.canvas = FigureCanvas(self,-1,self.fig)
        right_sizer.Add(self.canvas,5)
        self.SetSizer(right_sizer)

class KrFrame(wx.Frame):
    def __init__(self):
        super().__init__(parent=None,title='Gas Relative Permeability Editor',size=(900,800))
        self.sp = wx.SplitterWindow(self)
        self.panel01 = KrPanel(self.sp)
        self.panel02 = PlotPanel(self.sp)
        self.sp.SplitVertically(self.panel01,self.panel02,450)
        self.create_menu()
        self.Show()

    def create_menu(self):
        menu_bar = wx.MenuBar()
        file_menu = wx.Menu()
        open_file_menu_item = file_menu.Append(
                wx.ID_ANY,'Open File','Open a Relative Permeability File'
        )
        exit_menu_item = file_menu.Append(
                wx.ID_EXIT,"Exit","Exit the application"
        )
        menu_bar.Append(file_menu,'&File')
        self.Bind(
                event = wx.EVT_MENU,handler = self.on_open_file,source = open_file_menu_item
        )
        self.Bind(
                event = wx.EVT_MENU,handler = self.on_exit,source = exit_menu_item
        )
        self.SetMenuBar(menu_bar)

    def on_open_file(self,event):
        title = "Choose a Relative Permeability file:"
        dlg = wx.FileDialog(self,title,"","eclipse include files (*.INC) | *.INC",style = wx.FD_DEFAULT_STYLE)
        if dlg.ShowModal() == wx.ID_OK:
            object = RelPermCl(dlg.GetPath())
            new_df = object.load_KrPc_data()
            new_sgco = object.calc_sgco()
            new_swco = object.calc_swco()
#            new_sgmax = object.calc_sgmax()
#            new_swmax = object.calc_swmax()
#            new_sgcr = object.calc_sgcr()
#            new_swcr = object.calc_swcr()
            self.panel01.load_KrPc_data(new_df)
            self.panel02.PlotKrPcData(new_df,new_sgco,new_swco)
#            print(new_df.head())
        dlg.Destroy()

    def on_exit(self,e):
        self.Close()

if __name__ == '__main__':
    app = wx.App(False)
    frame = KrFrame()
    app.MainLoop()
    del app

创建图时,我想在图的右边有5个像素的间隙。但是,以某种方式,只有在调整大小之后才产生差距。有没有一种方法可以设置绘图大小,而不管面板大小如何指定面板大小并指定边框大小?

将Matplotlib图形拟合到wxpnel

yangguiping007 回答:将Matplotlib图形拟合到wxpnel

尝试在Show调用之前放置frame.SendSizeEvent()。如果不起作用,请尝试使用wx.CallAfter(frame.SendSizeEvent)

本文链接:https://www.f2er.com/3168330.html

大家都在问