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