Chaco - Получение нескольких рядов данных для использования одних и тех же осей и карт
Я пытаюсь построить несколько коллекций данных на одном графике.
Каждый набор данных может быть представлен как 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()
1 ответ
Одной из бородавок в Чако (и, действительно, во многих библиотеках черчения) является перегрузка терминов - особенно слова "сюжет".
Вы создаете два разных (заглавных - "П") Plot
с, но (я считаю) вы действительно хотите только один. Plot
это контейнер, который содержит все ваши индивидуальные линии... ммм... графики. Plot.plot
метод возвращает список LinePlot
экземпляры (этот "сюжет" также иногда называют "рендерером"). Этот рендерер - это то, что вы хотите добавить в свой контейнер (с заглавной буквы "P"). plot
Метод на самом деле создает LinePlot
экземпляр и добавляет его к Plot
контейнер для вас. (Да, это три разных использования "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
Изменить: более ранний ответ исправил проблему с двухстрочной модификацией, но это был не идеальный способ решения проблемы.