带wx的Matplotlib双绞线
我正在构建一个使用matplotlib绘制一些数据的WXPYTHON应用程序.我通过创建多个反复调用来嵌入数字中的几个轴
ax1 = add_axes([0.1,0.7,0.8,0.2],** axprops)
其中axprops是一个dict().这样,图可以共享X轴.但是,我想让一个剧情有两组信息.我熟悉Two_scales.py示例,但是在WX应用程序中似乎不起作用.只有原始图才能成功并格式化左轴,而右轴上没有显示任何内容. WX中不支持Twinx()吗?
-pjmp
# 回答1
进口塔
ax2 = pylab.twinx()
进口塔
ax2 = pylab.twinx()
# 回答2
谢谢Hattawayd,提供了非常有用的信息.
我希望你坚持
巴顿
谢谢Hattawayd,提供了非常有用的信息.
我希望你坚持
巴顿
# 回答3
我正在尝试完成同样的事情,但没有运气...这是我的代码:
我正在尝试完成同样的事情,但没有运气...这是我的代码:
选择 | 换行 | 行号
- class CanvasFrame(wx.Panel):
- def __init__(self, parent):
- wx.Panel.__init__(self, parent, -1)
- self.SetBackgroundColour(wx.NamedColor("WHITE"))
- self.figure = Figure()
- self.ax1 = self.figure.add_subplot(111)
- t = arange(0.0,3.0,0.01)
- s = sin(2*pi*t)
- self.ax1.plot(t,s)
- self.ax1.set_xlabel('t')
- self.ax1.set_ylabel('sin(t)')
- self.ax2 = pylab.twinx()
- s2 = pylab.exp(t)
- self.ax2.plot(t, s2, 'r.')
- self.ax2.set_ylabel('exp(t)')
- self.ax2.yaxis.tick_right()
- self.figure_canvas = FigureCanvas(self, -1, self.figure)
- # Note that event is a MplEvent
- self.figure_canvas.mpl_connect('motion_notify_event', self.UpdateStatusBar)
- self.figure_canvas.Bind(wx.EVT_ENTER_WINDOW, self.ChangeCursor)
- self.sizer = wx.BoxSizer(wx.VERTICAL)
- self.sizer.Add(self.figure_canvas, 1, wx.LEFT | wx.TOP | wx.GROW)
- self.SetSizer(self.sizer)
- self.Fit()
- self.toolbar = NavigationToolbar2Wx(self.figure_canvas)
- self.sizer.Add(self.toolbar, 0, wx.LEFT | wx.EXPAND)
- self.toolbar.Show()
这是在WX.Frame中显示的,但是它仅显示第一个轴(Sin Wave One),而第二个轴则没有.我假设我的问题是我并没有将第二轴与该图关联,但是与令人恐惧的Matplotlib API/文档相关,我完全丢失了如何做到这一点.
# 回答4
我无法弄清楚,这只是在杀死我!
我尝试使用pylab的show()方法,如两个_Scales示例中的示例,一个窗口弹出,两个y轴都正确显示,但是随后我关闭了该窗口,并且我的实际应用程序仅使用一个y轴出现.这是我的代码.
代码:( Python)
我无法弄清楚,这只是在杀死我!
我尝试使用pylab的show()方法,如两个_Scales示例中的示例,一个窗口弹出,两个y轴都正确显示,但是随后我关闭了该窗口,并且我的实际应用程序仅使用一个y轴出现.这是我的代码.
代码:( Python)
选择 | 换行 | 行号
- class CanvasFrame(wx.Panel):
- def __init__(self, parent):
- wx.Panel.__init__(self, parent, -1)
- self.SetBackgroundColour(wx.NamedColor("WHITE"))
- self.time_range = 100.0
- self.time_div = 0.5
- self.curr_time = 0.0
- self.y = [0.0]
- self.x = [0.0]
- self.tv = track_vars(self)
- self.sizer = wx.BoxSizer(wx.VERTICAL)
- self.sizer.Add(self.tv.canvas, 1, wx.LEFT | wx.TOP | wx.GROW)
- self.SetSizer(self.sizer)
- self.Fit()
- self.toolbar = NavigationToolbar2Wx(self.tv.canvas)
- self.sizer.Add(self.toolbar, 0, wx.LEFT | wx.EXPAND)
- self.toolbar.Show()
- class MainWindow(wx.Frame):
- def __init__(self, *args, **kwargs):
- wx.Frame.__init__(self, *args, **kwargs)
- icon = wx.Icon(name = 'rDT.ico', type = wx.BITMAP_TYPE_ICO)
- self.Bind(wx.EVT_CLOSE, self.OnExit)
- self.SetIcon(icon)
- self.ds = None
- # Set-up a Status Bar divided into two fields
- self.sb = self.CreateStatusBar(2)
- # Set up splitter window
- self.splitwin = SplitterWindow(self)
- # Set up the texual dataviewer for the left pane
- self.lc = CheckListCtrl(self.splitwin)
- self.lc.InsertColumn(0, "Variable Name")
- self.lc.InsertColumn(1, "Value")
- self.currentItem = 0
- self.Bind(wx.EVT_LIST_ITEM_SELECTED, self.OnItemSelected, self.lc)
- # Set up the visual dataviewer for the right pane
- self.graph = CanvasFrame(self.splitwin)
- # Now we build our menus
- menu = self.MakeMenu()
- self.SetMenuBar(menu)
- # Now initialize the split window for program start-up appearance
- self.splitwin.SetMinimumPaneSize(275)
- self.splitwin.SplitVertically(self.lc, self.graph, 275)
- # Setup our Heartbeat and Collection timers
- Global.heartbeat_timer_id = wx.NewId()
- Global.collection_timer_id = wx.NewId()
- Global.heartbeat_timer = wx.Timer(self, Global.heartbeat_timer_id)
- Global.collection_timer = wx.Timer(self, Global.collection_timer_id)
- wx.EVT_TIMER(self, Global.heartbeat_timer_id, self.OnHeartbeat)
- wx.EVT_TIMER(self, Global.collection_timer_id, self.OnCollection)
- return None
- class track_vars:
- def __init__(self, parent):
- self.figure = Figure()
- self.ax = self.figure.add_subplot(111)
- self.ax.set_xlabel('Time')
- self.ax.set_ylabel('Testing data collection')
- self.ax2 = pylab.twinx()
- self.ax2.set_ylabel('Second y-axis')
- self.ax2.yaxis.tick_right()
- pylab.show()
- self.canvas = FigureCanvas(parent, -1, self.figure)
有谁知道为什么在WXPYTHON应用程序中不起作用?任何人?任何人? Bueller?... Bueller?
# 回答5
好吧,好吧,我终于弄清楚了……对于那些将来试图完成类似的事情的可怜灵魂,我基本上必须手动做到这一点(有点像杰里 - 里格)和废料twinx.这是我的代码:
好吧,好吧,我终于弄清楚了……对于那些将来试图完成类似的事情的可怜灵魂,我基本上必须手动做到这一点(有点像杰里 - 里格)和废料twinx.这是我的代码:
选择 | 换行 | 行号
- import matplotlib
- from matplotlib.figure import Figure
- from matplotlib.backends.backend_wxagg import FigureCanvasWxAgg as FigureCanvas
- ...
- self.figure = Figure()
- self.ax1 = self.figure.add_subplot(111)
- self.ax1.set_ylabel('Value')
- self.ax1.yaxis.tick_left() # w/o this the ticks were echoed on right side
- self.ax2 = self.figure.add_subplot(111, sharex=self.ax1, frameon=False)
- self.ax2.set_xlabel('Samples')
- self.ax2.yaxis.tick_right()
- self.canvas = FigureCanvas(parent, -1, self.figure)
- self.canvas.realize()
- self.canvas.draw()
我知道,这很简单,对我来说应该更为明显,但是哦.我没有理会的一件事是弄清楚如何将Ylabel放置在AX2的图形右侧,因为使用AX.SET_YLABEL将其放在AX1标签下方.
如果有人有任何建议,我会感谢他们,但是我并不真正担心将标签放在右侧,因为它是相当多余的.
# 回答6
是否有人可以解决第二个Ylabel位置的问题?我的数据使我确实需要两个不同的标签,但是到目前为止,我所有的尝试都失败了.
谢谢!
问候,
乔格斯!
是否有人可以解决第二个Ylabel位置的问题?我的数据使我确实需要两个不同的标签,但是到目前为止,我所有的尝试都失败了.
谢谢!
问候,
乔格斯!
标签: python