Как использовать ScatterInspector и ScatterInspectorOverlay?
Я хотел бы использовать инструменты Chaco ScatterInspector
и / или ScatterInspectorOverlay
с энамл. Я установил очень простой контроллер и представление (источник ниже), но не могу определить, как действовать дальше. Я безуспешно пытался следовать минимальным и старым примерам, которые нашел.
Если я раскомментирую оверлейную часть для ScatterInspectorOverlay
код не запускается с
Файл ".../chaco/scatter_inspector_overlay.py", строка 51, в оверлее, если не зарезервирован или не показан plot.index или не получен getattr(plot, "value", True):
Если я закомментирую часть наложения, я, конечно, не получу желаемое поведение наложения, а также, перемещая мышь, получаю
Файл ".../chaco/tools/scatter_inspector.py", строка 48, в файле normal_mouse_move index = plot.map_index((event.x, event.y), threshold=self.threshold)
источник view.enaml:
from enaml.widgets.api import (
Window, Container, EnableCanvas,
)
enamldef ScatterView(Window):
attr controller
title = "Scatter Inspector Test"
initial_size = (640,480)
Container:
EnableCanvas:
component = controller.scatter_plot
controller.py источник:
import enaml
from enaml.stdlib.sessions import show_simple_view
from traits.api import HasTraits, Instance
from chaco.api import Plot, ArrayPlotData, ScatterInspectorOverlay
from chaco.tools.api import ScatterInspector
from numpy import linspace, sin
class ScatterController(HasTraits):
scatter_plot = Instance(Plot)
def _scatter_plot_default(self):
# data
x = linspace(-14, 14, 100)
y = sin(x) * x**3
plotdata = ArrayPlotData(x = x, y = y)
# plot
scatter_plot = Plot(plotdata)
renderer = scatter_plot.plot(("x", "y"), type="scatter", color="red")
# inspector
scatter_plot.tools.append(ScatterInspector(scatter_plot))
# overlay
# scatter_plot.overlays.append( ScatterInspectorOverlay(
# scatter_plot,
# hover_color = 'red',
# hover_marker_size = 6,
# selection_marker_size = 6,
# selection_color = 'yellow',
# selection_outline_color='purple',
# selection_line_width = 3
# ))
#return
return scatter_plot
if __name__ == "__main__":
with enaml.imports():
from view import ScatterView
main_controller = ScatterController()
window = ScatterView(controller=ScatterController())
show_simple_view(window)
1 ответ
Проблема с моим кодом была в том, что я добавлял ScatterInspector
в scatter_plot
а не renderer
и что я скучал по [0]
индекс, чтобы получить renderer
,
Ключевым моментом, который я действительно хотел сделать, было уведомление о том, что мышь зависла над точкой данных и / или была выбрана точка данных. я добавил when_hover_or_selection_changes
который показывает, как это сделать.
Рабочий контроллер.py:
...
# plot
scatter_plot = Plot(plotdata)
renderer = scatter_plot.plot(("x", "y"), type="scatter", color="lightblue")[0]
# inspector
renderer.tools.append(ScatterInspector(renderer))
# overlay
renderer.overlays.append(ScatterInspectorOverlay(renderer,
hover_color="red",
hover_marker_size=6,
selection_marker_size=6,
selection_color="yellow",
selection_outline_color="purple",
selection_line_width=3))
...
# get notified when hover or selection changes
@on_trait_change('renderer.index.metadata')
def when_hover_or_selection_changes(self):
print 'renderer.index.metadata = ', self.renderer.index.metadata