How to add two lines with different renderers in JFreeChart?

A discussion forum for JFreeChart (a 2D chart library for the Java platform).
Locked
Srilatha
Posts: 1
Joined: Tue Dec 05, 2006 5:34 am
Location: Bangalore
Contact:

How to add two lines with different renderers in JFreeChart?

Post by Srilatha » Thu Dec 07, 2006 6:11 am

Hi ,
Can u suggest me how to go about the problem?
I want to plot two different lines with different renderer types into single JFree chart.One line i want to plot as without default shapes.and the other line, I want to plot as with default shapes.
Pls. make a note that is I need to get x-axis length as 100%.
Here, I have added the code which i have written:
Please take a look at this code and suggest me how to go about this further:

Code: Select all

 //Create and populate an XY series Collection
	        XYSeries dataSeries = new XYSeries("Index");
	        XYSeries benchData = new XYSeries("BenchMarkIndex");
	        Iterator iter = lstSummary.listIterator();
	        while (iter.hasNext()) 
	        {
	        	SatisfactionIndex indexSummary = (SatisfactionIndex)iter.next();
	            dataSeries.add(getDate(indexSummary.getSurveyDate()).getTime(), indexSummary.getSatisfactionIndex());
	            benchData.add(getDate(indexSummary.getSurveyDate()).getTime(),indexSummary.getIndexValue());
	        }
	        XYSeriesCollection xyDataset = new XYSeriesCollection(dataSeries);
	        XYSeriesCollection xybenchdata = new XYSeriesCollection(benchData);
	        SimpleDateFormat sdf = new SimpleDateFormat("dd-MMM-yyyy", Locale.UK);
	
	        StandardXYToolTipGenerator ttg = new StandardXYToolTipGenerator(
	                        StandardXYToolTipGenerator.DEFAULT_TOOL_TIP_FORMAT, sdf, NumberFormat.getInstance());
	
	        //Create the chart object
	        ValueAxis timeAxis = new DateAxis("");
	        NumberAxis valueAxis = new NumberAxis("");
	        
	        valueAxis.setAutoRangeIncludesZero(true);  // override default
	        StandardXYItemRenderer renderer = new StandardXYItemRenderer(
	                        StandardXYItemRenderer.LINES + StandardXYItemRenderer.SHAPES, ttg, null);
	        
	        StandardXYItemRenderer renderer1 = new StandardXYItemRenderer(
                    StandardXYItemRenderer.LINES , ttg, null);
	        
	        renderer.setShapesFilled(true);
	        
	        XYPlot plot = new XYPlot(xyDataset, timeAxis, valueAxis, renderer);
	        XYPlot plot1 = new XYPlot(xybenchdata, timeAxis, valueAxis, renderer1);
//	        HmsPlotListener hpl=new HmsPlotListener(plot1);
//	        plot.addChangeListener(hpl);

	        CombinedRangeXYPlot crxyplot=new CombinedRangeXYPlot(valueAxis);
	        crxyplot.add(plot,3);
	        crxyplot.add(plot1,1);
	        JFreeChart chart = new JFreeChart("", JFreeChart.DEFAULT_TITLE_FONT, crxyplot , true);
	       // JFreeChart chart1 = new JFreeChart("", JFreeChart.DEFAULT_TITLE_FONT, plot1 , false);
	        chart.setBackgroundPaint(java.awt.Color.white);
	       
	        ChartRenderingInfo info = new ChartRenderingInfo(new StandardEntityCollection());
	        BufferedImage chartImage = chart.createBufferedImage(400, 250, info); 
	      
	        //Put the chart as BufferedImage in session,  
	        //thus making it available for the image reading action Action. 
	        HttpSession session = req.getSession(false);
	        session.setAttribute("chartImage", chartImage); 
	
	        //Tool tip stuff
	        StringWriter oStringWriter = new StringWriter() ; 
	        PrintWriter printwriter = new PrintWriter( oStringWriter ); 
	        ChartUtilities.writeImageMap(printwriter, "imageMap", info, false); 
	        String strMapInfo = oStringWriter.toString() ; 
	        req.setAttribute("mapInfo",strMapInfo);
========
Regards,
Srilatha

demonhead
Posts: 24
Joined: Thu May 25, 2006 5:44 am

Re: How to add two lines with different renderers in JFreeCh

Post by demonhead » Fri Dec 22, 2006 12:57 pm

Srilatha wrote:Hi ,
Can u suggest me how to go about the problem?
I want to plot two different lines with different renderer types into single JFree chart.One line i want to plot as without default shapes.and the other line, I want to plot as with default shapes.
Pls. make a note that is I need to get x-axis length as 100%.
Here, I have added the code which i have written:
Please take a look at this code and suggest me how to go about this further:

Code: Select all

 //Create and populate an XY series Collection
	        XYSeries dataSeries = new XYSeries("Index");
	        XYSeries benchData = new XYSeries("BenchMarkIndex");
	        Iterator iter = lstSummary.listIterator();
	        while (iter.hasNext()) 
	        {
	        	SatisfactionIndex indexSummary = (SatisfactionIndex)iter.next();
	            dataSeries.add(getDate(indexSummary.getSurveyDate()).getTime(), indexSummary.getSatisfactionIndex());
	            benchData.add(getDate(indexSummary.getSurveyDate()).getTime(),indexSummary.getIndexValue());
	        }
	        XYSeriesCollection xyDataset = new XYSeriesCollection(dataSeries);
	        XYSeriesCollection xybenchdata = new XYSeriesCollection(benchData);
	        SimpleDateFormat sdf = new SimpleDateFormat("dd-MMM-yyyy", Locale.UK);
	
	        StandardXYToolTipGenerator ttg = new StandardXYToolTipGenerator(
	                        StandardXYToolTipGenerator.DEFAULT_TOOL_TIP_FORMAT, sdf, NumberFormat.getInstance());
	
	        //Create the chart object
	        ValueAxis timeAxis = new DateAxis("");
	        NumberAxis valueAxis = new NumberAxis("");
	        
	        valueAxis.setAutoRangeIncludesZero(true);  // override default
	        StandardXYItemRenderer renderer = new StandardXYItemRenderer(
	                        StandardXYItemRenderer.LINES + StandardXYItemRenderer.SHAPES, ttg, null);
	        
	        StandardXYItemRenderer renderer1 = new StandardXYItemRenderer(
                    StandardXYItemRenderer.LINES , ttg, null);
	        
	        renderer.setShapesFilled(true);
	        
	        XYPlot plot = new XYPlot(xyDataset, timeAxis, valueAxis, renderer);
	        XYPlot plot1 = new XYPlot(xybenchdata, timeAxis, valueAxis, renderer1);
//	        HmsPlotListener hpl=new HmsPlotListener(plot1);
//	        plot.addChangeListener(hpl);

	        CombinedRangeXYPlot crxyplot=new CombinedRangeXYPlot(valueAxis);
	        crxyplot.add(plot,3);
	        crxyplot.add(plot1,1);
	        JFreeChart chart = new JFreeChart("", JFreeChart.DEFAULT_TITLE_FONT, crxyplot , true);
	       // JFreeChart chart1 = new JFreeChart("", JFreeChart.DEFAULT_TITLE_FONT, plot1 , false);
	        chart.setBackgroundPaint(java.awt.Color.white);
	       
	        ChartRenderingInfo info = new ChartRenderingInfo(new StandardEntityCollection());
	        BufferedImage chartImage = chart.createBufferedImage(400, 250, info); 
	      
	        //Put the chart as BufferedImage in session,  
	        //thus making it available for the image reading action Action. 
	        HttpSession session = req.getSession(false);
	        session.setAttribute("chartImage", chartImage); 
	
	        //Tool tip stuff
	        StringWriter oStringWriter = new StringWriter() ; 
	        PrintWriter printwriter = new PrintWriter( oStringWriter ); 
	        ChartUtilities.writeImageMap(printwriter, "imageMap", info, false); 
	        String strMapInfo = oStringWriter.toString() ; 
	        req.setAttribute("mapInfo",strMapInfo);


Alternately if you could use category plot i know the solution.

jfreeuser2006
Posts: 59
Joined: Mon Nov 20, 2006 1:00 pm

series color

Post by jfreeuser2006 » Thu Jan 04, 2007 6:32 am

Hi,

I have this code:

Code: Select all


ChartPostProcessor cpp = new ChartPostProcessor() {

    public void processChart(Object chart, Map params) {
        final JFreeChart chart1 = (JFreeChart)chart;
        final CategoryPlot plot = chart1.getCategoryPlot();

        plot.setBackgroundPaint(Color.white);
        //display domain labels vertically
        plot.getDomainAxis().setCategoryLabelPositions(plot.getDomainAxis().getCategoryLabelPositions().UP_90);

        plot.setRenderer(new LineAndShapeRenderer() {
            public Paint getItemPaint(int row, int item) {
                double y = plot.getDataset().getValue(row, item).doubleValue();
                if ((y >= usl)||(y <= lsl) || (y >= ucl) || (y <= lcl)) {
                    return Color.RED;
                }
                return Color.BLUE;

            }

            public Shape getItemShape(int row, int item) {
                return ShapeUtilities.createDiamond(2.0f);
            }
        });

        //set upper and lower bounds of graph
        NumberAxis yAxis=(NumberAxis) plot.getRangeAxis();
        yAxis.setAutoRangeIncludesZero(false);
        yAxis.setUpperBound(upperbound);
        yAxis.setLowerBound(lowerbound);

        //set line color and labels of points
        plot.getRenderer().setSeriesPaint(0, Color.magenta);
        plot.getRenderer().setSeriesPaint(1, Color.green);
        plot.getRenderer().setSeriesPaint(2, Color.black);
};

but when i set the series paint, it doesn't work. the color is still blue for the 3 lines.

any help would be appreciated :-)

Locked