Exemple #1
0
def graph(*data,**kwargs):
    ''' Creates a simple time series graph. Takes the output from getData (a list of Facts). 
        Alternately, you can pass the same set of parameters that are passed to getData().
        Takes an optional elements argument which expresses which elements to show. Also
        takes an optional showMissing argument which determines whether missing values (-9999.0)
        should be displayed. Also takes an optional lineWidth argument which lets you set lines
        heavier or lighter. Example: graph(data,elements=("temp","precip"),showMissing=False). 
        Returns the plot object in case you want to customize the graph in some way.
    '''
    from org.jfree.chart import ChartFactory,ChartFrame
    from org.jfree.data.time import TimeSeries,TimeSeriesCollection, Minute
    from java.awt import BasicStroke

    # Were we passed a dataset or parameters for obtaining a dataset?
    if len(data) == 3:
        station,date,element = data
        graph(getData(station,date,element))
        return
    else:
        data = data[0] # unwrap from tuple
    
    showMissing = kwargs.get('showMissing',True)
    lineWidth = kwargs.get('lineWidth',2.0)
    title = kwargs.get('title',"Time series graph")
    elementsToShow = [e.name for e in findElements(kwargs.get('elements',""))]
    datasets = {}
    for fact in sorted(data):
        
        if fact.value in missingValues and not showMissing: continue  
        station = str(fact.station.name)
        element = fact.element.name
        if elementsToShow and element not in elementsToShow: continue
        series = station+":"+element
        date = fact.datetime
        hour = date.getHour()
        if fact.subhourlyTime is not None:
            subhourlyTime = int(fact.subhourlyTime)
        else:
            subhourlyTime = 0
        if subhourlyTime == 60: # JFreeChart can't handle the 1-60 representation of minute in CRN
            subhourlyTime = 0
        minute = Minute(subhourlyTime,hour,date.getDay(),date.getMonth()+1,date.getYear()) # JFreeChart's representation of time
        if series not in datasets:
            datasets[series] = TimeSeries(series)
        datasets[series].add(minute,float(fact.value))
    
    timeSeriesCollection = TimeSeriesCollection()
    for dataset in datasets.values():
        timeSeriesCollection.addSeries(dataset)

    chart = ChartFactory.createTimeSeriesChart("", "UTC Date", "Value", timeSeriesCollection, True, True, False)
    plot = chart.getPlot()

    r = plot.getRenderer()
    r.setStroke(BasicStroke(lineWidth))
    
    frame = ChartFrame(title, chart)
    frame.pack()
    frame.setVisible(True)
    return plot
Exemple #2
0
def plot(title, x_label, y_label, *curves):
    dataset = XYSeriesCollection()
    for legend, curve in curves:
        series = XYSeries(legend)
        for x, y in curve:
            series.add(x, y)
        dataset.addSeries(series)
    chart = ChartFactory.createXYLineChart(title, x_label, y_label, dataset,
                                           PlotOrientation.VERTICAL, True,
                                           True, False)
    frame = ChartFrame(title, chart)
    frame.setVisible(True)
    frame.setSize(400, 300)
def createHistogram(data):
    ''' Creates a histogram from a list of arbitrary numerical data in range from 0..1'''
    from org.jfree.data.category import DefaultCategoryDataset
    from org.jfree.chart import ChartFactory,ChartFrame
    from org.jfree.chart.plot import PlotOrientation
    from java.lang import Float
    
    numBins=20
    datamin = min(data)
    datamax = max(data)
    #binsize = 1.01 / numBins

    bins = {}
    for d in data:
        binkey = round(d,1)
        bin = bins.setdefault(binkey,0)
        bins[binkey] = bin + 1
        
    # Create dataset from bins
    dataset = DefaultCategoryDataset()

    # Ensure that bins exist even if they're empty
    i = datamin
    while i <= 1.0:
        bins.setdefault(round(float(i),1),0)
        i += .1
        
    #print "Number of bins:",len(bins)
    for bin in sorted(bins):
        #print "bin:",bin,type(bin)
        dataset.addValue(bins[bin],"","%05.2f"%(bin))
    
    # Create chart from dataset
    chart = ChartFactory.createBarChart(
                "", # chart title
                "Bin", # domain axis label
                "Number of occurrences", # range axis label
                dataset, # data
                PlotOrientation.VERTICAL, # orientation
                True, # include legend
                True, # tooltips?
                False # URLs?
                )
    plot = chart.getPlot()
    plot.getRenderer().setShadowVisible(False)
    frame = ChartFrame("Histogram", chart);
    frame.pack();
    frame.setVisible(True);
    return plot
def plot2D(points, Ca, Cb):
	maxIntensity = 255.0
	dataset = XYSeriesCollection()

	seriesNN = XYSeries(channels[Ca+1]+" -ve "+channels[Cb+1]+" -ve")
	seriesPP = XYSeries(channels[Ca+1]+" +ve "+channels[Cb+1]+" +ve")
	seriesNP = XYSeries(channels[Ca+1]+" -ve "+channels[Cb+1]+" +ve")
	seriesPN = XYSeries(channels[Ca+1]+" +ve "+channels[Cb+1]+" -ve")
	for p in points:
		posA = channels[Ca+1] in thresholds and p[Ca]>thresholds[ channels[Ca+1] ]
		posB = channels[Cb+1] in thresholds and p[Cb]>thresholds[ channels[Cb+1] ]
		if posA and posB:
			seriesPP.add(p[Cb], p[Ca])
		elif posA:
			seriesPN.add(p[Cb], p[Ca])
		elif posB:
			seriesNP.add(p[Cb], p[Ca])
		else:
			seriesNN.add(p[Cb], p[Ca])
	dataset.addSeries(seriesNN)
	dataset.addSeries(seriesPN)
	dataset.addSeries(seriesNP)
	dataset.addSeries(seriesPP)
	
	chart = ChartFactory.createScatterPlot( title+" - "+channels[Cb+1]+" vs "+channels[Ca+1], channels[Cb+1], channels[Ca+1], dataset, PlotOrientation.VERTICAL, False,True,False )
	plot = chart.getPlot()
	plot.getDomainAxis().setRange(Range(0.00, maxIntensity), True, False)
	plot.getRangeAxis().setRange(Range(0.00, maxIntensity), True, False)
	renderer = chart.getPlot().getRenderer()
	
	renderer.setSeriesPaint(0, Color(64,64,64)) #NN
	renderer.setSeriesPaint(1, Color(0,255,0)) #PN
	renderer.setSeriesPaint(2, Color(0,0,255)) #NP
	renderer.setSeriesPaint(3, Color(0,255,255)) #PP

	shape = Ellipse2D.Float(-1,-1,3,3)
	renderer.setSeriesShape(0, shape )
	renderer.setSeriesShape(1, shape )
	renderer.setSeriesShape(2, shape )
	renderer.setSeriesShape(3, shape )
	
	frame = ChartFrame(title+" - "+channels[Cb+1]+" vs "+channels[Ca+1], chart)
	frame.setSize(800, 800)
	frame.setLocationRelativeTo(None)
	frame.setVisible(True)
Exemple #5
0
def graphArbitraryData(data,title=""):
    ''' Creates a line graph of arbitrary data (as opposed to the rather specific format used by graph()). Pass in a 
        list of datapoints, each consisting of a 3-part tuple: (x,y,category). If you're only graphing one sort of
        data (ie you want a graph with one line), you can pass in any constant for category.
        
        Example (one category):
            data = []
            for i in range(10):
                data.append((i,i*i,0))
            graphArbitraryData(data)
        
        Example (multiple categories):
            data = []
            for i in range(30):
                data.append((i,i*i,"squared"))
                data.append((i,i*i*i,"cubed"))
            graphArbitraryData(data)

    '''
    from org.jfree.data.category import DefaultCategoryDataset
    from org.jfree.chart import ChartFactory, ChartFrame, ChartPanel
    from org.jfree.chart.plot import PlotOrientation
    from org.jfree.data.xy import XYSeriesCollection, XYSeries

    datasets = {} # dict of all series

    # First, create the individual series from the data
    for item in data:
        seriesname = str(item[2])
        if seriesname not in datasets:
            datasets[seriesname] = XYSeries(seriesname)
        datasets[seriesname].add(float(item[0]), float(item[1]));

    # Second, add those series to a collection
    datasetcollection = XYSeriesCollection()    
    for key in datasets:
        datasetcollection.addSeries(datasets[key])
        
    chart = ChartFactory.createXYLineChart("","","",datasetcollection,PlotOrientation.VERTICAL,True,True,False) 
    frame = ChartFrame(title, chart);
    frame.pack();
    frame.setVisible(True);
    panel = ChartPanel(chart)
    return chart.getPlot()
def histogram(title, values):
    dataset = HistogramDataset()
    dataset.setType(HistogramType.RELATIVE_FREQUENCY)

    #NBINS = int(maths.sqrt(len(values)))
    #NBINS = int( (max(values)-min(values))/binW )
    NBINS = 64

    dataset.addSeries(title, values, NBINS)
    chart = ChartFactory.createHistogram(title, "Distance (nm)",
                                         "Relative Frequency", dataset,
                                         PlotOrientation.VERTICAL, False, True,
                                         False)
    plot = chart.getXYPlot()

    renderer = plot.getRenderer()
    renderer.setSeriesPaint(0, Colour.BLUE)
    painter = StandardXYBarPainter()
    renderer.setBarPainter(painter)
    frame = ChartFrame(title, chart)
    frame.setSize(1200, 800)
    frame.setLocationRelativeTo(None)
    frame.setVisible(True)
def measure(stack, cells, nuclei):
    time = [ (t-1)*cal.frameInterval for t in range(T+1) ]
    cellValues0 = [ 0.0 for t in range(T+1) ]
    cellValues1 = [ 0.0 for t in range(T+1) ]
    cellAreas0 = [ 0.0 for t in range(T+1) ]
    cellAreas1 = [ 0.0 for t in range(T+1) ]
    nucleusValues0 = [ 0.0 for t in range(T+1) ]
    nucleusValues1 = [ 0.0 for t in range(T+1) ]
    nucleusAreas0 = [ 0.0 for t in range(T+1) ]
    nucleusAreas1 = [ 0.0 for t in range(T+1) ]
    nonNucleusValues0 = [ 0.0 for t in range(T+1) ]
    nonNucleusValues1 = [ 0.0 for t in range(T+1) ]

    for t in range(1,T+1):
        ip = stack.getProcessor(t)

        if cells[t] is None:
            continue


        #subtract background Z from all intensity Z measurements
        if cells [t] is None:
            print("Nocellsfound" + str(t))
        bothCells = ShapeRoi(cells[t][0]).or(ShapeRoi(cells[t][1]))
        backRoi = ShapeRoi(Rectangle(0,0,imp.getWidth(),imp.getHeight())).not( bothCells )


        ip.setRoi(backRoi)
        backMean = ip.getStatistics().mean

        ip.setRoi( cells[t][0] )
        stats0 = ip.getStatistics()
        cellValues0[t] = stats0.mean - backMean
        cellAreas0[t] = stats0.area * cal.pixelWidth * cal.pixelHeight
        nuc0 = None
        for nuc in nuclei[t]:
            rect = nuc.getBounds()
            nx = int(rect.x+(rect.width/2.0))
            ny = int(rect.y+(rect.height/2.0))
            if cells[t][0].contains(nx,ny):
                nuc0 = nuc
                break
        if nuc0 is not None:
            ip.setRoi( nuc0 )
            nucStats0 = ip.getStatistics()
            nucleusValues0[t] = nucStats0.mean - backMean
            nucleusAreas0[t] = nucStats0.area * cal.pixelWidth * cal.pixelHeight
            nuc0.setPosition(0,0,t)
            nuc0.setStrokeColor(Color.CYAN)
            ol.add(nuc0)
            nonnucRoi0 = ShapeRoi(cells[t][0]).not( ShapeRoi(nuc0) )
            ip.setRoi( nonnucRoi0 )
            nonNucleusValues0[t] = ip.getStatistics().mean - backMean

        ip.setRoi( cells[t][1] )
        stats1 = ip.getStatistics()
        cellValues1[t] = stats1.mean - backMean
        cellAreas1[t] = stats1.area * cal.pixelWidth * cal.pixelHeight
        nuc1 = None
        for nuc in nuclei[t]:
            rect = nuc.getBounds()
            nx = int(rect.x+(rect.width/2.0))
            ny = int(rect.y+(rect.height/2.0))
            if cells[t][1].contains(nx,ny):
                nuc1 = nuc
                break
        if nuc1 is not None:
            ip.setRoi( nuc1 )
            nucStats1 = ip.getStatistics()
            nucleusValues1[t] = nucStats1.mean - backMean
            nucleusAreas1[t] = nucStats1.area * cal.pixelWidth * cal.pixelHeight
            nuc1.setPosition(0,0,t)
            nuc1.setStrokeColor(Color.CYAN)
            ol.add(nuc1)
            nonnucRoi1 = ShapeRoi(cells[t][1]).not( ShapeRoi(nuc1) )
            ip.setRoi( nonnucRoi1 )
            nonNucleusValues1[t] = ip.getStatistics().mean - backMean

    rt = ResultsTable()
    rt.showRowNumbers(False)
    for t in range(1,T+1):
        rt.setValue("Time ("+cal.getTimeUnit()+")", t-1, IJ.d2s(time[t],1))
        areaRatio = cellAreas0[t] / cellAreas1[t] if cellAreas0[t]>0 and cellAreas1[t]>0 else 0.0
        rt.setValue("Cell 0:Cell 1 Area Ratio", t-1, areaRatio)

        nucleusRatio = nucleusValues0[t] / nucleusValues1[t] if nucleusValues0[t]>0 and nucleusValues1[t]>0 else 0.0
        rt.setValue("Cell 0:Cell 1 Nucleus Ratio", t-1, nucleusRatio)
        nonNucleusRatio = nonNucleusValues0[t] / nonNucleusValues1[t] if nonNucleusValues0[t]>0 and nonNucleusValues1[t]>0 else 0.0
        rt.setValue("Cell 0:Cell 1 Non-Nucleus Ratio", t-1, nonNucleusRatio)

        nnnRatio0 = nucleusValues0[t] / nonNucleusValues0[t] if nucleusValues0[t]>0 and nonNucleusValues0[t]>0 else 0.0
        rt.setValue("Cell 0 Nucleus:Non-Nucleus Ratio", t-1, nnnRatio0)
        nnnRatio1 = nucleusValues1[t] / nonNucleusValues1[t] if nucleusValues1[t]>0 and nonNucleusValues1[t]>0 else 0.0
        rt.setValue("Cell 1 Nucleus:Non-Nucleus Ratio", t-1, nnnRatio1)

        rt.setValue("Cell 0 (red) Area ("+cal.getUnit()+u"\u00b2"+")", t-1, cellAreas0[t])
        rt.setValue("Cell 0 Nucleus Area ("+cal.getUnit()+u"\u00b2"+")", t-1, nucleusAreas0[t])
        rt.setValue("Cell 0 All", t-1, cellValues0[t])
        rt.setValue("Cell 0 Nucleus", t-1, nucleusValues0[t])
        rt.setValue("Cell 0 Non-Nucleus", t-1, nonNucleusValues0[t])
        rt.setValue("Cell 1 (green) Area ("+cal.getUnit()+u"\u00b2"+")", t-1, cellAreas1[t])
        rt.setValue("Cell 1 Nucleus Area ("+cal.getUnit()+u"\u00b2"+")", t-1, nucleusAreas1[t])
        rt.setValue("Cell 1 All", t-1, cellValues1[t])
        rt.setValue("Cell 1 Nucleus", t-1, nucleusValues1[t])
        rt.setValue("Cell 1 Non-Nucleus", t-1, nonNucleusValues1[t])
    rt.show(imp.getTitle()+"-Results")

    dataset = DefaultXYDataset()
    dataset.addSeries( "Cell 0", [time[1:], cellValues0[1:]] )
    dataset.addSeries( "Cell 1", [time[1:], cellValues1[1:]] )
    dataset.addSeries( "Nucleus 0", [time[1:], nucleusValues0[1:]] )
    dataset.addSeries( "Nucleus 1", [time[1:], nucleusValues1[1:]] )
    dataset.addSeries( "Non-Nucleus 0", [time[1:], nonNucleusValues0[1:]] )
    dataset.addSeries( "Non-Nucleus 1", [time[1:], nonNucleusValues1[1:]] )

    chart = ChartFactory.createScatterPlot( imp.getTitle(), "Time ("+cal.getTimeUnit()+")", "Intensity Z", dataset, PlotOrientation.VERTICAL, True,True,False )
    plot = chart.getPlot()

    plot.setBackgroundPaint(Color(64, 128, 255))
    plot.setDomainGridlinePaint(Color.BLACK)
    plot.setRangeGridlinePaint(Color.BLACK)

    renderer = plot.getRenderer()
    legend = LegendItemCollection()
    shapeR = 2.0
    nucShape = Ellipse2D.Float(-shapeR,-shapeR,shapeR*2,shapeR*2)
    nonNucShape = Path2D.Float()
    nonNucShape.moveTo(-shapeR,-shapeR)
    nonNucShape.lineTo(shapeR,shapeR)
    nonNucShape.moveTo(shapeR,-shapeR)
    nonNucShape.lineTo(-shapeR,shapeR)
    for s in range(dataset.getSeriesCount()):

        if s == 0:
            renderer.setSeriesLinesVisible(s, True)
            renderer.setSeriesShapesVisible(s, False)
            renderer.setSeriesStroke(s, BasicStroke(1))
            renderer.setSeriesPaint(s, Color.RED)
            legend.add( LegendItem("Cell 0", Color.RED) )
        elif s == 1:
            renderer.setSeriesLinesVisible(s, True)
            renderer.setSeriesShapesVisible(s, False)
            renderer.setSeriesStroke(s, BasicStroke(1))
            renderer.setSeriesPaint(s, Color.GREEN)
            legend.add( LegendItem("Cell 1", Color.GREEN) )
        elif s == 2:
            renderer.setSeriesLinesVisible(s, False)
            renderer.setSeriesShapesVisible(s, True)
            renderer.setSeriesShape(s, nucShape)
            renderer.setSeriesPaint(s, Color.RED)
        elif s == 3:
            renderer.setSeriesLinesVisible(s, False)
            renderer.setSeriesShapesVisible(s, True)
            renderer.setSeriesShape(s, nucShape)
            renderer.setSeriesPaint(s, Color.GREEN)
        elif s == 4:
            renderer.setSeriesLinesVisible(s, False)
            renderer.setSeriesShapesVisible(s, True)
            renderer.setSeriesShape(s, nonNucShape)
            renderer.setSeriesPaint(s, Color.RED)
        elif s == 5:
            renderer.setSeriesLinesVisible(s, False)
            renderer.setSeriesShapesVisible(s, True)
            renderer.setSeriesShape(s, nonNucShape)
            renderer.setSeriesPaint(s, Color.GREEN)


    plot.setFixedLegendItems(legend)

    frame = ChartFrame(imp.getTitle()+" Z-Normalised Intensity", chart)
    frame.pack()
    frame.setSize( Dimension(800, 800) )
    frame.setLocationRelativeTo(None)
    frame.setVisible(True)
Exemple #8
0
def histogram(*data,**kwargs):
    ''' Creates a histogram. Takes the output from getData (a list of Facts), or alternately the
        same parameters that getData() takes. Takes an optional 'numBins=k' argument, where k
        specifies the number of bins. Returns the plot object in case you want to customize the 
        graph in some way. Takes an optional 'title' argument.
    '''
    # TODO: offset labels.
    from org.jfree.data.category import DefaultCategoryDataset
    from org.jfree.chart import ChartFactory,ChartFrame
    from org.jfree.chart.plot import PlotOrientation
    from java.lang import Float
    
    # Were we passed a dataset or parameters for obtaining a dataset?
    if len(data) == 3:
        station,date,element = data
        histogram(getData(station,date,element),**kwargs)
        return
    else:
        data = data[0] # unwrap from tuple
    
    # Find min and max; decide on number of bins
    numBins=kwargs.get('numBins',16)
    datamin,datamax = _getminmax(data)
    binsize = abs((datamax - datamin) / (Decimal(numBins)*Decimal("0.999"))) # divide by .999; otherwise there's always a final bin with one member, the max
    if binsize == 0: 
        raise Exception("Cannot create histogram; all values are equal to "+str(datamin))
    
    title = kwargs.get('title',"Histogram")
    
    # Create bins based on value.
    stations = {}
    for d in data:
        if d.value in missingValues: continue
        binkey = round(float(datamin + binsize * int((d.value - datamin) / binsize)),2)
        name = d.station.getNameString()+", "+d.element.name
        bin = stations.setdefault(name,{}).setdefault(binkey,0)
        stations[name][binkey] = bin + 1
    # Create dataset from bins
    dataset = DefaultCategoryDataset()
    for station in stations:
        
        # Ensure that bins exist even if they're empty
        i = datamin
        while i < datamax:
            stations[station].setdefault(round(float(i),2),0)
            i += binsize
            
        #print "Number of bins:",len(stations[station])
        for bin in sorted(stations[station]):
            #print "bin:",bin,type(bin)
            dataset.addValue(stations[station][bin],station,Float(bin))
    
    # Create chart from dataset
    chart = ChartFactory.createBarChart(
                "", # chart title
                "Bin", # domain axis label
                "Number of occurrences", # range axis label
                dataset, # data
                PlotOrientation.VERTICAL, # orientation
                True, # include legend
                True, # tooltips?
                False # URLs?
                )
    plot = chart.getPlot()
    plot.getRenderer().setShadowVisible(False)
    frame = ChartFrame(title, chart);
    frame.pack();
    frame.setVisible(True);
    return plot
Exemple #9
0
def scatter(data,x=None,y=None,**kwargs):
    ''' Creates a scatter plot comparing two elements. At minimum, takes a collection of data.
        The second and third arguments, if they exist, are treated as the two elements to 
        compare. If these arguments do not exist, the first two elements in the list are 
        compared. If an optional regress=True argument is present, superimposes a linear 
        regression for each series and prints some related info (R-value etc). 
        Note that scatter plots can be zoomed with the mouse. Returns the plot object in
        case you want to customize the graph in some way. Takes an optional showMissing argument 
        which determines whether missing values (-9999.0) should be displayed. 
        Examples: scatter(data), scatter(data,"tmin","tmax",regress=True)
    '''
    from org.jfree.data.xy import XYSeriesCollection,XYSeries
    from org.jfree.data import UnknownKeyException
    from org.jfree.chart import ChartFactory,ChartFrame
    from org.jfree.chart.plot import PlotOrientation,DatasetRenderingOrder
    from org.jfree.chart.renderer.xy import XYLineAndShapeRenderer
    from java.awt import Color
    
    regress=kwargs.get('regress',False)
    showMissing=kwargs.get('showMissing',False)
    
    # Try to be flexible about element parameters
    if x is not None: x = findElement(x).name
    if y is not None: y = findElement(y).name

    # Create a dataset from the data
    collection = XYSeriesCollection()
    for ob in data.groupedByObservation().items():
        key,values = ob
        name = str(key[0])
        if x==None:
            x = values[0].element.name
        try:
            xFact = (i for i in values if i.element.name == x).next()
        except StopIteration: # missing value
            continue
        xval  = xFact.value
        if xval in missingValues and not showMissing: continue  
        if y==None:
            try:
                y = values[1].element.name
            except IndexError:
                raise Exception("Error! Your data request returned only 1 value per observation. " 
                                "Must have 2 values to generate a scatter plot.")
        try:
            yFact = (i for i in values if i.element.name == y).next()
        except StopIteration: # missing value
            continue
        yval  = yFact.value
        if yval in missingValues and not showMissing: continue  
        
        try: 
            series = collection.getSeries(name)
        except UnknownKeyException:
            collection.addSeries(XYSeries(name))
            series = collection.getSeries(name)
        
        series.add(float(xval),float(yval))

    # Create chart from dataset        
    chart = ChartFactory.createScatterPlot( "", x, y, collection, PlotOrientation.VERTICAL,
                                            True, True, False );
    plot = chart.getPlot()
    frame = ChartFrame("Scatter Plot", chart);
    frame.pack();
    frame.setVisible(True);

    # Superimpose regression if desired
    if regress:
        regressioncollection = XYSeriesCollection()
        for series in collection.getSeries():
            regression = _getregression(series)
            x1 = series.getMinX()
            y1 = regression.predict(x1)
            x2 = series.getMaxX()
            y2 = regression.predict(x2)
            regressionseries = XYSeries(series.getKey())
            regressionseries.add(float(x1),float(y1))
            regressionseries.add(float(x2),float(y2))
            regressioncollection.addSeries(regressionseries)

            print series.getKey(),":"
            print "  R:            %8.4f" % regression.getR()
            print "  R-squared:    %8.4f" % regression.getRSquare()
            print "  Significance: %8.4f" % regression.getSignificance()
            print
            
        plot.setDataset(1,regressioncollection)
        regressionRenderer = XYLineAndShapeRenderer(True,False)
        plot.setRenderer(1,regressionRenderer)
        plot.setDatasetRenderingOrder(DatasetRenderingOrder.FORWARD);
        
        colors = [0xec0000,0x58b911,0x6886ea,0xedd612,0xa93bb9,0xffb71b,0xe200df,0x1de2b6,0xdc91db,0x383838,0xb09344,0x4ea958,0xd78c9e,0x64008d,0xb0c95b]
        mainRenderer = plot.getRenderer(0)
        for i in range(collection.getSeriesCount()):
            try:
                mainRenderer.setSeriesPaint(i,Color(colors[i]))
                regressionRenderer.setSeriesPaint(i,Color(colors[i]))
            except IndexError: # Finite # of colors in the color array; beyond that let jfreechart pick
                break
        '''
        # Jump through some hoops to ensure regressions are same color as scatters for each series.
        # Initially: doesn't work because series are not indexed the same. And I don't see a way
        # to get the actual series from the renderer in order to compare names or something.
        mainRenderer = plot.getRenderer(0)
        print "Renderer is",type(mainRenderer)
        index = 0
        paint = mainRenderer.lookupSeriesPaint(index)
        print "Paint is",type(paint)
        while (paint is not None):
            print "Setting paint."
            regressionRenderer.setSeriesPaint(index,paint)
            index += 1
            paint = mainRenderer.getSeriesPaint(index)
        '''
        return plot