我正在尝试创建一个多线图,以显示2D NumPy阵列中的多个时间序列数据(电压)。我已经开始非常简单地尝试从2x10阵列中绘制两条带有十个数据点的线,但如果不得到大量无法调试的错误输出,我甚至无法实现这一点。
进口:
import numpy
from traits.api import HasTraits, Instance
from traitsui.api import View, Item
from chaco.api import MultiLinePlot, ArrayDataSource, MultiArrayDataSource
from enable.component_editor import ComponentEditor
测试阵列:
test_array = numpy.random.rand(10,2)
显示类别:
class Multi_line_graph(HasTraits):
plot = Instance(MultiLinePlot)
traits_view = View(
Item('plot',editor=ComponentEditor(), show_label=False),
width=1024, height=768, resizable=True, title="EEG Preview")
def __init__(self, my_data):
super(Multi_line_graph, self).__init__()
x = ArrayDataSource(numpy.arange(1, my_data.shape[0]))
y = my_data.transpose() #since my data columnwise
y = MultiArrayDataSource(y)
yidx = ArrayDataSource(numpy.arange(y.get_shape()[0]))
plot = MultiLinePlot(index=x, yindex=yidx, value=y)
self.plot = plot
创建类的实例:
my_graph = Multi_line_graph(test_array)
显示(配置特征):
my_graph.configure_traits()
然后我出现了一个窗口,但它挂起并崩溃了Python内核,这个错误显示在shell中:
Exception occurred in traits notification handler for object: <chaco.multi_line_plot.MultiLinePlot object at 0x000000000D0CFD58>, trait: bounds_items, old value: <undefined>, new value: <traits.trait_handlers.TraitListEvent object at 0x000000000D18C908>
Traceback (most recent call last):
File "C:Userspzl46097AppDataLocalEnthoughtCanopyUserlibsite-packagestraitstrait_notifiers.py", line 340, in __call__
self.handler( *args )
File "C:Userspzl46097AppDataLocalEnthoughtCanopyUserlibsite-packageschacobase_xy_plot.py", line 613, in _bounds_items_changed
self._update_mappers()
File "C:Userspzl46097AppDataLocalEnthoughtCanopyUserlibsite-packageschacobase_xy_plot.py", line 594, in _update_mappers
x_mapper.screen_bounds = (x, x2)
AttributeError: 'NoneType' object has no attribute 'screen_bounds'
Exception occurred in traits notification handler for object: <chaco.multi_line_plot.MultiLinePlot object at 0x000000000D0CFD58>, trait: bounds_items, old value: <undefined>, new value: <traits.trait_handlers.TraitListEvent object at 0x000000000D0C4C88>
Traceback (most recent call last):
File "C:Userspzl46097AppDataLocalEnthoughtCanopyUserlibsite-packagestraitstrait_notifiers.py", line 340, in __call__
self.handler( *args )
File "C:Userspzl46097AppDataLocalEnthoughtCanopyUserlibsite-packageschacobase_xy_plot.py", line 613, in _bounds_items_changed
self._update_mappers()
File "C:Userspzl46097AppDataLocalEnthoughtCanopyUserlibsite-packageschacobase_xy_plot.py", line 594, in _update_mappers
x_mapper.screen_bounds = (x, x2)
AttributeError: 'NoneType' object has no attribute 'screen_bounds'
Exception occurred in traits notification handler.
Please check the log file for details.
我真的不知道这意味着什么。我已阅读并重新阅读API文档,网址:
http://docs.enthought.com/chaco/api/renderers.html#multilineplot
以及用户指南文档:
http://docs.enthought.com/chaco/user_manual/plot_types.html#multi-线图
但是这个类似乎没有任何其他文档。我想知道它是否没有得到维护,可能会损坏,或者我做错了什么(我很可能是这样,因为我只使用Chaco大约1周,这个库对我来说是新的,Python中的OOP也是如此)。
非常感谢您的帮助。。
不确定镜像的示例是什么,但直接使用DataSource实例并不是从Chaco开始的最简单方法。
我的建议是使用常规的Plot
类和ArrayPlotData
类来存储数组。展开一点,假设你有多个时间序列要绘制,这里是一个使用不同颜色的多线图的工作示例:
import numpy
from traits.api import Array, HasTraits, Instance
from traitsui.api import View, Item
from chaco.api import ArrayPlotData, Plot
from enable.api import ComponentEditor
test_array = numpy.random.rand(10, 2)
class Multi_line_graph(HasTraits):
plot = Instance(Plot)
data = Array
traits_view = View(
Item('plot', editor=ComponentEditor(), show_label=False),
width=1024, height=768, resizable=True, title="EEG Preview"
)
def _plot_default(self):
data = {"x": t_array[0, :], "y1": t_array[1, :], "y2": t_array[2, :]}
plot = Plot(ArrayPlotData(**data))
plot.plot(("x", "y1"), type="line", color="blue")
plot.plot(("x", "y2"), type="line", color="red")
return plot
my_graph = Multi_line_graph(data=test_array)
my_graph.configure_traits()