【问题标题】:matplotlib animation in wxpython panelwxpython面板中的matplotlib动画
【发布时间】:2015-10-26 10:13:54
【问题描述】:

我正在努力开发一个结合 wxPython 和 matplotlib 的应用程序。

我想在 wxPanel 中嵌入一个动画 matplotlib 对象。数据应在运行时添加。

我的模块代码:

(我无法获得正确的格式,请参阅http://pastebin.com/PU5QFEzG

'''
a panel to display a given set of data in a wxframe as a heatmap, using pcolor
from the matplotlib

@author: me
'''
import wx
import matplotlib.pyplot as plt
import matplotlib.animation as animation
from matplotlib.backends.backend_wxagg import FigureCanvasWxAgg as FigureCanvas #todo: OW 26.10.15 needed?

class plotPanel(wx.Panel):
    def __init__(self, parent):
        wx.Panel.__init__(self, parent)
        self.figure = plt.Figure()
        self.subplot = self.figure.add_subplot(111)
        plt.title('test')
        self.canvas = FigureCanvas(self, -1, self.figure)  #ToDo: OW 26.10.15 Verstehen
        self.sizer = wx.BoxSizer(wx.VERTICAL)
        self.sizer.Add(self.canvas, 1, wx.LEFT | wx.TOP | wx.GROW)
        self.SetSizer(self.sizer)
        self.Fit()
        self.dataSet = []
        self.animator = animation.FuncAnimation(self.figure,self.anim, interval=1000)

    def anim(self, a):
        if(len(self.dataSet) == 0):
            return 0
        i = a % len(self.dataSet)
        obj = self.subplot.pcolor(self.dataSet[i], cmap='RdBu')
        return obj

    def add_data(self, data):
        self.dataSet.append(data)


#
#    Code for a standalone test run
#
class TestFrame(wx.Frame):
    def __init__(self,parent,title):
        wx.Frame.__init__(self,parent,title=title,size=(1000,1000))
        self.statusbar = self.CreateStatusBar()
        self.statusbar.SetStatusText('Status Bar')


if __name__ == '__main__':
    from numpy.random import rand #todo: OW 26.10.15 remove
    app = wx.App(redirect=False)
    frame = TestFrame(None, 'Debug Frame')
    panel = plotPanel(frame)
    frame.Show()
    C = rand(10,10)
    panel.add_data(C)
    C = rand(10,10)
    panel.add_data(C)
    C = rand(10,10)
    panel.add_data(C)
    app.MainLoop()

我现在正在努力向图表添加更多详细信息,例如颜色条或标题。

如果我在 anim_Fkt 中添加 self.subplot.title = 'test',我会得到“'str' object has no attribute 'get_animated'”。如果我尝试plt.title('test'),它没有效果。 添加标题、颜色条或图例的正确方法是什么?

【问题讨论】:

    标签: python matplotlib wxpython wxwidgets


    【解决方案1】:

    要将功能添加到嵌入式 matplotlib 图形,您必须使用面向对象的 matplotlib API。 matplotlib 图由一个图形(matplotlib.figure.Figure 实例)组成,其中有一个或多个轴(matplotlib.axes.Axes 实例)。它们中的每一个又包含Drawables(线、图像、散点图等)。

    可以使用 setter 方法将标题添加(或修改)到 Figure 或每个 Axes,例如 Figure.suptitleAxes.set_title(或者,在您的情况下,self.figure.suptitle()self.subplot.set_title )。

    颜色条有点棘手,因为它需要创建一个数据对象(可映射):我们只能在 anim 函数中创建它。另外,我不想创建很多 colorbar 实例;一旦创建,我们只需要更新它。实现这一点很容易:在构造函数中用None 实例化self.colorbar,然后在动画函数中与None 进行检查:如果是None,则创建颜色条,如果不是,则更新它:

    class plotPanel(wx.Panel):
        def __init__(self, parent):
            ...
            self.colorbar = None
    
        def anim(self, a):
            ...
            self.subplot.set_title("Frame %i" % a)
            if self.colorbar is None:
                self.colorbar = self.figure.colorbar(obj)
            else:
                self.colorbar.update_normal(obj)
            self.colorbar.update_normal(obj)
            return obj
    

    【讨论】:

    • 谢谢,在此期间我通过许多尝试和错误循环解决了它:我对名称感到困惑(为什么我使用add_SUBPLOT 来添加称为axes 的东西?)。我在axes-documentation 中找到了set_title(这与axis 不同,非英语母语读者会感到困惑)。我还找到了update_normal(),只要你不改变vmin/vmaxpcolor/pcolormesh,它就可以工作。如果您更改范围或颜色集,则需要update_bruteforce() 使其更新颜色条。但是感谢您的帮助,将其标记为解决方案:)
    猜你喜欢
    • 2017-03-31
    • 1970-01-01
    • 2012-05-31
    • 1970-01-01
    • 2015-03-08
    • 1970-01-01
    • 2014-02-28
    • 2014-02-18
    相关资源
    最近更新 更多