2015-02-05 3 views
1

Я действительно борется, чтобы понять, как построить участки для бара.Chaco bar plot

Я вчитывался онлайн пример и сократили его до следующего упрощенного кода:

import numpy as np 
from traits.api import HasTraits, Instance 
from traitsui.api import View, Item 
from chaco.api import BarPlot, ArrayDataSource, DataRange1D, LinearMapper 
from enable.api import ComponentEditor 

class MyBarPlot(HasTraits): 
    plot = Instance(BarPlot) 

    traits_view = View(
     Item('plot',editor=ComponentEditor(), show_label=False)) 

    def _plot_default(self): 
     idx = np.array([1, 2, 3, 4, 5]) 
     vals = np.array([2, 4, 7, 4, 3]) 

     index = ArrayDataSource(idx) 
     index_range = DataRange1D(index, low=0.5, high=5.5) 
     index_mapper = LinearMapper(range=index_range) 

     value = ArrayDataSource(vals) 
     value_range = DataRange1D(value, low=0) 
     value_mapper = LinearMapper(range=value_range) 

     plot = BarPlot(index=index, value=value, 
         value_mapper=value_mapper, 
         index_mapper=index_mapper) 
     return plot 

if __name__ == "__main__": 
    myplot = MyBarPlot() 
    myplot.configure_traits() 

Само собой разумеется, моя попытка не работает. Когда я запускаю этот код (в записной книжке ipython), все, что я получаю, это пустое окно графика, заполненное черным.

Я подозреваю, что моя ошибка может иметь какое-то отношение к записям «valuemapper», поскольку я не совсем понимаю, для чего они нужны. Я был бы благодарен за любые указатели на мою ошибку кода.

В целом, этот подход кодирования кажется мне очень сложным - есть ли более простой способ сделать графики на чако?

ответ

2

К сожалению, черта bar_widthBarPlot не пытается быть умной. По умолчанию используется ширина 10 в пространстве данных, что полностью перекрывает ширину графика. Чтобы это исправить, вы можете регулировать ширину вручную:

plot = BarPlot(index=index, value=value, 
       value_mapper=value_mapper, 
       index_mapper=index_mapper, 
       bar_width=0.8) 

Обратите внимание, что это еще не даст вам правильный «бар сюжет», потому что вы будете отсутствовать окружающие топоры украшения и другие компоненты. Самый простой способ сделать это - использовать объект chaco Plot.

Вот пример, который добавляет BarPlot экземпляра в Plot:

https://github.com/enthought/chaco/blob/master/examples/demo/tornado.py

А вот пример, который создает бар участок, используя метод plot удобства в Plot:

https://github.com/enthought/chaco/blob/master/examples/demo/basic/bar_plot_stacked.py

Да, «сюжет» довольно ужасно перегружен (Chaco - Getting multiple data series to use the same axes and maps).

+0

Большое спасибо за ответ tsyu80. Да, вы были правы, установив соответствующее значение для bar_width, чтобы полосы сюжетов были различимы друг от друга, вместо того, чтобы все они были заблокированы одним большим жирным баром (вот почему мой сюжет был черным). Спасибо также за примеры. Второй вариант с удобством использования графика, казалось, предлагал «самое простое» решение, хотя оно все еще кажется ужасно сложным по сравнению с гистограммой matplotlib. – dreme

+0

Chaco определенно более подробен, если ваша цель - просто создать статический сюжет. Тем не менее, Chaco больше ориентируется на включение графиков в приложения. Если вы создаете приложение с интерактивными сюжетами, вы, вероятно, найдете Chaco проще, чем matplotlib. –

+0

Да, хорошая точка. Поскольку я начинаю понимать всю парадигму признаков/ui/chaco, мне это очень нравится. – dreme