Python 如何找到使用sizer例程在单独面板上支持多个打印比例和X轴的代码?

Python 如何找到使用sizer例程在单独面板上支持多个打印比例和X轴的代码?,python,matplotlib,toolkit,Python,Matplotlib,Toolkit,我一直在使用这段代码作为模型来修改一个应用程序,以支持覆盖在同一轴上的超过8个单独的绘图,并在两侧使用不同的比例 到目前为止,我有几个问题 一些Y标签在左侧,一些在右侧。2或3在两侧(并非全部)重复(错误)。它似乎是在右侧,覆盖了一个重复导致胡言乱语。一个标度包含绘制的数据数量 当应用程序停止时,黑色窗口(DOS提示窗口)不会消失。我有一个理论,即创建了两个“canvas”块,一个是通过调用创建实例创建的,使用一个调用创建canvas,另一个调用创建绘图区域(不称为canvas)。电话如下: 第

我一直在使用这段代码作为模型来修改一个应用程序,以支持覆盖在同一轴上的超过8个单独的绘图,并在两侧使用不同的比例

到目前为止,我有几个问题

  • 一些Y标签在左侧,一些在右侧。2或3在两侧(并非全部)重复(错误)。它似乎是在右侧,覆盖了一个重复导致胡言乱语。一个标度包含绘制的数据数量

  • 当应用程序停止时,黑色窗口(DOS提示窗口)不会消失。我有一个理论,即创建了两个“canvas”块,一个是通过调用创建实例创建的,使用一个调用创建canvas,另一个调用创建绘图区域(不称为canvas)。电话如下:

  • 第1组 第2组 设置1需要将
    self.myLOG\u PlotCanvas
    呈现给将图像(绘图区域画布)应用于面板(四个面板之一)的
    Sizer
    放置例程。在我开始画布上的其他绘图(2到8)之前,这一组效果非常好

    我找到了一个解决方案(集合2),它使用mpl工具包和AA来允许X轴的共享,并呈现2个以上的比例。通过更改代码以允许设置2,我注意到了问题。根据比例和颜色正确接受绘图。侧刻度看起来几乎不错(例外是右侧重复),我无法更改X轴标签和Y轴标签的字体大小。我可以使用SET1控制颜色和字体大小。集合2对更改角色属性没有响应。还有一些其他代码必须使用集合2所需的代码(但我没有在这里列出)。我个人认为这两个画布绘图区域并不相同,这也是应用程序不会死掉的原因之一(黑色DOS窗口徘徊)

    是否有更新的最新版本的matplotlib和mpl_工具包代码将例程连接到一个画布绘图区域?是否有一些代码可以满足我的要求(使用大小调整器等)来生成一个在每个选项卡上都有选项卡和绘图区域的应用程序?

    以下是我的问题解决方案(我在2013年发布)。在寻找答案和解决方案之后,我找到了几个代码片段,并将它们拼凑在一起,使它们成为一个“团队”。。。 省略一些设置代码以保持列出的代码简短。每个的数组 y轴是省略的部分之一

    代码片段如下所示:

    类子帧(wx.Frame): “”“子帧(2169行) Sub Frame类创建包含地物和画布的帧 用于将图像打印到。
    包含以下方法:

            BtnPlot      - button to invoke select a file to plot
            BtnClear     - button to clear canvas image
            BtnClose     - button to close instance of SubFrame_L
            BtnWordDoc   - button to Export image to Word Document file
            BtnPrint     - button to Export image to Word Document file & Print
            BtnClipboard - button to Export image to Clipboard
    
            DoPlot_SLIK_File   - select a file to plot, then transfers to canvas
            myLOG_DrawPlot     - processes file to plot data arrays.
            RePaintL_Canvas    - re-draws canvas after a canvas "clear" 
            Display_SLIK_Parms - displays Parameters read from file
            BtnClose_EVT       - event handler to clean up and close instance
            DblClick_EVT       - 
    """
    
        intDPI    = 100
        #
        fltFigX = 12.0
        fltFigY =  4.28
    
        self.myLOG_Fig = plt.figure(num=None, figsize=( fltFigX, fltFigY ), dpi=intDPI)
    
        self.myLOG_Fig.subplots_adjust(right=0.85)
    
        # New version of axes_grid1 with axisartist is recommended
        # host_subplot returns ax which is formed using plt.
        #
        # uses matplotlib.pyplot as plt
        #                               111 = rows,cols,subplot #
        self.x_AA_Axes_L = host_subplot(111, axes_class=AA.Axes)
        #
        self.x_AA_Axes_L.axis["top"].set_visible( True )
        self.x_AA_Axes_L.set_axis_bgcolor( 'white' )    
        self.x_AA_Axes_L.set_autoscale_on( False   )      # <<< ONLY False works
    
        # *** ++++++++++++++++++++++++++++++++++ Set X-AXIS for all Y-Scales
        self.x_AA_Axes_L.set_xlabel("Time (min)",  fontsize=8, color='red')
    
    
        # _________________________Offsets___________________________________
        # Y Label Axis offset from X-Axis
        right_Offset1 = 0                          # Temperature
        right_Offset2  =  right_Offset1 + 50       # Accelerometer
        right_Offset3  =  right_Offset2 + 50       # 
    
        left_offset1   = 0                         # Motor/Batt Voltage
        left_offset2   = left_offset1 - 50         # Motor Amps
        left_offset3   = left_offset2 - 20         # TBD
        # _________________________Offsets___________________________________
    
    
        # *** INIT *** SLIKPAK ***
        # +++++++++++++++++++++++++++++ Battery Voltage  (green) [left @ 0)  #-50]
        self.x_AA_Axes_L.set_ylabel("Battery Voltage", fontsize=8, color='green')
        self.x_AA_Axes_L.set_ylim(ymin=0.0,ymax=40.0)
    
        # +++++++++++++++++++++++++++++ Motor Current     (red) [left @ 0]
        self.axes_1_L = self.x_AA_Axes_L.twinx()    # Use subplot Base axis
    
        self.newFixedAxis_1_L = self.axes_1_L.get_grid_helper().new_fixed_axis
    
    
        self.axes_1_L.axis["left"] = self.newFixedAxis_1_L(loc="left",
                                            axes=self.axes_1_L,
                                            offset=(left_offset2, 0))
    
        # axis is shared by Batt and Mot - left is displayed, right is off
        self.axes_1_L.axis["right"].set_visible( False )
    
        self.axes_1_L.set_ylabel("force (g)/Motor Current (amps)", fontsize=8, color='red')
        self.axes_1_L.set_ylim( ymin=0.0, ymax=10.0 )
    
        # +++++++++++++++++++++++++++++ Temperature  (blue)
        self.axes_2_L = self.x_AA_Axes_L.twinx()
    
        self.newFixedAxis_2_L = self.axes_2_L.get_grid_helper().new_fixed_axis
    
        self.axes_2_L.axis["right"] = self.newFixedAxis_2_L(loc="right",
                                            axes=self.axes_2_L,
                                            offset=(right_Offset1, 0))
    
        # right is displayed, left is off
        self.axes_2_L.set_ylabel("Temperature", fontsize=8, color='blue')
        self.axes_2_L.set_ylim(ymin=0.0,ymax=300.0) #, size=8) #,fontsize=8, color='green' )
    
    
    
        # +++++++++++++++++++++++++++++ Accelerometer
        self.axes_3_L = self.x_AA_Axes_L.twinx()    # Use subplot Base axis
    
        self.newFixedAxis_3 = self.axes_3_L.get_grid_helper().new_fixed_axis
    
        self.axes_3_L.axis["right"] = self.newFixedAxis_3(loc="right",
                                            axes=self.axes_3_L,
                                            offset=(right_Offset2, 0))
    
        self.axes_3_L.set_ylabel("force [X(g),Y(o),Z(m)]", fontsize=8, color='green')
        self.axes_3_L.set_ylim(ymin=0.0,ymax=10.0)
    
    
        self.myLOG_FigCanvas = FigCanvas( self, -1, self.myLOG_Fig )  
    
        # *** Add special action buttons - pan, zoom, etc
        #
        self.NavToolBar_L = NavigationToolbar( self.myLOG_FigCanvas )
        #
        self.NavToolBar_L.Realize()
    
        # Start Main Box (Verticle Box)
        self.vMainBoxSizer1 = wx.BoxSizer(wx.VERTICAL)
        # *** (v1) First, Add FigCanvas to Vertical Box
        self.vMainBoxSizer1.Add( self.myLOG_FigCanvas, proportion=1, border=5, \
                                        flag=wx.ALL | wx.EXPAND)
    
        # *** Start Horizontal Box
        self.hBoxSizer = wx.BoxSizer(wx.HORIZONTAL)
        # *** (h1) Add Navigation Tool along with buttons to hBoxSizer (horizontal Box)
        self.hBoxSizer.Add( self.NavToolBar_L, proportion=0, border=2, flag=wx.ALL)
    
        self.btnPlot  = wx.Button( self, wx.NewId(), "Plot"  )
        self.btnClear = wx.Button( self, wx.NewId(), "Clear" )
        self.btnClose = wx.Button( self, wx.NewId(), "Close" )
    
        self.btnWordDoc   = wx.Button( self, wx.NewId(), "WordDoc" )
        self.btnPrint     = wx.Button( self, wx.NewId(), "Print" )
        self.btnClipboard = wx.Button( self, wx.NewId(), "Clipboard" )
    
        # *** (h2) Now, Add buttons to hBoxSizer (horizontal Box)
        self.hBoxSizer.Add( self.btnPlot,      proportion=0, border=2, flag=wx.ALL)
        self.hBoxSizer.Add( self.btnClear,     proportion=0, border=2, flag=wx.ALL)
        self.hBoxSizer.Add( self.btnClose,     proportion=0, border=2, flag=wx.ALL)
        self.hBoxSizer.Add( self.btnWordDoc,   proportion=0, border=2, flag=wx.ALL)
        self.hBoxSizer.Add( self.btnPrint,     proportion=0, border=2, flag=wx.ALL)
        self.hBoxSizer.Add( self.btnClipboard, proportion=0, border=2, flag=wx.ALL)
    
        # *** (v2) Add self.hBoxSizer to Verticla Box
        self.vMainBoxSizer1.Add( self.hBoxSizer )
        # *** Finalize self.vMainBoxSizer1
        self.SetSizer( self.vMainBoxSizer1 )
    
        # **** BIND Buttons to Handlers
        # This Canvas supports double-click to open another canvas window
        self.myLOG_FigCanvas.Bind( wx.EVT_LEFT_DCLICK, self.DblClick_L_EVT )
    
        self.btnPlot.Bind(  wx.EVT_BUTTON, self.BtnPlot_L_EVT  )
        self.btnPlot.Enable( True )
        self.btnClear.Bind( wx.EVT_BUTTON, self.BtnClearPlot_L_EVT )
        self.btnClear.Enable( False )
        # *** connect to "Close Button"
        self.btnClose.Bind( wx.EVT_BUTTON, self.BtnClose_L_EVT )
        # *** Also connect to "EXIT Button" Strip
        self.Bind(wx.EVT_CLOSE, self.BtnClose_L_EVT)
        self.btnWordDoc.Bind(  wx.EVT_BUTTON, self.BtnWordDoc_L_EVT )
        self.btnWordDoc.Enable( False )
        self.btnPrint.Bind( wx.EVT_BUTTON, self.BtnPrint_L_EVT )
        self.btnPrint.Enable( False )
        self.btnClipboard.Bind( wx.EVT_BUTTON, self.BtnClipboard_L_EVT )
        self.btnClipboard.Enable( False )
    
        self.Layout()
    
    BtnPlot-调用选择要打印的文件的按钮
    BtnClear-清除画布图像的按钮
    BtnClose-关闭子帧实例的按钮
    BtnWordDoc-将图像导出到Word文档文件的按钮
    BtnPrint-将图像导出到Word文档文件并打印的按钮
    BtnClipboard-将图像导出到剪贴板的按钮
    DoPlot_SLIK_文件-选择要打印的文件,然后传输到画布
    myLOG_DrawPlot-处理文件以打印数据数组。
    重新绘制画布-在画布“清除”后重新绘制画布
    Display_SLIK_Parms-显示从文件读取的参数
    BtnClose_EVT-用于清理和关闭实例的事件处理程序
    DblClick_EVT-
    """
    intDPI=100
    #
    fltFigX=12.0
    fltFigY=4.28
    self.myLOG\u Fig=plt.figure(num=None,figsize=(fltFigX,fltFigY),dpi=intDPI)
    self.myLOG图子批次调整(右=0.85)
    #建议使用带有AxisArtister的Axis_grid1的新版本
    #host_子批返回使用plt形成的ax。
    #
    #使用matplotlib.pyplot作为plt
    #111=行、列、子批#
    self.x_AA_Axes_L=host_子批(111,Axes_class=AA.Axes)
    #
    self.x_AA_轴\u L轴[“顶部”]。设置为可见(真)
    self.x\u AA\u Axes\u L.set\u axis\u bgcolor(‘白色’)
    
    self.x_AA_Axes_L.set_autoscale_on(False)#嗨,韦斯,至少我不清楚(从其他人缺乏答案来看)如何回答这里的无数问题和评论。尝试详细说明您遇到的具体问题,如果可能,提供一些代码来再现错误或图像。这样做可以解决一些问题。我可以提出的一个意见是,对于单个绘图,每个轴上的标签不应超过2个(并且仅当使用双轴时)。要区分情节,请使用图例.Wes,我建议将这个问题分成一组问题,每个问题都解决了您的一个问题。请确保包含您正在使用的确切代码(如果它是可复制和粘贴的,这样人们就可以测试您的代码,那就更好了!),以及它正在做什么和您希望它做什么的描述。到目前为止,我已经发现了退出挂起的问题。所以,一下来…我是新手,不知道如何回应你的意见。给我一个提示……我可以整天点击评论按钮,但我想我应该点击其他东西来回复你。
    self.myLOG_HostAxes = host_subplot(111, axes_class=AA.Axes)
    
            BtnPlot      - button to invoke select a file to plot
            BtnClear     - button to clear canvas image
            BtnClose     - button to close instance of SubFrame_L
            BtnWordDoc   - button to Export image to Word Document file
            BtnPrint     - button to Export image to Word Document file & Print
            BtnClipboard - button to Export image to Clipboard
    
            DoPlot_SLIK_File   - select a file to plot, then transfers to canvas
            myLOG_DrawPlot     - processes file to plot data arrays.
            RePaintL_Canvas    - re-draws canvas after a canvas "clear" 
            Display_SLIK_Parms - displays Parameters read from file
            BtnClose_EVT       - event handler to clean up and close instance
            DblClick_EVT       - 
    """
    
        intDPI    = 100
        #
        fltFigX = 12.0
        fltFigY =  4.28
    
        self.myLOG_Fig = plt.figure(num=None, figsize=( fltFigX, fltFigY ), dpi=intDPI)
    
        self.myLOG_Fig.subplots_adjust(right=0.85)
    
        # New version of axes_grid1 with axisartist is recommended
        # host_subplot returns ax which is formed using plt.
        #
        # uses matplotlib.pyplot as plt
        #                               111 = rows,cols,subplot #
        self.x_AA_Axes_L = host_subplot(111, axes_class=AA.Axes)
        #
        self.x_AA_Axes_L.axis["top"].set_visible( True )
        self.x_AA_Axes_L.set_axis_bgcolor( 'white' )    
        self.x_AA_Axes_L.set_autoscale_on( False   )      # <<< ONLY False works
    
        # *** ++++++++++++++++++++++++++++++++++ Set X-AXIS for all Y-Scales
        self.x_AA_Axes_L.set_xlabel("Time (min)",  fontsize=8, color='red')
    
    
        # _________________________Offsets___________________________________
        # Y Label Axis offset from X-Axis
        right_Offset1 = 0                          # Temperature
        right_Offset2  =  right_Offset1 + 50       # Accelerometer
        right_Offset3  =  right_Offset2 + 50       # 
    
        left_offset1   = 0                         # Motor/Batt Voltage
        left_offset2   = left_offset1 - 50         # Motor Amps
        left_offset3   = left_offset2 - 20         # TBD
        # _________________________Offsets___________________________________
    
    
        # *** INIT *** SLIKPAK ***
        # +++++++++++++++++++++++++++++ Battery Voltage  (green) [left @ 0)  #-50]
        self.x_AA_Axes_L.set_ylabel("Battery Voltage", fontsize=8, color='green')
        self.x_AA_Axes_L.set_ylim(ymin=0.0,ymax=40.0)
    
        # +++++++++++++++++++++++++++++ Motor Current     (red) [left @ 0]
        self.axes_1_L = self.x_AA_Axes_L.twinx()    # Use subplot Base axis
    
        self.newFixedAxis_1_L = self.axes_1_L.get_grid_helper().new_fixed_axis
    
    
        self.axes_1_L.axis["left"] = self.newFixedAxis_1_L(loc="left",
                                            axes=self.axes_1_L,
                                            offset=(left_offset2, 0))
    
        # axis is shared by Batt and Mot - left is displayed, right is off
        self.axes_1_L.axis["right"].set_visible( False )
    
        self.axes_1_L.set_ylabel("force (g)/Motor Current (amps)", fontsize=8, color='red')
        self.axes_1_L.set_ylim( ymin=0.0, ymax=10.0 )
    
        # +++++++++++++++++++++++++++++ Temperature  (blue)
        self.axes_2_L = self.x_AA_Axes_L.twinx()
    
        self.newFixedAxis_2_L = self.axes_2_L.get_grid_helper().new_fixed_axis
    
        self.axes_2_L.axis["right"] = self.newFixedAxis_2_L(loc="right",
                                            axes=self.axes_2_L,
                                            offset=(right_Offset1, 0))
    
        # right is displayed, left is off
        self.axes_2_L.set_ylabel("Temperature", fontsize=8, color='blue')
        self.axes_2_L.set_ylim(ymin=0.0,ymax=300.0) #, size=8) #,fontsize=8, color='green' )
    
    
    
        # +++++++++++++++++++++++++++++ Accelerometer
        self.axes_3_L = self.x_AA_Axes_L.twinx()    # Use subplot Base axis
    
        self.newFixedAxis_3 = self.axes_3_L.get_grid_helper().new_fixed_axis
    
        self.axes_3_L.axis["right"] = self.newFixedAxis_3(loc="right",
                                            axes=self.axes_3_L,
                                            offset=(right_Offset2, 0))
    
        self.axes_3_L.set_ylabel("force [X(g),Y(o),Z(m)]", fontsize=8, color='green')
        self.axes_3_L.set_ylim(ymin=0.0,ymax=10.0)
    
    
        self.myLOG_FigCanvas = FigCanvas( self, -1, self.myLOG_Fig )  
    
        # *** Add special action buttons - pan, zoom, etc
        #
        self.NavToolBar_L = NavigationToolbar( self.myLOG_FigCanvas )
        #
        self.NavToolBar_L.Realize()
    
        # Start Main Box (Verticle Box)
        self.vMainBoxSizer1 = wx.BoxSizer(wx.VERTICAL)
        # *** (v1) First, Add FigCanvas to Vertical Box
        self.vMainBoxSizer1.Add( self.myLOG_FigCanvas, proportion=1, border=5, \
                                        flag=wx.ALL | wx.EXPAND)
    
        # *** Start Horizontal Box
        self.hBoxSizer = wx.BoxSizer(wx.HORIZONTAL)
        # *** (h1) Add Navigation Tool along with buttons to hBoxSizer (horizontal Box)
        self.hBoxSizer.Add( self.NavToolBar_L, proportion=0, border=2, flag=wx.ALL)
    
        self.btnPlot  = wx.Button( self, wx.NewId(), "Plot"  )
        self.btnClear = wx.Button( self, wx.NewId(), "Clear" )
        self.btnClose = wx.Button( self, wx.NewId(), "Close" )
    
        self.btnWordDoc   = wx.Button( self, wx.NewId(), "WordDoc" )
        self.btnPrint     = wx.Button( self, wx.NewId(), "Print" )
        self.btnClipboard = wx.Button( self, wx.NewId(), "Clipboard" )
    
        # *** (h2) Now, Add buttons to hBoxSizer (horizontal Box)
        self.hBoxSizer.Add( self.btnPlot,      proportion=0, border=2, flag=wx.ALL)
        self.hBoxSizer.Add( self.btnClear,     proportion=0, border=2, flag=wx.ALL)
        self.hBoxSizer.Add( self.btnClose,     proportion=0, border=2, flag=wx.ALL)
        self.hBoxSizer.Add( self.btnWordDoc,   proportion=0, border=2, flag=wx.ALL)
        self.hBoxSizer.Add( self.btnPrint,     proportion=0, border=2, flag=wx.ALL)
        self.hBoxSizer.Add( self.btnClipboard, proportion=0, border=2, flag=wx.ALL)
    
        # *** (v2) Add self.hBoxSizer to Verticla Box
        self.vMainBoxSizer1.Add( self.hBoxSizer )
        # *** Finalize self.vMainBoxSizer1
        self.SetSizer( self.vMainBoxSizer1 )
    
        # **** BIND Buttons to Handlers
        # This Canvas supports double-click to open another canvas window
        self.myLOG_FigCanvas.Bind( wx.EVT_LEFT_DCLICK, self.DblClick_L_EVT )
    
        self.btnPlot.Bind(  wx.EVT_BUTTON, self.BtnPlot_L_EVT  )
        self.btnPlot.Enable( True )
        self.btnClear.Bind( wx.EVT_BUTTON, self.BtnClearPlot_L_EVT )
        self.btnClear.Enable( False )
        # *** connect to "Close Button"
        self.btnClose.Bind( wx.EVT_BUTTON, self.BtnClose_L_EVT )
        # *** Also connect to "EXIT Button" Strip
        self.Bind(wx.EVT_CLOSE, self.BtnClose_L_EVT)
        self.btnWordDoc.Bind(  wx.EVT_BUTTON, self.BtnWordDoc_L_EVT )
        self.btnWordDoc.Enable( False )
        self.btnPrint.Bind( wx.EVT_BUTTON, self.BtnPrint_L_EVT )
        self.btnPrint.Enable( False )
        self.btnClipboard.Bind( wx.EVT_BUTTON, self.BtnClipboard_L_EVT )
        self.btnClipboard.Enable( False )
    
        self.Layout()
    
        try:
            # *** Battery Voltage (30 Volts) (green)
            # Number of Time entries must match number of VBatt entries
            self.x_AA_Axes_L.plot( self.fltArray_Time_L,
                                    self.fltArray_VBatt_L, 
                    linewidth=1, color=('green'))[0]       # [0] required !!!
        except:
            pass
        #
        try:
            # *** Phase               (1-4) [0-10](black)
            # Number of Time entries must match number of Phase entries
            self.axes_1_L.plot( self.fltArray_Time_L,
                                self.fltArray_Phase_L, linewidth=1,
                                color=('black'))[0]            # [0] required !!!
        except:
            pass
        #
        try:
            # *** BrushLess Motor Amps (3 Amps) [0-10](red)
            # Number of Time entries must match number of BrLsAmps entries
            self.axes_1_L.plot( self.fltArray_Time_L,
                                self.fltArray_BrLsAmps_L, linewidth=1,
                                color=('red'))[0]            # [0] required !!!
        except:
            pass
        #
        #
        try:
            # *** Temperature (72 degrees) (blue)
            # Number of Time entries must match number of Temp entries
            self.axes_2_L.plot( self.fltArray_Time_L,
                                self.fltArray_Temp_L, 
                    linewidth=1, color=('blue'))[0]       # [0] required !!!
        except:
            pass
        #
        #
        #
        try:
            # *** Gx  Accelerometer    (g force)(0-10) (orange)      <<<<<<<<<<<<<<<< ORANGE
            #
            self.axes_3_L.plot( self.fltArray_Time_L,
                                self.fltArray_AccX_L, linewidth=1,
                                color=('orange'))[0]          # [0] required !!!
        except:
            pass
        #
        try:
            # *** Gy  Accelerometer    (g force)(0-10) (green)
            #
            self.axes_3_L.plot( self.fltArray_Time_L,
                                self.fltArray_AccY_L, linewidth=1,
                                color=('green'))[0]          # [0] required !!!
        except:
            pass
        #
        #
        try:
            # *** Gz  Accelerometer    (g force)(0-10) (magenta)
            #
            self.axes_3_L.plot( self.fltArray_Time_L,
                                self.fltArray_AccZ_L, linewidth=1,
                                color=('magenta'))[0]          # [0] required !!!
        except:
            pass