2014-05-24 3 views
0

J'essaye de tracer plusieurs collections de données sur un seul graphique.Chaco - Obtenir plusieurs séries de données pour utiliser les mêmes axes et les mêmes cartes

Chaque jeu de données peut être représenté par une série x (index) et plusieurs séries y (valeurs). Les plages de séries de données x et y peuvent être différentes dans chaque ensemble de données. Je souhaite que plusieurs de ces ensembles de données s'affichent sur une seule parcelle. Cependant, quand j'ajoute simplement le second objet plot au premier (voir ci-dessous) il fait un deuxième axe pour celui-ci qui est imbriqué dans le tracé.

Je souhaite que les deux tracés partagent le même axe et que les limites de l'axe soient mises à jour pour s'adapter à toutes les données. Quel est le meilleur moyen d'y parvenir? J'ai du mal à trouver des sujets à ce sujet dans la documentation.

Merci pour votre aide. Le code ci-dessous met en évidence mon problème.

# 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() 

Répondre

2

L'une des verrues dans Chaco (et même de nombreuses bibliothèques complotant) est la surcharge des termes --- en particulier le mot « complot ».

Vous créez deux différents (capital-P) Plot s, mais (je crois) vous en voulez vraiment un. Plot est le conteneur qui contient toutes vos lignes individuelles ... umm ... parcelles. La méthode Plot.plot renvoie une liste de LinePlot instances (ce "tracé" est parfois appelé "rendu" parfois). Ce moteur de rendu est ce que vous voulez ajouter à votre conteneur de tracé (capital "P"). La méthode plot crée réellement l'instance LinePlot et l'ajoute au conteneur Plot pour vous. (Yup, c'est trois utilisations différentes de "plot": Le conteneur, le rendu, et la méthode sur le conteneur qui ajoute/retourne le rendu.)

Voici une version plus simple de _create_plot_component qui fait à peu près ce que vous voulez. Notez qu'un seul conteneur (capital-P) Plot est créé.

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 

Edit: Une réponse plus tôt résolu le problème avec une modification de deux lignes, mais ce ne fut pas le moyen idéal pour résoudre le problème.

+0

Merci beaucoup. C'est idéal! – user2175850

Questions connexes