且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

如何使用jfreechart从上到下绘制折线图?

更新时间:2023-11-24 08:10:04

首先,按如下方式创建数据集然后不要改变它......无论你想如何呈现它,数据都是一样的:

First, create your dataset as follows then don't change it...the data is the same no matter how you want to present it:

    private XYDataset createDataset() {
        XYSeries s1 = new XYSeries("S1");
        s1.add(0, 0);
        s1.add(1, 2);
        s1.add(2, 5);
        s1.add(3, 10);
        s1.add(4, 7);
        s1.add(5, 8);
        XYSeriesCollection dataset = new XYSeriesCollection();
        dataset.addSeries(s1);
        return dataset;
   }

现在合理标准的JFreeChart创建将如下所示:

Now a reasonably standard JFreeChart creation would look like this:

...这里是代码:

import java.awt.Color;
import java.awt.Dimension;
import java.awt.geom.Ellipse2D;
import javax.swing.JFrame;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.NumberAxis;
import org.jfree.chart.plot.XYPlot;
import org.jfree.chart.renderer.xy.XYLineAndShapeRenderer;
import org.jfree.data.xy.XYDataset;
import org.jfree.data.xy.XYSeries;
import org.jfree.data.xy.XYSeriesCollection;

public class ***25993430 extends JFrame {

    public ***25993430(String title) {
        super(title);
        JFreeChart chart = createChart(createDataset());
        ChartPanel panel = new ChartPanel(chart);
        panel.setPreferredSize(new Dimension(500, 300));
        setContentPane(panel);
    }

    private XYDataset createDataset() {
        XYSeries s1 = new XYSeries("S1");
        s1.add(0, 0);
        s1.add(1, 2);
        s1.add(2, 5);
        s1.add(3, 10);
        s1.add(4, 7);
        s1.add(5, 8);
        XYSeriesCollection dataset = new XYSeriesCollection();
        dataset.addSeries(s1);
        return dataset;
    }

    private JFreeChart createChart(XYDataset dataset) {
        JFreeChart chart = ChartFactory.createXYLineChart(
                "***25993430", "X", "Y", dataset);
        chart.removeLegend();
        XYPlot plot = (XYPlot) chart.getPlot();
        XYLineAndShapeRenderer renderer = (XYLineAndShapeRenderer) plot.getRenderer();
        renderer.setSeriesShapesVisible(0, true);
        renderer.setSeriesShape(0, new Ellipse2D.Double(-4.0, -4.0, 8.0, 8.0));
        renderer.setSeriesFillPaint(0, Color.WHITE);
        renderer.setUseFillPaint(true);
        NumberAxis xAxis = (NumberAxis) plot.getDomainAxis();
        xAxis.setStandardTickUnits(NumberAxis.createIntegerTickUnits());
        return chart;
    }

    public static void main(String[] args) {
        JFrame app = new ***25993430("JFreeChart");
        app.pack();
        app.setVisible(true);
    }
}

很少需要改变以获得你想要的情节。首先,应该改变绘图方向,其次应该反转x轴,第三,你必须提供y轴应该在顶部的提示。结果如下:

Very little needs changing to get the plot you want. First, the plot orientation should be changed, second the x-axis should be inverted, and third you have to provide a hint that the y-axis should go at the top. Here is the result:

...以及生成它的代码(***标记已添加的5行):

... and the code to produce it (with *** marking the 5 lines that were added):

import java.awt.Color;
import java.awt.Dimension;
import java.awt.geom.Ellipse2D;
import javax.swing.JFrame;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.AxisLocation; // ***
import org.jfree.chart.axis.NumberAxis;
import org.jfree.chart.plot.PlotOrientation; // ***
import org.jfree.chart.plot.XYPlot;
import org.jfree.chart.renderer.xy.XYLineAndShapeRenderer;
import org.jfree.data.xy.XYDataset;
import org.jfree.data.xy.XYSeries;
import org.jfree.data.xy.XYSeriesCollection;

public class ***25993430b extends JFrame {

    public ***25993430b(String title) {
        super(title);
        JFreeChart chart = createChart(createDataset());
        ChartPanel panel = new ChartPanel(chart);
        panel.setPreferredSize(new Dimension(500, 300));
        setContentPane(panel);
    }

    private XYDataset createDataset() {
        XYSeries s1 = new XYSeries("S1");
        s1.add(0, 0);
        s1.add(1, 2);
        s1.add(2, 5);
        s1.add(3, 10);
        s1.add(4, 7);
        s1.add(5, 8);
        XYSeriesCollection dataset = new XYSeriesCollection();
        dataset.addSeries(s1);
        return dataset;
    }

    private JFreeChart createChart(XYDataset dataset) {
        JFreeChart chart = ChartFactory.createXYLineChart(
                "***25993430b", "X", "Y", dataset);
        chart.removeLegend();
        XYPlot plot = (XYPlot) chart.getPlot();
        plot.setOrientation(PlotOrientation.HORIZONTAL); // ***
        plot.setRangeAxisLocation(AxisLocation.TOP_OR_LEFT); // ***
        XYLineAndShapeRenderer renderer = (XYLineAndShapeRenderer) plot.getRenderer();
        renderer.setSeriesShapesVisible(0, true);
        renderer.setSeriesShape(0, new Ellipse2D.Double(-4.0, -4.0, 8.0, 8.0));
        renderer.setSeriesFillPaint(0, Color.WHITE);
        renderer.setUseFillPaint(true);
        NumberAxis xAxis = (NumberAxis) plot.getDomainAxis();
        xAxis.setStandardTickUnits(NumberAxis.createIntegerTickUnits());
        xAxis.setInverted(true); // ***
        return chart;
    }

    public static void main(String[] args) {
        JFrame app = new ***25993430b("JFreeChart");
        app.pack();
        app.setVisible(true);
    }
}