Чако — Получение нескольких рядов данных для использования одних и тех же осей и карт

Я пытаюсь построить несколько наборов данных на одном графике.

Каждый набор данных может быть представлен как ряд 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()

person user2175850    schedule 24.05.2014    source источник


Ответы (1)


Одна из проблем в Чако (и многих других графических библиотеках) — перегруженность терминами, особенно словом «сюжет».

Вы создаете две разные (с большой буквы «П») Plot, но (я полагаю) вам действительно нужна только одна. Plot - это контейнер, в котором хранятся все ваши отдельные строки... ммм... графики. Метод Plot.plot возвращает список экземпляров LinePlot (этот «график» также иногда называют «рендерером»). Этот рендерер — это то, что вы хотите добавить в свой контейнер Plot (заглавная буква «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

Изменить: более ранний ответ исправил проблему с помощью двухстрочной модификации, но это был не идеальный способ решить проблему.

person Tony S Yu    schedule 25.05.2014
comment
Большое тебе спасибо. Это идеально! - person user2175850; 26.05.2014