- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在开发一个程序,其中有两个相邻的地 block 。第一个图有一个 ZoomTool、一个 PanTool 和一个 RangeSelection 工具。第二个图应根据左侧图中所做的更改(缩放等)进行修改。
缩放后是否有可能得到新的索引和值?以及如何在进行范围选择后获得新的索引范围?该索引也应该是右图的新索引,直到所选部分不再被选中。
我将在本文下方发布我的代码,但您也可以看到它 here
这是我的代码:
#=================================================
# Code
#=================================================
# Enthought library imports
from traits.api import HasTraits, Int, Instance
from traits.api import *
from traitsui.api import Item, View, Group, HGroup, VGroup
from enable.api import Component
from enable.component_editor import ComponentEditor
from traitsui.menu import OKButton, CancelButton
# Chaco imports
from chaco.tools.api import RangeSelection, RangeSelectionOverlay
from chaco.chaco_plot_editor import ChacoPlotEditor, ChacoPlotItem
from chaco.api import Plot, ArrayPlotData, OverlayPlotContainer, create_line_plot, create_scatter_plot, add_default_axes, add_default_grids, PlotAxis, PlotLabel
from chaco.tools.api import PanTool, BroadcasterTool, ZoomTool
# Numpy imports
from numpy import linspace, pi, sin, tan
def main():
# normally this function gets its values out of other files
x1 = -2*pi
x2 = pi
y1 = 0
y2 = 2
uebergabe = {"xlim":[x1,x2], "ylim":[y1,y2], "ranges":[x1,x2]}
return uebergabe
class Trait(HasTraits):
plot = Instance(Component)
#creates the container
container = OverlayPlotContainer(padding = 50, fill_padding = True,
bgcolor = "lightgray", use_backbuffer=True)
container2 = OverlayPlotContainer(padding = 50, fill_padding = True,
bgcolor = "lightgray", use_backbuffer=True)
# Traits
xmin = Float
xmax = Float
ymin = Float
ymax = Float
rangeXMin = Float
rangeXMax = Float
# TraitsUI view
traits_view = View(Group(
HGroup(
VGroup(Item("container", editor = ComponentEditor(), show_label = False)),
VGroup(Item("container2", editor = ComponentEditor(), show_label = False))),
HGroup(Item("xmin"), Item("xmax"), Item("ymin"), Item("ymax"), show_border = True, label = "Plotborders"),
HGroup(Item("rangeXMin", label="x_min"), Item("rangeXMax", label="x_max"), show_border = True, label="Range of right plot")),
buttons = [OKButton, CancelButton], resizable = True, width = 1000, height = 800)
# Constructor
def __init__(self):
super(Trait, self).__init__()
uebergabe = main()
# initialize traits
self.xmin = uebergabe["xlim"][0]
self.xmax = uebergabe["xlim"][1]
self.ymin = uebergabe["ylim"][0]
self.ymax = uebergabe["ylim"][1]
self.rangeXMin = uebergabe["ranges"][0]
self.rangeXMin = uebergabe["ranges"][1]
self._create_Container()
def _create_Container(self):
#creating dict of plots and the broadcaster
plots = {}
broadcaster = BroadcasterTool()
#=====================first container===========================
#first plot
index = linspace(-2*pi,2*pi,1000)
plot = create_line_plot((index, sin(index)+0.5), color = "blue", index_bounds=(self.xmin, self.xmax), value_bounds = (self.ymin, self.ymax))
plot.bgcolor = "white"
plot.border_visible = True
value_mapper = plot.value_mapper
index_mapper = plot.index_mapper
add_default_grids(plot)
add_default_axes(plot)
# range selection
self.rangeselect = RangeSelection(plot, left_button_selects = False, auto_handle_event = False)
plot.active_tool = self.rangeselect
plot.overlays.append(RangeSelectionOverlay(component=plot))
#adds plot to the container
self.container.add(plot)
# second plot
index2 = linspace(-5*pi,4*pi,1000)
plot = create_line_plot((index2, tan(index2)), color = "black", index_bounds=(self.xmin, self.xmax), value_bounds = (self.ymin, self.ymax))
plot.value_mapper = value_mapper
value_mapper.range.add(plot.value)
plot.index_mapper = index_mapper
index_mapper.range.add(plot.index)
# Create a pan tool and give it a reference to the plot
pan = PanTool(plot, drag_button="left")
broadcaster.tools.append(pan)
# allows to zoom
zoom = ZoomTool(plot, tool_mode="box", always_on = False, visible = True)
plot.overlays.append(zoom)
#adds plot to the container
self.container.add(plot)
# appends broadcaster to the container
self.container.tools.append(broadcaster)
# title of the container
self.container.overlays.append(PlotLabel("left plot", component=self.container, overlay_position = "top"))
#==============end of first container===========================
#====================second container===========================
#first plot2
index3 = linspace(-10*pi,10*pi,500)
plot2 = create_scatter_plot((index3, sin(index3)), color = "blue", index_bounds=(self.rangeXMin, self.rangeXMax), value_bounds = (self.ymin, self.ymax))
plot2.bgcolor = "white"
plot2.border_visible = True
plot2.value_mapper = value_mapper # the plot uses the same index and
plot2.index_mapper = index_mapper # value like the plots of container1
#value_mapper.range.add(plot2.value)
#index_mapper.range.add(plot2.index)
add_default_grids(plot2)
add_default_axes(plot2)
#adds plot to the container
self.container2.add(plot2)
# title of the container
self.container2.overlays.append(PlotLabel("right plot", component=self.container, overlay_position = "top"))
#=============end of second container===========================
gui = Trait()
gui.configure_traits()
最佳答案
您可以使用 sync_trait() 来同步两个特征之间的值:
self.sync_trait("xmin", index_mapper.range, "_low_value")
self.sync_trait("xmax", index_mapper.range, "_high_value")
self.sync_trait("ymin", value_mapper.range, "_low_value")
self.sync_trait("ymax", value_mapper.range, "_high_value")
self.sync_trait("rangeXMin", plot2.index_mapper.range, "low", False)
self.sync_trait("rangeXMax", plot2.index_mapper.range, "high", False)
捕捉范围选择变化:
self.rangeselect.on_trait_change(self.on_selection_changed, "selection")
def on_selection_changed(self, selection):
if selection != None:
self.rangeXMin, self.rangeXMax = selection
捕捉轴范围变化:
index_mapper.on_trait_change(self.on_mapper_updated, "updated")
def on_mapper_updated(self, mapper, name, value):
if not self.rangeselect.selection:
self.rangeXMin = mapper.range.low
self.rangeXMax = mapper.range.high
完整代码如下:
# -*- coding: utf-8 -*-
#=================================================
# Code
#=================================================
# Enthought library imports
from traits.api import HasTraits, Int, Instance
from traits.api import *
from traitsui.api import Item, View, Group, HGroup, VGroup
from enable.api import Component
from enable.component_editor import ComponentEditor
from traitsui.menu import OKButton, CancelButton
# Chaco imports
from chaco.tools.api import RangeSelection, RangeSelectionOverlay
from chaco.chaco_plot_editor import ChacoPlotEditor, ChacoPlotItem
from chaco.api import Plot, ArrayPlotData, OverlayPlotContainer, create_line_plot, create_scatter_plot, add_default_axes, add_default_grids, PlotAxis, PlotLabel
from chaco.tools.api import PanTool, BroadcasterTool, ZoomTool
# Numpy imports
from numpy import linspace, pi, sin, tan
def main():
# normally this function gets its values out of other files
x1 = -2*pi
x2 = pi
y1 = 0
y2 = 2
uebergabe = {"xlim":[x1,x2], "ylim":[y1,y2], "ranges":[x1,x2]}
return uebergabe
class Trait(HasTraits):
plot = Instance(Component)
#creates the container
container = OverlayPlotContainer(padding = 50, fill_padding = True,
bgcolor = "lightgray", use_backbuffer=True)
container2 = OverlayPlotContainer(padding = 50, fill_padding = True,
bgcolor = "lightgray", use_backbuffer=True)
# Traits
xmin = Float
xmax = Float
ymin = Float
ymax = Float
rangeXMin = Float
rangeXMax = Float
# TraitsUI view
traits_view = View(Group(
HGroup(
VGroup(Item("container", editor = ComponentEditor(), show_label = False)),
VGroup(Item("container2", editor = ComponentEditor(), show_label = False))),
HGroup(Item("xmin"), Item("xmax"), Item("ymin"), Item("ymax"), show_border = True, label = "Plotborders"),
HGroup(Item("rangeXMin", label="x_min"), Item("rangeXMax", label="x_max"), show_border = True, label="Range of right plot")),
buttons = [OKButton, CancelButton], resizable = True, width = 1000, height = 500)
# Constructor
def __init__(self):
super(Trait, self).__init__()
uebergabe = main()
# initialize traits
self.xmin = uebergabe["xlim"][0]
self.xmax = uebergabe["xlim"][1]
self.ymin = uebergabe["ylim"][0]
self.ymax = uebergabe["ylim"][1]
self.rangeXMin = uebergabe["ranges"][0]
self.rangeXMin = uebergabe["ranges"][1]
self._create_Container()
def _create_Container(self):
#creating dict of plots and the broadcaster
plots = {}
broadcaster = BroadcasterTool()
#=====================first container===========================
#first plot
index = linspace(-2*pi,2*pi,1000)
plot = create_line_plot((index, sin(index)+0.5), color = "blue", index_bounds=(self.xmin, self.xmax), value_bounds = (self.ymin, self.ymax))
plot.bgcolor = "white"
plot.border_visible = True
value_mapper = plot.value_mapper
index_mapper = plot.index_mapper
add_default_grids(plot)
add_default_axes(plot)
self.sync_trait("xmin", index_mapper.range, "_low_value")
self.sync_trait("xmax", index_mapper.range, "_high_value")
self.sync_trait("ymin", value_mapper.range, "_low_value")
self.sync_trait("ymax", value_mapper.range, "_high_value")
# range selection
self.rangeselect = RangeSelection(plot, left_button_selects = False, auto_handle_event = False)
plot.active_tool = self.rangeselect
plot.overlays.append(RangeSelectionOverlay(component=plot))
self.rangeselect.on_trait_change(self.on_selection_changed, "selection")
#adds plot to the container
self.container.add(plot)
# second plot
index2 = linspace(-5*pi,4*pi,1000)
plot = create_line_plot((index2, tan(index2)), color = "black", index_bounds=(self.xmin, self.xmax), value_bounds = (self.ymin, self.ymax))
plot.value_mapper = value_mapper
value_mapper.range.add(plot.value)
plot.index_mapper = index_mapper
index_mapper.range.add(plot.index)
# Create a pan tool and give it a reference to the plot
pan = PanTool(plot, drag_button="left")
broadcaster.tools.append(pan)
# allows to zoom
zoom = ZoomTool(plot, tool_mode="box", always_on = False, visible = True)
plot.overlays.append(zoom)
#adds plot to the container
self.container.add(plot)
# appends broadcaster to the container
self.container.tools.append(broadcaster)
# title of the container
self.container.overlays.append(PlotLabel("left plot", component=self.container, overlay_position = "top"))
#==============end of first container===========================
#====================second container===========================
#first plot2
index3 = linspace(-10*pi,10*pi,500)
plot2 = create_scatter_plot((index3, sin(index3)), color = "blue", index_bounds=(self.rangeXMin, self.rangeXMax), value_bounds = (self.ymin, self.ymax))
plot2.bgcolor = "white"
plot2.border_visible = True
plot2.value_mapper = value_mapper # the plot uses the same index and
#plot2.index_mapper = index_mapper # value like the plots of container1
self.sync_trait("rangeXMin", plot2.index_mapper.range, "low", False)
self.sync_trait("rangeXMax", plot2.index_mapper.range, "high", False)
plot2.index_mapper.range.low = 0
plot2.index_mapper.range.high = 2
#value_mapper.range.add(plot2.value)
#index_mapper.range.add(plot2.index)
add_default_grids(plot2)
add_default_axes(plot2)
#adds plot to the container
self.container2.add(plot2)
# title of the container
self.container2.overlays.append(PlotLabel("right plot", component=self.container, overlay_position = "top"))
index_mapper.on_trait_change(self.on_mapper_updated, "updated")
#=============end of second container===========================
def on_mapper_updated(self, mapper, name, value):
if not self.rangeselect.selection:
self.rangeXMin = mapper.range.low
self.rangeXMax = mapper.range.high
def on_selection_changed(self, selection):
if selection != None:
self.rangeXMin, self.rangeXMax = selection
gui = Trait()
gui.configure_traits()
关于python - Chaco:从 Chaco 图中获取索引和值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12280693/
我正在开发一个程序,其中有两个相邻的地 block 。第一个图有一个 ZoomTool、一个 PanTool 和一个 RangeSelection 工具。第二个图应根据左侧图中所做的更改(缩放等)进行
我试图在 Chaco 中隐藏/显示线图。我引用了绘图名称和渲染器 plot = Plot(....) renderer = plot.plot((x, y), ...)[0] renderer.vis
Chaco 中的小刻度总是被省略: 这并不总是很方便。 Chaco 中是否有可能像 matplotlib 中那样有小刻度: 没有找到任何相关内容..谢谢。 最佳答案 编辑:此功能现已添加到 Chaco
是否可以使chaco图自动显示完整输出而不隐藏刻度线和标签部分?例如。这是标准示例的输出: from chaco.api import ArrayPlotData, Plot from enable.
如何显示在运行线程中创建的 Chaco 图?我认为一个例子会让我的想法更清晰一些: 看看我使用 Chaco 创建绘图的示例代码。 from traits.api import HasTraits, I
我正在探索 Traits/TraitsUI/Chaco来自 Enthought 的包裹因为我想使用强大的动态绘图工具。我有来自外部来源的数据,我希望使用这些数据来更新一组 Chaco 图。我研究了 s
注意:我将亲自回答这个问题,以帮助将来遇到此问题的其他人。如果您愿意,请随时提交您自己的答案,但要知道已经有人回答了! 如何在 Chaco 中将具有一个颜色图的蒙版图像叠加到另一个具有不同颜色图的图像
我想更改 chaco Legend 上的线条标签,因为我的标签需要是升序 float : 1,2,3,4 但它是字符串排序,所以我得到: 1, 10, 11, 2, 21 etc... 我注意到关于
是否可以使用 latex 文本创建查科图?例如,如果我们想要 this exampe 标题中的 latex 符号: from traits.api import HasTraits, Instance
我有一个标准的金融时间序列数据,其中包含市场收盘时的缺口。 问题是Chaco显示这些间隙,我可以在 matplotlib 中使用格式化程序,如下所示并应用于 x 轴来解决这个问题,但我不确定我应该在
我有一个 HPlotContainer,默认有 2 个空 LinePlots,使用 create_line_plot() 工厂函数创建。然后我执行一些计算并想更新绘图。如何访问 LinePlot 的
我在 Mac 上有两个具有相同代码和 sys.path 的工作区。一个工作正常,另一个在导入 chaco.shell 时出现问题(导入错误:没有名为 shell 的模块)。 我正在使用 enthoug
我正在尝试与 Chaco 和 pyqt 一起为实验室硬件绘制实时数据采集任务。我之前使用的是 matplotlib,但事实证明它太慢了(我什至尝试过动画)。当我在 pyqt 窗口中嵌入一个 matpl
我有一个 Chaco ToolBarPlot,只是想将 xlabel 设置为“Wavelength”。在 matplotlib 中,显然是: plt.xlabel('Wavelength') 在 Ch
将Chaco嵌入到Qt和Wx中似乎没有问题。有没有人有如何将 Chaco 嵌入 GTK 的示例或想法? 最佳答案 我将 python 与 matplotlib 结合使用。要在 GUI 中插入图形,我需
Python 的 Chaco 绘图工具包包括展示如何动态更新现有绘图的示例。但是,我的应用程序要求我根据数据动态创建和销毁绘图。我刚开始使用 Chaco 和 Traits 进行编程,所以一个简单的示例
我终于开始尝试 Chaco,所以这个问题可能很天真。目前,我正在尝试绘制类型为 numpy.uint8 的非常大的 8 位(也称为灰度或单 channel )图像。似乎无论我做什么,图像都是彩色的。这
我有几组 (x,y) 数据,我想将它们绘制为同一图上的线图。我对 matplotlib 执行此操作没有任何问题,但我无法使用 Chaco 获得相同的结果。代码和输出如下所示。 我的基于 matplot
在此处输入代码我有一个程序,该程序使用嵌入在 pyside (Qt4) GUI 中的 Enthought Chaco 图。它还使用 numpy,但没关系。该程序直接从 Python 在多个平台上运行良
使用下面的最小示例,我得到的大图(大约 110k 点)的线图(使用 python 2.7、numpy 1.5.1、chaco/enable/traits 4.3.0)是这样的: 然而,这很奇怪,因为它
我是一名优秀的程序员,十分优秀!