2016-01-12 3 views
1

Возможно ли, чтобы участок chaco автоматически отображал полную мощность и не скрывал части тиков и меток? Например. это выход стандартного примера:Автоматические прокладки в Чако?

from chaco.api import ArrayPlotData, Plot 
from enable.component_editor import ComponentEditor 

from traits.api import HasTraits, Instance 
from traitsui.api import View, Item 


class MyPlot(HasTraits): 
    plot = Instance(Plot) 
    traits_view = View(Item('plot', editor = ComponentEditor(), show_label = False), 
        width = 500, height = 500, resizable = True) 

def __init__(self, x, y, *args, **kw): 
    super(MyPlot, self).__init__(*args, **kw) 
    plotdata = ArrayPlotData(x=x,y=y) 
    plot = Plot(plotdata) 
    plot.plot(("x","y"), type = "line", color = "blue") 
    self.plot = plot 


import numpy as np 
x = np.linspace(-300,300,10000) 
y = np.sin(x)*x**3 
lineplot = MyPlot(x,y) 
lineplot.configure_traits() 

enter image description here

Как вы видите часть клеща этикеток скрыты .. единственное, что я могу сделать, это вручную настроить левый отступ участка. Но это становится чрезвычайно неудобным, когда вы печатаете разные данные и разные шкалы или шрифты с графиком в приложении. Возможно ли каким-то образом сделать заполнение автоматически настроенным, чтобы включить ВСЕ соответствующую информацию?

UPD .: Я нашел secure_labels_bounded свойство для оси, но, похоже, это не имеет никакого эффекта.

ответ

1

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

from chaco.api import ArrayPlotData, Plot 
from enable.component_editor import ComponentEditor 

from traits.api import HasTraits, Instance 
from traitsui.api import View, Item 

class MyPlot(HasTraits): 
    plot = Instance(Plot) 
    traits_view = View(Item('plot', editor = ComponentEditor(), show_label = False), 
        width = 500, height = 500, resizable = True) 

    def __init__(self, x, y, *args, **kw): 
     super(MyPlot, self).__init__(*args, **kw) 
     plotdata = ArrayPlotData(x=x,y=y) 
     plot = Plot(plotdata, padding=25) 
     plot.plot(("x","y"), type = "line", color = "blue", name='abc') 
     self.plot = plot 
     # watch for changes to the bounding boxes of the tick labels 
     self.plot.underlays[2].on_trait_change(self._update_size, '_tick_label_bounding_boxes') 
     self.plot.underlays[3].on_trait_change(self._update_size, '_tick_label_bounding_boxes') 
    def _update_size(self): 
     if len(self.plot.underlays[2]._tick_label_bounding_boxes) > 0: 
      self.plot.padding_bottom = int(np.amax(np.array(self.plot.underlays[2]._tick_label_bounding_boxes),0)[1]+8+4) 
     if len(self.plot.underlays[3]._tick_label_bounding_boxes) > 0: 
      self.plot.padding_left = int(np.amax(np.array(self.plot.underlays[3]._tick_label_bounding_boxes),0)[0]+8+4) 

import numpy as np 
x = np.linspace(-300,300,10000) 
y = np.sin(x)*x**3 
lineplot = MyPlot(x,y) 
lineplot.configure_traits() 

enter image description here

+0

Спасибо большое! Это действительно приятное решение. Я работаю с Chaco в pyqt и реализую вашу процедуру на каждом графике перерисовывания, прекрасно решает проблему. – funnyp0ny

+0

Рад, что это помогло! Я также использую Chaco с Qt, они хорошо работают вместе. – Steve