5

我有一个matplotlib hexbin嵌入在GTK.Window图表中的一些数据(x,y)。我希望在plot收到新数据时更新(通过UDP)。不过我遇到了一些麻烦。

我可以让它以几种不同的方式工作,但没有一个是“有效的”(意思是重绘plot需要太长时间)。我在这里查看并尝试在建议的答案之后为我的 hexbin 建模,但根本无法让它工作。我不断收到以下错误:

TypeError: 'PolyCollection' object is not iterable.

我猜这hexbins不能以与 standard 相同的方式更新plots

示例代码:

class graph:
    def __init__(self):
        self.window = gtk.Window()
        self.figure = plt.figure()
        self.ax = self.figure.add_subplot(111)
        self.canvas = FigureCanvas(self.figure)
        self.window.add(self.canvas)

        self.graph = None

    def plot(self, xData, yData):
        if len(xData) > 1 and len(yData) > 1:
            self.graph, = self.ax.hexbin(self.xData, self.yData) 
            ###############################################
            ####This is where the code throws the error####

    def update(self, xData, yData):
        self.graph.set_xdata(np.append(self.graph.get_xdata(), xData))
        self.graph.set_ydata(np.append(self.graph.get_ydata(), yData))
        self.figure.canvas.draw()

代码是这样使用的:

graph = graph()
graph.plot(someXData, someYData)
# when new data is received
graph.update(newXData, newYData)

这只是我如何使用代码的一个非常小的例子。我没有太多经验,matplotlib所以我可能会完全错误地解决这个问题。(这很可能是我正在做的事情)

所以我最终的问题是 -你如何更新matplotlib hexbin情节?


编辑:感谢danodonovan的回答,我改变了我的代码并删除了','之后self.graph = self.ax.hexbin(...)

抛出的新错误是:AttributeError: 'PolyCollection' object has no attribute 'set_xdata'

4

3 回答 3

2

该行:

 self.graph, = self.ax.hexbin(self.xData, self.yData)

(如果那是您的堆栈跟踪抛出异常的地方)将是因为逗号,暗示这self.ax.hexbin是一个可迭代的对象。更改为

 self.graph = self.ax.hexbin(self.xData, self.yData)

可能会停止TypeError exception. 下一次,在堆栈跟踪中再提供几行 - 这可能有助于澄清事情。

于 2013-02-06T17:16:43.570 回答
2

我认为目前无法做到这一点,hexbin转换 x,y 列表 -> 多边形集合。这polyCollection只是一个顶点、边和面颜色的列表,我认为它不包含任何关于它是如何生成的语义信息。

最好的方法是核对旧的hexbin并用新的替换它。

如果您真的希望能够就地更新,请使用方形 2d 直方图(因此您可以使用imshow),或者您可以修改hexbin以返回补丁列表(而不是polyCollection)并跟踪您自己的分箱。

于 2013-02-06T20:28:41.810 回答
0

要回答您预期的问题,而不是调用set_xdata类似update_from. 我不保证这会奏效,但我会尝试

def update(self, xData, yData):
    # update your data structures
    self.xData = np.append(self.xData, xData)
    self.yData = np.append(self.yData, yData)

    # create a new hexbin - not connected to anything, with the new data
    new_hexbin = self.ax.hexbin(self.xData, self.yData)

    # update the viewed hexbin from the new one
    self.graph.update_from(new_hexbin)
    self.figure.canvas.draw()

请注意,如果没有更多代码或解释,这实际上只是猜测工作!这个类的文档在这里update_from方法来自父类

于 2013-02-06T17:33:12.620 回答