带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()
# 回答2


谢谢Hattawayd,提供了非常有用的信息.
我希望你坚持
巴顿
# 回答3


我正在尝试完成同样的事情,但没有运气...这是我的代码:

选择 | 换行 | 行号
  1. class CanvasFrame(wx.Panel):
  2.  
  3.     def __init__(self, parent):
  4.         wx.Panel.__init__(self, parent, -1)
  5.  
  6.         self.SetBackgroundColour(wx.NamedColor("WHITE"))
  7.  
  8.         self.figure = Figure()
  9.         self.ax1 = self.figure.add_subplot(111)
  10.         t = arange(0.0,3.0,0.01)
  11.         s = sin(2*pi*t)
  12.  
  13.         self.ax1.plot(t,s)
  14.         self.ax1.set_xlabel('t')
  15.         self.ax1.set_ylabel('sin(t)')
  16.  
  17.         self.ax2 = pylab.twinx()
  18.         s2 = pylab.exp(t)
  19.  
  20.         self.ax2.plot(t, s2, 'r.')
  21.         self.ax2.set_ylabel('exp(t)')
  22.         self.ax2.yaxis.tick_right()
  23.  
  24.         self.figure_canvas = FigureCanvas(self, -1, self.figure)
  25.  
  26.         # Note that event is a MplEvent
  27.         self.figure_canvas.mpl_connect('motion_notify_event', self.UpdateStatusBar)
  28.         self.figure_canvas.Bind(wx.EVT_ENTER_WINDOW, self.ChangeCursor)
  29.  
  30.         self.sizer = wx.BoxSizer(wx.VERTICAL)
  31.         self.sizer.Add(self.figure_canvas, 1, wx.LEFT | wx.TOP | wx.GROW)
  32.         self.SetSizer(self.sizer)
  33.         self.Fit()
  34.  
  35.         self.toolbar = NavigationToolbar2Wx(self.figure_canvas)
  36.         self.sizer.Add(self.toolbar, 0, wx.LEFT | wx.EXPAND)
  37.         self.toolbar.Show()

这是在WX.Frame中显示的,但是它仅显示第一个轴(Sin Wave One),而第二个轴则没有.我假设我的问题是我并没有将第二轴与该图关联,但是与令人恐惧的Matplotlib API/文档相关,我完全丢失了如何做到这一点.

# 回答4


我无法弄清楚,这只是在杀死我!
我尝试使用pylab的show()方法,如两个_Scales示例中的示例,一个窗口弹出,两个y轴都正确显示,但是随后我关闭了该窗口,并且我的实际应用程序仅使用一个y轴出现.这是我的代码.
代码:( Python)

选择 | 换行 | 行号
  1. class CanvasFrame(wx.Panel):
  2.     def __init__(self, parent):
  3.         wx.Panel.__init__(self, parent, -1)
  4.  
  5.         self.SetBackgroundColour(wx.NamedColor("WHITE"))
  6.  
  7.         self.time_range = 100.0
  8.         self.time_div = 0.5
  9.         self.curr_time = 0.0
  10.         self.y = [0.0]
  11.         self.x = [0.0]
  12.  
  13.         self.tv = track_vars(self)
  14.  
  15.         self.sizer = wx.BoxSizer(wx.VERTICAL)
  16.         self.sizer.Add(self.tv.canvas, 1, wx.LEFT | wx.TOP | wx.GROW)
  17.         self.SetSizer(self.sizer)
  18.         self.Fit()
  19.  
  20.         self.toolbar = NavigationToolbar2Wx(self.tv.canvas)
  21.         self.sizer.Add(self.toolbar, 0, wx.LEFT | wx.EXPAND)
  22.         self.toolbar.Show()
  23.  
  24. class MainWindow(wx.Frame):
  25.     def __init__(self, *args, **kwargs):
  26.         wx.Frame.__init__(self, *args, **kwargs)
  27.  
  28.         icon = wx.Icon(name = 'rDT.ico', type = wx.BITMAP_TYPE_ICO)
  29.         self.Bind(wx.EVT_CLOSE, self.OnExit)
  30.         self.SetIcon(icon)
  31.         self.ds = None
  32.  
  33.         # Set-up a Status Bar divided into two fields
  34.         self.sb = self.CreateStatusBar(2)
  35.  
  36.         # Set up splitter window
  37.         self.splitwin = SplitterWindow(self)
  38.  
  39.         # Set up the texual dataviewer for the left pane
  40.         self.lc = CheckListCtrl(self.splitwin)
  41.         self.lc.InsertColumn(0, "Variable Name")
  42.         self.lc.InsertColumn(1, "Value")
  43.         self.currentItem = 0
  44.         self.Bind(wx.EVT_LIST_ITEM_SELECTED, self.OnItemSelected, self.lc)
  45.  
  46.         # Set up the visual dataviewer for the right pane
  47.         self.graph = CanvasFrame(self.splitwin)
  48.  
  49.         # Now we build our menus
  50.         menu = self.MakeMenu()
  51.         self.SetMenuBar(menu)
  52.  
  53.         # Now initialize the split window for program start-up appearance
  54.         self.splitwin.SetMinimumPaneSize(275)
  55.         self.splitwin.SplitVertically(self.lc, self.graph, 275)
  56.  
  57.         # Setup our Heartbeat and Collection timers
  58.         Global.heartbeat_timer_id = wx.NewId()
  59.         Global.collection_timer_id = wx.NewId()
  60.         Global.heartbeat_timer = wx.Timer(self, Global.heartbeat_timer_id)
  61.         Global.collection_timer = wx.Timer(self, Global.collection_timer_id)
  62.         wx.EVT_TIMER(self, Global.heartbeat_timer_id, self.OnHeartbeat)
  63.         wx.EVT_TIMER(self, Global.collection_timer_id, self.OnCollection)
  64.  
  65.         return None
  66.  
  67. class track_vars:
  68.     def __init__(self, parent):
  69.         self.figure = Figure()
  70.         self.ax = self.figure.add_subplot(111)
  71.         self.ax.set_xlabel('Time')
  72.         self.ax.set_ylabel('Testing data collection')
  73.         self.ax2 = pylab.twinx()
  74.         self.ax2.set_ylabel('Second y-axis')
  75.         self.ax2.yaxis.tick_right()
  76.         pylab.show()
  77.         self.canvas = FigureCanvas(parent, -1, self.figure)

有谁知道为什么在WXPYTHON应用程序中不起作用?任何人?任何人? Bueller?... Bueller?

# 回答5


好吧,好吧,我终于弄清楚了……对于那些将来试图完成类似的事情的可怜灵魂,我基本上必须手动做到这一点(有点像杰里 - 里格)和废料twinx.这是我的代码:

选择 | 换行 | 行号
  1. import matplotlib
  2. from matplotlib.figure import Figure
  3. from matplotlib.backends.backend_wxagg import FigureCanvasWxAgg as FigureCanvas
  4. ...
  5.         self.figure = Figure()
  6.         self.ax1 = self.figure.add_subplot(111)
  7.         self.ax1.set_ylabel('Value')
  8.         self.ax1.yaxis.tick_left() # w/o this the ticks were echoed on right side
  9.         self.ax2 = self.figure.add_subplot(111, sharex=self.ax1, frameon=False)
  10.         self.ax2.set_xlabel('Samples')
  11.         self.ax2.yaxis.tick_right()
  12.         self.canvas = FigureCanvas(parent, -1, self.figure)
  13.         self.canvas.realize()
  14.         self.canvas.draw()
  15.  

我知道,这很简单,对我来说应该更为明显,但是哦.我没有理会的一件事是弄清楚如何将Ylabel放置在AX2的图形右侧,因为使用AX.SET_YLABEL将其放在AX1标签下方.
如果有人有任何建议,我会感谢他们,但是我并不真正担心将标签放在右侧,因为它是相当多余的.

# 回答6


是否有人可以解决第二个Ylabel位置的问题?我的数据使我确实需要两个不同的标签,但是到目前为止,我所有的尝试都失败了.
谢谢!
问候,
乔格斯!

标签: python

添加新评论