Как заставить PanTool и ZoomTool вести себя, если начало графика находится «вверху слева»?

Я пытаюсь использовать PanTool и ZoomTool на графике Чако, исходная точка которого установлена ​​​​«вверху слева», но поведение этих инструментов не соответствует ожидаемому. Панорамирование перемещается в противоположном направлении, а масштабирование рамки не обязательно приводит к масштабированию выделенной области. Пример кода:

plot.plot((x_key, y_key), origin='top left')
plot.tools.append(PanTool(plot))
plot.overlays.append(ZoomTool(plot, tool_mode='box', always_on=False))

Если origin='top left' удалить, поведение панорамирования и масштабирования будет таким, как я ожидал.


person JefferyRPrice    schedule 27.04.2013    source источник


Ответы (1)


Это очень поздний ответ, но в основном источник должен быть установлен в основном экземпляре Plot, а не в вызове его метода plot. (Набор origin при инициализации Plot также передается в plot)

import numpy as np

from enable.api import Component, ComponentEditor
from traits.api import HasTraits, Instance
from traitsui.api import UItem, Group, View

from chaco.api import ArrayPlotData, Plot
from chaco.tools.api import PanTool, ZoomTool


class Demo(HasTraits):

    plot = Instance(Component)
    traits_view = View(
        Group(
            UItem('plot', editor=ComponentEditor(size=(900, 500))),
        ),
    )

    def _plot_default(self):
        x = np.linspace(-2.0, 10.0, 100)
        data = ArrayPlotData(x=x, y=np.sin(x))

        # This works
        plot = Plot(data, origin='top left')
        plot.plot(('x', 'y'))

        # This doesn't
        # plot = Plot(data)
        # plot.plot(('x', 'y'), origin='top left')

        plot.tools.append(PanTool(plot))
        zoom = ZoomTool(component=plot, tool_mode="box", always_on=False)
        plot.overlays.append(zoom)
        return plot


if __name__ == "__main__":
    demo = Demo()
    demo.configure_traits()
person Tony S Yu    schedule 21.12.2013