Question

j'ai trouvé Bibliothèque SWTChart et je me demande simplement comment il serait possible d'obtenir un nuage de points où les points ont des couleurs et des tailles différentes, comme dans celui-ci exemple.

example
(source: matplotlib.org)

package org.swtchart.examples;

import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.swtchart.Chart;
import org.swtchart.ILineSeries;
import org.swtchart.LineStyle;
import org.swtchart.ISeries.SeriesType;

/**
* An example for scatter chart.
*/
public class ScatterChartExample {

private static final double[] xSeries = { 0.0, 2.6, 6.5, 4.4, 5.6, 4.3,
    3.4, 10.8, 2.1, 8.9 };
private static final double[] ySeries = { 1.3, 0.0, 3.9, 2.6, 1.1, 0.6,
    3.1, 3.5, 5.6, 4.4 };

/**
* The main method.
* 
* @param args
*            the arguments
*/
public static void main(String[] args) {
    Display display = new Display();
    Shell shell = new Shell(display);
    shell.setText("Scatter Chart");
    shell.setSize(500, 400);
    shell.setLayout(new FillLayout());

    createChart(shell);

    shell.open();
    while (!shell.isDisposed()) {
    if (!display.readAndDispatch()) {
        display.sleep();
    }
    }
    display.dispose();
}

/**
* create the chart.
* 
* @param parent
*            The parent composite
* @return The created chart
*/
static public Chart createChart(Composite parent) {

    // create a chart
    Chart chart = new Chart(parent, SWT.NONE);

    // set titles
    chart.getTitle().setText("Scatter Chart");
    chart.getAxisSet().getXAxis(0).getTitle().setText("Score A");
    chart.getAxisSet().getYAxis(0).getTitle().setText("Score B");

    // create scatter series
    ILineSeries scatterSeries = (ILineSeries) chart.getSeriesSet()
        .createSeries(SeriesType.LINE, "scatter series");
    scatterSeries.setLineStyle(LineStyle.NONE);
    scatterSeries.setXSeries(xSeries);
    scatterSeries.setYSeries(ySeries);

    // adjust the axis range
    chart.getAxisSet().adjustRange();

    return chart;
}
}

Comment est-il possible d'obtenir un nuage de points où les points ont des couleurs et des tailles différentes ?

Merci d'avance.


Je pensais que j'essayais d'abord d'hériter de SérieLigne avec ce simple code

package org.swtchart.examples;
import org.swtchart.Chart;
import org.swtchart.internal.series.LineSeries;

public class ILineSeriesTest extends LineSeries{

  protected ILineSeriesTest(Chart chart, String id) {
      super(chart, id);
  }
}

Dans l'exemple de code, je l'ai modifié comme suit :

ILineSeriesTest scatterSeries = (ILineSeriesTest) chart.getSeriesSet()
            .createSeries(SeriesType.LINE, "scatter series");

Cependant, j'ai eu l'erreur suivante :

Exception in thread "main" java.lang.ClassCastException: org.swtchart.internal.series.LineSeries cannot be cast to org.swtchart.examples.ILineSeriesTest
  at org.swtchart.examples.ScatterChartExampleTest.createChart(ScatterChartExampleTest.java:67)
  at org.swtchart.examples.ScatterChartExampleTest.main(ScatterChartExampleTest.java:38)

Pourquoi ça n’a pas marché ?

Merci d'avance.

Était-ce utile?

La solution

Vous pouvez obtenir des couleurs individuelles en utilisant setSymbolColors(Color[] colors):

scatterSeries.setSymbolColors(new Color[] { ColorConstants.red,
            ColorConstants.red, ColorConstants.red, ColorConstants.red,
            ColorConstants.green, ColorConstants.green,
            ColorConstants.green, ColorConstants.blue, ColorConstants.blue,
            ColorConstants.blue });

Notez que cet exemple utilise ColorConstants de Draw2D.

Concernant les tailles :Vous devrez mettre en œuvre le vôtre ISeries qui peut prendre soin des tailles.

enter image description here

Autres conseils

Yoshitaka Le développeur de Swtchart a fourni la solution suivante:

package org.swtchart.examples;

import org.eclipse.draw2d.ColorConstants;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.PaintEvent;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.swtchart.Chart;
import org.swtchart.IAxis;
import org.swtchart.ICustomPaintListener;
import org.swtchart.ILineSeries;
import org.swtchart.ILineSeries.PlotSymbolType;
import org.swtchart.IPlotArea;
import org.swtchart.LineStyle;
import org.swtchart.ISeries.SeriesType;

/**
* An example for scatter chart.
*/
public class ScatterChartExampleTest {

    private static final double[] xSeries = { 0.0, 2.6, 6.5, 4.4, 5.6, 4.3,
            3.4, 10.8, 2.1, 8.9 };
    private static final double[] ySeries = { 1.3, 0.0, 3.9, 2.6, 1.1, 0.6,
            3.1, 3.5, 5.6, 4.4 };

    /**
    * The main method.
    * 
    * @param args
    *            the arguments
    */
    public static void main(String[] args) {
        Display display = new Display();
        Shell shell = new Shell(display);
        shell.setText("Scatter Chart");
        shell.setSize(500, 400);
        shell.setLayout(new FillLayout());

        createChart(shell);

        shell.open();
        while (!shell.isDisposed()) {
            if (!display.readAndDispatch()) {
                display.sleep();
            }
        }
        display.dispose();
    }

    /**
    * create the chart.
    * 
    * @param parent
    *            The parent composite
    * @return The created chart
    */
    static public Chart createChart(Composite parent) {

        // create a chart
        final Chart chart = new Chart(parent, SWT.NONE);

        // set titles
        chart.getTitle().setText("Scatter Chart");
        chart.getAxisSet().getXAxis(0).getTitle().setText("Score A");
        chart.getAxisSet().getYAxis(0).getTitle().setText("Score B");

        // create scatter series
        ILineSeries scatterSeries = (ILineSeries) chart.getSeriesSet()
                .createSeries(SeriesType.LINE, "scatter series");
        scatterSeries.setLineStyle(LineStyle.NONE);
        scatterSeries.setXSeries(xSeries);
        scatterSeries.setYSeries(ySeries);

        // hide default plot symbols
        scatterSeries.setSymbolType(PlotSymbolType.NONE);

        // assuming that double[] xSeries, double[] ySeries, int[] sizes,
        // Color[] colors are available
        final Color colors[] = new Color[] { ColorConstants.red, ColorConstants.red,
                ColorConstants.red, ColorConstants.red, ColorConstants.green,
                ColorConstants.green, ColorConstants.green,
                ColorConstants.blue, ColorConstants.blue, ColorConstants.blue };
        final int sizes[] = new int[] { 10, 11, 12, 14, 15, 16, 17, 18, 19, 20};


        IPlotArea plotArea = (IPlotArea) chart.getPlotArea();

        plotArea.addCustomPaintListener(new ICustomPaintListener() {

            public void paintControl(PaintEvent e) {
                IAxis xAxis = chart.getAxisSet().getXAxis(0);
                IAxis yAxis = chart.getAxisSet().getYAxis(0);

                for (int i = 0; i < xSeries.length; i++) {
                    int x = xAxis.getPixelCoordinate(xSeries[i]);
                    int y = yAxis.getPixelCoordinate(ySeries[i]);

                    // draw symbol with any color and shape
                    e.gc.setBackground(colors[i]);
                    e.gc.fillOval(x, y, sizes[i], sizes[i]);
                }
            }

            public boolean drawBehindSeries() {
                return false;
            }
        });

        // adjust the axis range
        chart.getAxisSet().adjustRange();

        return chart;
    }
}

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top