XYSpline without shapes?

A discussion forum for JFreeChart (a 2D chart library for the Java platform).
Locked
Melodioso
Posts: 4
Joined: Thu Jul 08, 2010 1:10 pm
antibot: No, of course not.

XYSpline without shapes?

Post by Melodioso » Thu Jul 08, 2010 1:21 pm

Hello,

Is it possible to create a smooth graph using the XYSpline renderer, but without shapes (little boxes at the data)?

Right now, doing this:

Code: Select all

XYPlot xyplot = chart.getXYPlot();
xyplot.setRenderer(new XYSplineRenderer());
... creates a nice smoothed line plot. But adding the usual lines to get rid of the shapes :

Code: Select all

XYLineAndShapeRenderer renderer = new XYLineAndShapeRenderer();
renderer.setSeriesShapesVisible(1, false);
xyplot.setRenderer(renderer);
... replaces the previous XYSpline render, and print a regular graph without the shapes.

Any help is appreciated :D
Thanks!

Melodioso
Posts: 4
Joined: Thu Jul 08, 2010 1:10 pm
antibot: No, of course not.

Re: XYSpline without shapes?

Post by Melodioso » Thu Jul 08, 2010 1:29 pm

Answering my own (dumb) question (sorry, kind of tired):

Code: Select all

XYLineAndShapeRenderer renderer = new XYSplineRenderer();
renderer.setSeriesShapesVisible(0, false);
XYPlot xyplot = chart.getXYPlot();
xyplot.setRenderer(renderer);

bruehlicke
Posts: 25
Joined: Thu Apr 03, 2008 5:51 pm
Location: Houston, TX, USA

Re: XYSpline without shapes?

Post by bruehlicke » Fri Mar 31, 2017 3:41 pm

Yea, that's the way it worked in 1.0.9 but this is not working in 1.0.19 anymore. Using that code as is you will see no line at all. I am currently looking how to get this functionality back in 1.0.19 - if you are using 1.0.19 and solved this please share.

david.gilbert
JFreeChart Project Leader
Posts: 11734
Joined: Fri Mar 14, 2003 10:29 am
antibot: No, of course not.
Contact:

Re: XYSpline without shapes?

Post by david.gilbert » Fri Mar 31, 2017 7:04 pm

I will try to take a look over the weekend. I don't use this renderer myself, but it would be good to have it working in the next release.
David Gilbert
JFreeChart Project Leader

:idea: Read my blog
:idea: Support JFree via the Github sponsorship program

bruehlicke
Posts: 25
Joined: Thu Apr 03, 2008 5:51 pm
Location: Houston, TX, USA

Re: XYSpline without shapes?

Post by bruehlicke » Fri Mar 31, 2017 11:08 pm

Before you waste your time, I will run a few standalone tests to see if it is due to a special situation. Than I can share the code. For now I just have code working with 1.0.9 and not working with 1.0.19. I will update over the weekend.

david.gilbert
JFreeChart Project Leader
Posts: 11734
Joined: Fri Mar 14, 2003 10:29 am
antibot: No, of course not.
Contact:

Re: XYSpline without shapes?

Post by david.gilbert » Sat Apr 01, 2017 8:08 am

The demo programs do seem to be working OK for me.
David Gilbert
JFreeChart Project Leader

:idea: Read my blog
:idea: Support JFree via the Github sponsorship program

bruehlicke
Posts: 25
Joined: Thu Apr 03, 2008 5:51 pm
Location: Houston, TX, USA

Re: XYSpline without shapes?

Post by bruehlicke » Sat Apr 01, 2017 5:26 pm

Yes. Also for me it works in a test standalone app. I made quickly the code below which is more or less similar to the actual code failing ... still - works in the test standalone

When running the actual code with 1.0.19 it only shows the Shapes not the line between Not when using 1.0.9. If I turn them off the shapes, I do not see anything. So for now I hacked in to draw small circles as shapes to at least see the red "curve" ... bummer ... will have to dig deeper to see what environmental difference is causing this.

Test code below works fine. I share it since I anyway wrote it for this XYSplineRenderer test.

Code: Select all

package demos;

import java.awt.Color;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.NumberAxis;
import org.jfree.chart.axis.ValueAxis;
import org.jfree.chart.labels.StandardXYToolTipGenerator;
import org.jfree.chart.plot.CombinedRangeXYPlot;
import org.jfree.chart.plot.XYPlot;
import org.jfree.chart.renderer.xy.XYDifferenceRenderer;
import org.jfree.chart.renderer.xy.XYLineAndShapeRenderer;
import org.jfree.chart.renderer.xy.XYSplineRenderer;
import org.jfree.chart.title.TextTitle;
import org.jfree.data.xy.DefaultXYDataset;
import org.jfree.data.xy.XYSeries;
import org.jfree.data.xy.XYSeriesCollection;
import org.jfree.ui.ApplicationFrame;
import org.jfree.ui.RefineryUtilities;

/**
 * Testing XYSplineRenderer in 1.0.19
 * 
 * @author Bernd Ruehlicke
 */
public class XYSplineRendererDemo extends ApplicationFrame {
        private double[] xvalues = new double[10];   
        private double[] yvalues = new double[10];
        private double[][] _data = new double[][]{xvalues, yvalues};
        private XYLineAndShapeRenderer _xyitemrenderer;
        private XYLineAndShapeRenderer _xyitemrendererH;
        private static NumberAxis _dAxis = new NumberAxis("0");
        private static NumberAxis _hAxis = new NumberAxis("0.0");
        private static XYPlot _xyplotD;
        private static XYPlot _xyplotH;
        private static CombinedRangeXYPlot _combinedrangexyplot;
        public DefaultXYDataset _datasetD = new DefaultXYDataset();
        public DefaultXYDataset _datasetH = new DefaultXYDataset();
        private TextTitle _subTitle = new TextTitle("Sub title");
        private XYDifferenceRenderer _xydifferenceRendererD;
        private XYDifferenceRenderer _xydifferenceRendererH;
        public XYSeriesCollection _datasetDiffD = new XYSeriesCollection();
        private XYSeries _dataSeriesLowerD = new XYSeries("Lower");
        private XYSeries _dataSeriesUpperD = new XYSeries("Upper");
        private NumberAxis _mAxis = new NumberAxis("Vert axis");

        
public XYSplineRendererDemo(String title) {
        super(title);
        createDataset();
        createdDatasetDiffD();
        _xyitemrenderer = new XYSplineRenderer();
        _xyitemrenderer.setSeriesLinesVisible(0, true);
        _xyitemrenderer.setSeriesShapesVisible(0, false);
        _xyitemrenderer.setBaseToolTipGenerator(new StandardXYToolTipGenerator());
        _xyplotD = new XYPlot(_datasetD, _dAxis, null, _xyitemrenderer);
        _xyplotD.setDomainCrosshairVisible(true);
        _xyplotD.setDomainCrosshairLockedOnData(false);
        _xyplotD.setRangeCrosshairVisible(false);
        _xydifferenceRendererD = new XYDifferenceRenderer(Color.WHITE, Color.LIGHT_GRAY, false);
        _xydifferenceRendererD.setRoundXCoordinates(true);
        _xydifferenceRendererD.setBaseToolTipGenerator(new StandardXYToolTipGenerator());

        ValueAxis dDomain = _xyplotD.getDomainAxis();
        dDomain.setRange(0.0, 100.0);
        
         _xyplotD.setDataset(1, _datasetDiffD);
         _xyplotD.setRenderer(1, _xydifferenceRendererD);

        _xyplotD.setDomainCrosshairVisible(true);
        _xyplotD.setDomainCrosshairLockedOnData(false);
        _xyplotD.setRangeCrosshairVisible(false);
         
        _xyplotD.getRendererForDataset(_datasetD).setSeriesPaint(0, Color.RED);     
        _xyplotD.getRendererForDataset(_datasetDiffD).setSeriesPaint(0, Color.BLACK);   
        _xyplotD.getRendererForDataset(_datasetDiffD).setSeriesPaint(1, Color.BLUE);       
        
        _xyitemrendererH = new XYSplineRenderer();
        _xyitemrendererH.setSeriesLinesVisible(0, true);
        _xyitemrendererH.setSeriesShapesVisible(0, false);
        _xyitemrendererH.setBaseToolTipGenerator(new StandardXYToolTipGenerator());
        _xyplotH = new XYPlot(_datasetH, _hAxis, null, _xyitemrendererH);
        ValueAxis hDomain = _xyplotH.getDomainAxis();
        hDomain.setRange(0.0, 100.0);
        _xydifferenceRendererH = new XYDifferenceRenderer(Color.WHITE, Color.LIGHT_GRAY, false);
        _xydifferenceRendererH.setRoundXCoordinates(true);
        _xydifferenceRendererH.setBaseToolTipGenerator(new StandardXYToolTipGenerator());

        _xyplotH.setDataset(1, _datasetDiffD);
        _xyplotH.setRenderer(1, _xydifferenceRendererH);

        _xyplotH.setDomainCrosshairVisible(true);
        _xyplotH.setDomainCrosshairLockedOnData(false);
        _xyplotH.setRangeCrosshairVisible(false);
        _xyplotH.getRendererForDataset(_datasetH).setSeriesPaint(0, Color.MAGENTA);       
        _xyplotH.getRendererForDataset(_datasetDiffD).setSeriesPaint(0, Color.DARK_GRAY);    
        _xyplotH.getRendererForDataset(_datasetDiffD).setSeriesPaint(1, Color.CYAN);          
        
        _mAxis.setAutoRangeIncludesZero(true);

         _combinedrangexyplot = new CombinedRangeXYPlot(_mAxis);
        _combinedrangexyplot.add(_xyplotD, 1);
        _combinedrangexyplot.add(_xyplotH, 1);  
        _combinedrangexyplot.setGap(25.0);
         
        JFreeChart chart = new JFreeChart("Hello", JFreeChart.DEFAULT_TITLE_FONT, _combinedrangexyplot, true);
        chart.addSubtitle(_subTitle);
        
        final ChartPanel chartPanel = new ChartPanel(chart);
        chartPanel.setPreferredSize(new java.awt.Dimension(500, 300));
        setContentPane(chartPanel);

    }
    
    private void createdDatasetDiffD() {
        _dataSeriesUpperD.add(10, 2.1);
        _dataSeriesLowerD.add(10, 1.0);
        _dataSeriesUpperD.add(20, 2.5);
        _dataSeriesLowerD.add(20, 1.0);
        _dataSeriesUpperD.add(30, 2.8);
        _dataSeriesLowerD.add(30, 1.0);
        _dataSeriesUpperD.add(40, 2.1);
        _dataSeriesLowerD.add(40, 1.0);
        _dataSeriesUpperD.add(50, 2.7);
        _dataSeriesLowerD.add(50, 1.0);
        _dataSeriesUpperD.add(60, 1.4);
        _dataSeriesLowerD.add(60, 1.0);
        _dataSeriesUpperD.add(70, 1.7);
        _dataSeriesLowerD.add(70, 1.0);
        _dataSeriesUpperD.add(80, 1.9);
        _dataSeriesLowerD.add(80, 1.0);
        _dataSeriesUpperD.add(90, 2.1);
        _dataSeriesLowerD.add(90, 1.0);
        _dataSeriesUpperD.add(100, 2.7);
        _dataSeriesLowerD.add(100, 1.0);
        _datasetDiffD.addSeries(_dataSeriesLowerD);
        _datasetDiffD.addSeries(_dataSeriesUpperD);
    }
    
    private void createDataset() {
        _data[0][0] = 10.0;
        _data[1][0] = 3.2;
        _data[0][1] = 20.0;
        _data[1][1] = 4.2;
        _data[0][2] = 30.0;
        _data[1][2] = 3.3;
        _data[0][3] = 40.0;
        _data[1][3] = 6.2;
        _data[0][4] = 50.0;
        _data[1][4] = 8.9;
        _data[0][5] = 60.0;
        _data[1][5] = 9.0;
        _data[0][6] = 70.0;
        _data[1][6] = 11.1;
        _data[0][7] = 80.0;
        _data[1][7] = 12.2;
        _data[0][8] = 90.0;
        _data[1][8] = 3.2;
        _data[0][9] = 100.0;
        _data[1][9] = 8.0;
        
         _datasetD.addSeries("D",_data);
         _datasetH.addSeries("H",_data);
    }

    public static void main(final String[] args) {

        final XYSplineRendererDemo demo = new XYSplineRendererDemo("Spline");
        demo.pack();
        RefineryUtilities.centerFrameOnScreen(demo);
        demo.setVisible(true);

    }   
}


John Matthews
Posts: 513
Joined: Wed Sep 12, 2007 3:18 pm

Re: XYSpline without shapes?

Post by John Matthews » Sun Apr 02, 2017 6:50 am

It looks like this to me, but I usually construct and manipulate Swing GUI objects only on the event dispatch thread.

Image

Code: Select all

public static void main(final String[] args) {
	EventQueue.invokeLater(new Runnable() {
		@Override
		public void run() {
			final XYSplineRendererDemo demo = new XYSplineRendererDemo("Spline");
			demo.pack();
			RefineryUtilities.centerFrameOnScreen(demo);
			demo.setVisible(true);
		}
	});
}   

Locked