将网格子图添加到WxPython GUI(Matplotlib)

时间:2012-06-20 07:25:19

标签: python wxpython matplotlib subplot

我正在开发一种用于多侧超声波测距仪的简单演示GUI。设备捕获来自几个不同传感器的超声波信号,对这些信号执行飞行时间处理,然后使用检测到的目标的距离信息来定位2D笛卡尔坐标中的物体。

我想创建一个wxPython GUI,它使用matplotlib显示每个传感器信号并绘制目标位置。我发现了一些示例代码,它们具有与我想要的大致相同的布局,并删除了一些代码的不必要组件。 python代码如下:

import sys,os,csv
import numpy as N
import wx
import matplotlib
from matplotlib.figure import Figure
from matplotlib.backends.backend_wxagg import \
    FigureCanvasWxAgg as FigCanvas, \
    NavigationToolbar2WxAgg as NavigationToolbar
class FinalProject(wx.Frame):
    title = ' Ultrasound Demo '
    def __init__(self):
        wx.Frame.__init__(self, None, -1, self.title)
        self.create_menu()
        self.create_status_bar()
        self.create_main_panel()
    def create_menu(self):
        self.menubar = wx.MenuBar()
        menu_file = wx.Menu()
        m_expt = menu_file.Append(-1, "&Save plot\tCtrl-S", "Save plot to file")
        self.Bind(wx.EVT_MENU, self.on_save_plot, m_expt)
        menu_file.AppendSeparator()
        m_exit = menu_file.Append(-1, "E&xit\tCtrl-X", "Exit")
        self.Bind(wx.EVT_MENU, self.on_exit, m_exit)
        self.menubar.Append(menu_file, "&File")
        self.SetMenuBar(self.menubar)
    def create_main_panel(self):
        self.panel = wx.Panel(self)
        self.dpi = 100
        self.fig = Figure((9.5, 5.0), dpi=self.dpi)
        self.canvas = FigCanvas(self.panel, -1, self.fig)
#        self.axes1 = self.fig.add_subplot2grid((2,2), (0,0))
        self.axes1 = self.fig.add_subplot(2,1,1)
#        self.axes2 = self.fig.add_subplot2grid((2,2), (1,0))
        self.axes2 = self.fig.add_subplot(2,1,2)

        self.toolbar = NavigationToolbar(self.canvas)
        self.vbox = wx.BoxSizer(wx.VERTICAL)
        self.vbox.Add(self.canvas, 1, wx.LEFT | wx.TOP | wx.GROW)
        self.vbox.AddSpacer(10)
        self.hbox = wx.BoxSizer(wx.HORIZONTAL)
        flags = wx.ALIGN_LEFT | wx.ALL | wx.ALIGN_CENTER_VERTICAL
        self.panel.SetSizer(self.vbox)
        self.vbox.Fit(self)
    def create_status_bar(self):
        self.statusbar = self.CreateStatusBar()
    def on_draw_button1(self, event):
        self.axes1.clear()
        self.axes2.clear()
        i = N.arange(0,4,1)
        q = i
        w = N.arange(-4,0,1)
        self.axes1.plot(q,i,'red')
        self.axes2.plot(w,i,'yellow')
        self.canvas.draw()
    def on_draw_button2(self, event):
        self.axes1.clear()
        self.axes2.clear()
        a = [0,1,2,3,4,]
        b = [5.5,4.5,3.5,2.5,1.5]
        c = [7.5,2.5,4,6.8,10.6]
        self.axes1.plot(b,a,'purple')
        self.axes2.plot(c,a,'black')
        self.canvas.draw()
    def on_save_plot(self, event): 
        file_choices = "PNG (*.png)|*.png"
        dlg = wx.FileDialog(
            self, 
            message="Save plot as...",
            defaultDir=os.getcwd(),
            defaultFile="plot.png",
            wildcard=file_choices,
            style=wx.SAVE)

        if dlg.ShowModal() == wx.ID_OK:
            path = dlg.GetPath()
            self.canvas.print_figure(path, dpi=self.dpi)
            self.flash_status_message("Saved to %s" % path)

    def on_exit(self, event):
        self.Destroy()
if __name__ == '__main__':
    app = wx.PySimpleApp()
    app.frame = FinalProject()
    app.frame.Show()
    app.MainLoop()
    del app

因此,此代码对于显示两个捕获的信号非常有用,并且添加其他子图相对容易,只要它们存在于对称网格上,但我想要做的是在这些子图的右侧添加第三个子图。两块地块横跨两者的高度。

要清楚我想要做的是在现有图的右侧添加第三个子图,其高度等于当前画布高度。

通过matplotlib文档阅读,看起来执行此操作的相应函数将是plt.subplot2grid()。不幸的是,当我尝试使用此函数来定义当前的子图时,我会收到错误(我尝试使用的代码在下面被注释掉了:

self.axes1 = self.fig.add_subplot2grid((2,2), (0,0)))

有没有其他人尝试过这个?关于我可能出错的地方的任何想法?

谢谢!

1 个答案:

答案 0 :(得分:1)

听起来你已经找到了想做的事情。

明确地说,在这个例子中你没有使用WX python的事实 - 基本上问题归结为如何将轴添加到与其他两个轴具有相同高度的图形中

这可以通过以下方式完成:

import matplotlib.pyplot as plt
ax1 = plt.subplot(2, 2, 1)
ax2 = plt.subplot(2, 2, 3)
ax3 = plt.subplot(1, 2, 2)
plt.show()

HTH