gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 19:16:44 24 4
gpt4 key购买 nike

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

我想创建一个 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

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

为了清楚起见,我想做的是在现有图的右侧添加第三个子图,其高度等于当前 Canvas 高度。

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

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

还有其他人尝试过吗?关于我可能出错的地方有什么想法吗?

谢谢!

最佳答案

听起来你已经想出了一些办法来做你想做的事。

明确地说,您在本示例中使用 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

关于python - 将网格子图添加到 WxPython GUI (Matplotlib),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11114733/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com