我在matplotlib
中嵌入了hexbin
GTK.Window
来绘制一些数据(x,y)。我希望plot
在收到新数据时更新(通过UDP
)。我虽然遇到了一些麻烦。
我可以通过几种不同的方式让它工作,但没有一种是“有效的”(含义 - 重绘plot
花费的时间太长)。我看了here并试图在建议的答案之后对我的hexbin进行建模,但根本无法使其工作。我一直收到以下错误:
TypeError: 'PolyCollection' object is not iterable.
我猜测hexbins
无法以与标准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'
答案 0 :(得分:2)
该行:
self.graph, = self.ax.hexbin(self.xData, self.yData)
(如果这是你的堆栈跟踪抛出异常的地方)将是因为逗号,暗示self.ax.hexbin
是一个可迭代对象。改为
self.graph = self.ax.hexbin(self.xData, self.yData)
可能会停止TypeError exception
。下一次,在堆栈跟踪中提供更多行 - 这可能有助于澄清事情。
答案 1 :(得分:2)
我认为目前无法做到这一点,hexbin
转换x,y - >列表多边形的集合。 polyCollection
只是一个顶点,边和面颜色的列表,我认为它不包含任何关于它是如何生成的语义信息。
最好的方法是核旧hexbin
并用新的替换它。
如果您真的希望能够就地更新,请使用方形2d直方图(这样您可以使用imshow
),或者您可以修改hexbin
以返回补丁列表(而不是一个polyCollection
)并跟踪你自己的分档。
答案 2 :(得分: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()
请注意,如果没有更多代码或解释,这只是猜测工作!此课程的文档为here,update_from
方法来自parent class。