【问题标题】:Chaco - Getting multiple data series to use the same axes and mapsChaco - 让多个数据系列使用相同的轴和地图
【发布时间】:2014-05-24 09:43:39
【问题描述】:

我正在尝试在一个图上绘制多个数据集合。

每个数据集都可以表示为一个 x 系列(索引)和几个 y 系列(值)。 x 和 y 数据系列的范围在每个数据集中可能不同。我想让其中几个数据集显示在一个图上。但是,当我只是将第二个绘图对象添加到第一个绘图对象(见下文)时,它会为其创建第二个轴,该轴嵌套在绘图内。

我希望两个图共享相同的轴,并更新轴边界以适应所有数据。实现这一目标的最佳方法是什么?我正在努力在文档中找到这方面的主题。

感谢您的帮助。下面的代码突出了我的问题。

# Major library imports
from numpy import linspace
from scipy.special import jn

from chaco.example_support import COLOR_PALETTE
# Enthought library imports
from enable.api import Component, ComponentEditor
from traits.api import HasTraits, Instance
from traitsui.api import Item, Group, View

# Chaco imports
from chaco.api import ArrayPlotData, Plot
from chaco.tools.api import BroadcasterTool, PanTool, ZoomTool
from chaco.api import create_line_plot, add_default_axes

def _create_plot_component():    
    # Create some x-y data series to plot
    x = linspace(-2.0, 10.0, 100)
    x2 =linspace(-5.0, 10.0, 100)

    pd = ArrayPlotData(index = x)
    for i in range(5):
        pd.set_data("y" + str(i), jn(i,x))

    #slightly different plot data
    pd2 =  ArrayPlotData(index = x2)
    for i in range(5):
        pd2.set_data("y" + str(i), 2*jn(i,x2))

    # Create some line plots of some of the data
    plot1 = Plot(pd)
    plot1.plot(("index", "y0", "y1", "y2"), name="j_n, n<3", color="red")

    # Tweak some of the plot properties
    plot1.title = "My First Line Plot"
    plot1.padding = 50
    plot1.padding_top = 75
    plot1.legend.visible = True

    plot2 = Plot(pd2)
    plot2.plot(("index", "y0", "y1"), name="j_n, n<3", color="green")

    plot1.add(plot2)
    # Attach some tools to the plot
    broadcaster = BroadcasterTool()
    broadcaster.tools.append(PanTool(plot1))
    broadcaster.tools.append(PanTool(plot2))

    for c in (plot1, plot2):
        zoom = ZoomTool(component=c, tool_mode="box", always_on=False)
        broadcaster.tools.append(zoom)

    plot1.tools.append(broadcaster)

    return plot1

# Attributes to use for the plot view.
size=(900,500)
title="Multi-Y plot"

# # Demo class that is used by the demo.py application.
#===============================================================================
class Demo(HasTraits):
    plot = Instance(Component)

    traits_view = View(
                    Group(
                        Item('plot', editor=ComponentEditor(size=size),
                             show_label=False),
                        orientation = "vertical"),
                    resizable=True, title=title,
                    width=size[0], height=size[1]
                    )

    def _plot_default(self):
         return _create_plot_component()

demo = Demo()
if __name__ == "__main__":
    demo.configure_traits()

【问题讨论】:

    标签: enthought traitsui chaco


    【解决方案1】:

    Chaco(以及许多绘图库)的缺点之一是术语的重载——尤其是“情节”这个词。

    您正在创建两个不同的(大写“P”)Plots,但(我相信)您真的只想要一个。 Plot 是一个容器,可以容纳你所有的线……嗯……地块。 Plot.plot 方法返回LinePlot 实例的列表(此“绘图”有时也称为“渲染器”)。该渲染器是您要添加到(大写“P”)绘图容器的内容。 plot 方法实际上为您创建了LinePlot 实例并将其添加到Plot 容器中。 (是的,这是“绘图”的三种不同用法:容器、渲染器以及容器上添加/返回渲染器的方法。)

    这是_create_plot_component 的一个更简单的版本,大致可以满足您的需求。请注意,只会创建一个(大写“P”)Plot 容器。

    def _create_plot_component():
        # Create some x-y data series to plot
        x = linspace(-2.0, 10.0, 100)
        x2 =linspace(-5.0, 10.0, 100)
    
        pd = ArrayPlotData(x=x, x2=x2)
        for i in range(3):
            pd.set_data("y" + str(i), jn(i,x))
    
        # slightly different plot data
        for i in range(3, 5):
            pd.set_data("y" + str(i), 2*jn(i,x2))
    
        # Create some line plots of some of the data
        canvas = Plot(pd)
        canvas.plot(("x", "y0", "y1", "y2"), name="plot 1", color="red")
        canvas.plot(("x2", "y3", "y4"), name="plot 2", color="green")
        return canvas
    

    编辑:较早的回复通过两行修改解决了该问题,但这不是解决问题的理想方法。

    【讨论】:

    • 非常感谢。这是理想的!
    猜你喜欢
    • 2013-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-02
    相关资源
    最近更新 更多