简体   繁体   中英

How I can add additional details about the chart outside of the graph

I am new to JFreeChart. I have created line chart using JFreeChart. Now, I want to add additional details about the chart out side of the graph (ie on Left side and the Bottom of the graph). Also, I want to save the generated graph with all the information. Could any body help me out here.

package hh;

import java.awt.BorderLayout;
import java.awt.Color;
import java.io.File;
import java.io.IOException;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.ChartUtilities;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.NumberAxis;
import org.jfree.chart.axis.NumberTickUnit;
import org.jfree.chart.plot.XYPlot;
import org.jfree.chart.renderer.xy.XYLineAndShapeRenderer;
import org.jfree.chart.renderer.xy.XYSplineRenderer;
import org.jfree.data.xy.XYDataset;
import org.jfree.data.xy.XYSeries;
import org.jfree.data.xy.XYSeriesCollection;

public class XYLineChartExample extends JFrame {

    // double x=1.08,y=0.370;
    JFreeChart chart;

    public XYLineChartExample() {
        super("XY Line Chart Example with JFreechart");

        JPanel chartPanel = createChartPanel();
        add(chartPanel, BorderLayout.CENTER);

        setSize(1240, 600);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLocationRelativeTo(null);
    }

    private JPanel createChartPanel() {
        String chartTitle = "Objects Movement Chart";
        String xAxisLabel = "X";
        String yAxisLabel = "Y";

        XYDataset dataset = createDataset();

        JFreeChart chart = ChartFactory.createXYLineChart(chartTitle,
                xAxisLabel, yAxisLabel, dataset);
        XYPlot plot = chart.getXYPlot();
        XYLineAndShapeRenderer renderer = new XYLineAndShapeRenderer();
        plot.setRenderer(renderer);
        renderer.setSeriesPaint(2, Color.RED);
        renderer.setSeriesPaint(3, Color.BLACK);
        renderer.setSeriesPaint(4, Color.BLACK);
        renderer.setSeriesPaint(5, Color.BLUE);
        renderer.setSeriesPaint(6, Color.RED);

        File imageFile = new File(
                "C:/Users/varinder/Desktop/Graphs/Branch1_Grap.jpg");
        int width = 1240;
        int height = 500;
        try {
            ChartUtilities.saveChartAsJPEG(imageFile, chart, width, height);
        } catch (IOException ex) {
            System.err.println(ex);
        }

        return new ChartPanel(chart);

    }

    private XYDataset createDataset() {

        XYSeriesCollection dataset = new XYSeriesCollection();
        XYSeries series = new XYSeries("Object 1");
        XYSeries series2 = new XYSeries("Object 2");
        XYSeries series3 = new XYSeries("Object 3");
        XYSeries series4 = new XYSeries("Object 4");
        XYSeries series5 = new XYSeries("Object 5");
        XYSeries series6 = new XYSeries("Object 6");
        XYSeries series7 = new XYSeries("Object 7");

        // fixed X axis

        series.add(.10, .000);
        series.add(.20, .000);
        series.add(.30, .000);
        series.add(.40, .000);
        series.add(.50, .000);
        series.add(.60, .000);
        series.add(.70, .000);
        series.add(.80, .000);
        series.add(.90, .000);
        series.add(1.00, .000);
        series.add(1.10, .000);
        series.add(1.20, .000);
        series.add(1.30, .000);
        series.add(1.40, .000);
        series.add(1.50, .000);
        series.add(1.60, .000);
        series.add(1.70, .000);
        series.add(1.80, .000);
        series.add(1.90, .000);
        series.add(2.00, .000);
        series.add(2.10, .000);
        series.add(2.20, .000);
        series.add(2.30, .000);
        series.add(2.30, .000);
        series.add(2.40, .000);
        series.add(2.50, .000);
        series.add(2.60, .000);
        series.add(2.70, .000);
        series.add(2.80, .000);
        series.add(2.90, .000);
        series.add(3.00, .000);
        series.add(3.10, .000);
        series.add(3.20, .000);
        series.add(3.30, .000);
        series.add(3.40, .000);
        series.add(3.50, .000);
        series.add(3.60, .000);
        // series.add(3.70, .000);

        // fixed Y axis
        series2.add(.00, .100);
        series2.add(.00, .200);
        series2.add(.00, .300);
        series2.add(.00, .400);
        series2.add(.00, .500);
        series2.add(.00, .600);
        series2.add(.00, .700);
        series2.add(.00, .800);
        series2.add(.00, .900);
        series2.add(.00, 1.000);
        series2.add(.00, 1.100);
        series2.add(.00, 1.200);

        // Bed level with red color
        // series2.add(0, 193.500);

        // series3.add(1.92, 100.370);
        series3.add(0.88, 0.900);
        series3.add(2.12, 0.900);
        series3.add(0.75, 0.900);
        series3.add(2.25, 0.900);
        series3.add(0.59, 0.300);
        series3.add(2.41, 0.300);
        series3.add(0.00, 0.300);
        series3.add(3.1, .300);

        series4.add(0.88, 0.304);
        series4.add(2.12, 0.304);

        series4.add(0.879, 0.876);// one decrease
        series4.add(2.12, 0.876);
        series5.add(0.88, 0.876);
        series5.add(1.109, 0.876);
        series5.add(1.109, 0.376);

        series6.add(2.12, 0.876);
        series6.add(1.891, 0.876);
        series6.add(1.890, 0.376);
        series6.add(1.109, 0.376);

        series7.add(1.109, 0.876);// sement area by adding 0.1.
        series7.add(1.119, 0.876);
        series7.add(1.119, 0.386);
        series7.add(1.881, 0.386);
        series7.add(1.881, 0.876);
        series7.add(1.891, 0.876);
        // series7.add(1.11, 0.);

        dataset.addSeries(series);
        dataset.addSeries(series2);
        dataset.addSeries(series3);
        dataset.addSeries(series4);
        dataset.addSeries(series5);
        dataset.addSeries(series6);
        dataset.addSeries(series7);
        return dataset;

    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {

                new XYLineChartExample().setVisible(true);
            }
        });
    }
}

For the axes, better use loops to make the code cleaner :

for(double i=0;i<3.70;i+=0.1){  series.add(i,0.0)  }
for(        i=0;i<1.2;i+=0.1){  series2.add(0.0,i)  }

I personnaly use JavaFX and not the older version swing with Jelement, so you can use a BorderPane ( https://docs.oracle.com/javase/8/javafx/api/javafx/scene/layout/BorderPane.html you get a picture here) so you can put some elements around (and put borderpane in one area, with scene builder the possibilities are bigger ( http://code.makery.ch/library/javafx-8-tutorial/fr/part1/ )

EDIT : https://code.lds.org/nexus/content/sites/maven-sites/stack/modules/swing/1.1.1/apidocs/org/lds/stack/swing/BorderPane.html here is the swing version for you, a Jpanel with the setNorthComponent/south/... methods ;)

EDIT2 :

here is, be careful to have the good name for your class "Launcher" if it isn't it won't work, you can then add controllers for the button

import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.chart.LineChart;
import javafx.scene.chart.NumberAxis;
import javafx.scene.chart.XYChart;
import javafx.scene.control.Button;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
/**
 * Class that starts the application, contains the primary stage.
 */
public class Launcher extends Application {

    @Override
    public void start(Stage primaryStage) throws Exception {
        BorderPane pane = new BorderPane();
        primaryStage.setTitle("Line Chart");
            //defining the axes
            final NumberAxis xAxis = new NumberAxis();
            final NumberAxis yAxis = new NumberAxis();
            xAxis.setLabel("Time");

            //creating the chart
            final LineChart<Number,Number> lineChart =
                    new LineChart<Number,Number>(xAxis,yAxis);

            lineChart.setTitle("Test");
            //defining a series
            XYChart.Series series = new XYChart.Series();
            XYChart.Series series1 = new XYChart.Series();
            XYChart.Series series2= new XYChart.Series();
            XYChart.Series series3 = new XYChart.Series();
            XYChart.Series series4 = new XYChart.Series();
            XYChart.Series series5 = new XYChart.Series();
            XYChart.Series series6 = new XYChart.Series();
            XYChart.Series series7 = new XYChart.Series();

            double i;
            for(i=0;i<3.70;i+=0.1){
                    series.getData().add(new XYChart.Data(i,0.0)); 
            }
            for(i=0;i<1.2;i+=0.1){
                    series2.getData().add(new XYChart.Data(0.0,i));  
            }


            // Bed level with red color
            // series2.add(0, 193.500);

            // series3.add(1.92, 100.370);
            series3.getData().add(new XYChart.Data(0.88, 0.900));
            series3.getData().add(new XYChart.Data(2.12, 0.900));
            series3.getData().add(new XYChart.Data(0.75, 0.900));
            series3.getData().add(new XYChart.Data(2.25, 0.900));
            series3.getData().add(new XYChart.Data(0.59, 0.300));
            series3.getData().add(new XYChart.Data(2.41, 0.300));
            series3.getData().add(new XYChart.Data(0.00, 0.300));
            series3.getData().add(new XYChart.Data(3.1, .300));

            series4.getData().add(new XYChart.Data(0.88, 0.304));
            series4.getData().add(new XYChart.Data(2.12, 0.304));

            series4.getData().add(new XYChart.Data(0.879, 0.876));// one decrease
            series4.getData().add(new XYChart.Data(2.12, 0.876));
            series5.getData().add(new XYChart.Data(0.88, 0.876));
            series5.getData().add(new XYChart.Data(1.109, 0.876));
            series5.getData().add(new XYChart.Data(1.109, 0.376));

            series6.getData().add(new XYChart.Data(2.12, 0.876));
            series6.getData().add(new XYChart.Data(1.891, 0.876));
            series6.getData().add(new XYChart.Data(1.890, 0.376));
            series6.getData().add(new XYChart.Data(1.109, 0.376));

            series7.getData().add(new XYChart.Data(1.109, 0.876));// sement area by adding 0.1.
            series7.getData().add(new XYChart.Data(1.119, 0.876));
            series7.getData().add(new XYChart.Data(1.119, 0.386));
            series7.getData().add(new XYChart.Data(1.881, 0.386));
            series7.getData().add(new XYChart.Data(1.881, 0.876));
            series7.getData().add(new XYChart.Data(1.891, 0.876));
            // series7.add(1.11, 0.);

            //A vertical Box
            VBox box=new VBox();
            //Add some example of button into
            box.getChildren().addAll(new Button("Cut"), new Button("Copy"), new Button("Paste"));
            lineChart.setCreateSymbols(false);
            //Add all the series to the chart
            lineChart.getData().addAll(series,series1,series2, series3,series4,series5,series6,series7);
            //Add the chart in the center of the pane
            pane.setCenter(lineChart);
            //add the vbox (with the button) to the right
            pane.setRight(box);
            Scene scene  = new Scene(pane,800,600);

            primaryStage.setScene(scene);
            primaryStage.show();

        primaryStage.setTitle("Test");
        primaryStage.centerOnScreen();
    }

    public static void main (String[] args) {
        launch(args);
    }
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM