Chaco MultiLinePlot - невозможно отобразить простой график, интересно, не сломан ли пакет?

Я пытаюсь создать многострочный график для отображения данных нескольких временных рядов (напряжений) из двухмерного массива 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, и эта ошибка отображается в оболочке:

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:\Users\pzl46097\AppData\Local\Enthought\Canopy\User\lib\site-packages\traits\trait_notifiers.py", line 340, in __call__
self.handler( *args )
File "C:\Users\pzl46097\AppData\Local\Enthought\Canopy\User\lib\site-packages\chaco\base_xy_plot.py", line 613, in _bounds_items_changed
self._update_mappers()
File "C:\Users\pzl46097\AppData\Local\Enthought\Canopy\User\lib\site-packages\chaco\base_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:\Users\pzl46097\AppData\Local\Enthought\Canopy\User\lib\site-packages\traits\trait_notifiers.py", line 340, in __call__
self.handler( *args )
File "C:\Users\pzl46097\AppData\Local\Enthought\Canopy\User\lib\site-packages\chaco\base_xy_plot.py", line 613, in _bounds_items_changed
self._update_mappers()
File "C:\Users\pzl46097\AppData\Local\Enthought\Canopy\User\lib\site-packages\chaco\base_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

а также документы руководства пользователя по адресу:

http://docs.enthought.com/chaco/user_manual/plot_types.html

но, похоже, нет другой документации по этому классу. Мне интересно, если он не поддерживается и может быть сломан, или я делаю что-то не так (возможно, я использую Chaco только около 1 недели, и библиотека для меня нова, как и ООП в Python в целом).

Заранее большое спасибо за любую помощь..

0 ответов

Не уверен, какой пример вы зеркалировали, но работать напрямую с экземплярами 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()
Другие вопросы по тегам