JFreeChart绘制XY折线图(工具类设计)

准备用Java写通信的仿真平台作为毕业设计,相比matlab绘图,Java绘图需要自己去写很多工具类,博主在这采用了JFreeChart的开源解决方案,摸索着自己写了一个XY折线图工具类,话不多说贴源码,源码中写了很多注释,配了一套自己用的绘图样式,需要的童鞋可以借鉴借鉴,希望对你有帮助。源代码已上传我的github上。

首先用Maven引入Jar包

<!-- Java 绘图 -->
<dependency>
    <groupId>jfree</groupId>
    <artifactId>jfreechart</artifactId>
    <version>1.0.13</version>
</dependency>

DrawingToolsTest工具类设计

先看效果

下方是我的测试方法,准备了x和y的数据放入Map中,然后传入已经写好的接口中,就一行代码。底层的过程都封装好了,调的话很方便

public class DrawingToolsTest {
    @Test
    public void testTools() {
        int sum = 20;//随机生成20对数
        Map<Double, Double> map1 = new HashMap<>();
        double[] restX = RandomTools.getRadomDouble(1, 20, 1, sum);
        double[] restY = RandomTools.getRadomDouble(1, 20, 1, sum);
        for (int i = 0; i < sum; i++) {
            map1.put(restX[i], restY[i]);
        }

        Map<Double, Double> map2 = new HashMap<>();
        for (int i = 0; i < sum; i++) {
            map2.put(restY[i], restX[i]);
        }

        Map<Double, Double>[] dataSet = new Map[]{map1, map2};
        String[] types = new String[]{"A", "B"};
        //调用绘图工具
        DrawingTools.drawLineChart("axin", "测试", "这是X轴",
                "这是y轴", dataSet, types);

        Scanner in = new Scanner(System.in);
        in.hasNext();
    }
}

/**
 * @author Axin
 */
public class RandomTools {
    /**
     * @param start
     * @param end
     * @param retain 保留几位小数
     * @param sum    生成多少个数
     * @return
     */
    public static double[] getRadomDouble(int start, int end, int retain, int sum) {
        double[] res = new double[sum];

        for (int i = 0; i < sum; i++) {
            BigDecimal db = new BigDecimal(Math.random() * (end - start) + start);
            //四舍五入
            res[i] = db.setScale(retain, BigDecimal.ROUND_HALF_UP).doubleValue();
        }
        return res;
    }
}

运行后:
image

工具类源码

/**
 * 后端绘图类
 *
 * @author Axin
 * @date 2018-10-16
 */

@ConfigurationProperties(prefix = "draw")
public class DrawingTools extends ApplicationFrame {
    private String titleFont;
    private int titleFontSize;
    private String xyFont;
    private int xyFontSize;

    DrawingTools() {
        this("Axin");
    }

    public DrawingTools(String appTitle) {
        super(appTitle);
        this.titleFont = "微软雅黑";
        this.titleFontSize = 20;
        this.xyFont = "微软雅黑";
        this.xyFontSize = 15;
    }

    /**
     * @param appTitle    标题
     * @param chartTitle  图标题
     * @param xName       x轴命名
     * @param yName       y轴命名
     * @param dataSet     数据集
     * @param types       线条种类
     */
    public static void drawLineChart(String appTitle, String chartTitle,
                                     String xName,
                                     String yName,
                                     Map<Double, Double>[] dataSet,
                                     String[] types) {
        DrawingTools tools = new DrawingTools(appTitle);
        IntervalXYDataset dataset = tools.getLineDataset(dataSet, types);
        JFreeChart chart = tools.getLineChart(chartTitle, xName, yName, dataset);

        //绘图模式化
        tools.setChartCSS(chart);
        ChartPanel chartPanel = new ChartPanel(chart);
        chartPanel.setPreferredSize(new java.awt.Dimension(900, 600));
        tools.setContentPane(chartPanel);
        tools.pack();
        RefineryUtilities.centerFrameOnScreen(tools);
        tools.setVisible(true);
    }

    private JFreeChart getLineChart(String title, String xName, String yName, XYDataset dataset) {
        /**
         * 图标标题,x轴名称,y轴名称,数据集合,图标显示方向,是否使用图示,是否生成工具栏,是否生成URL链接
         */
        JFreeChart chart = ChartFactory.createXYLineChart(
                title,
                xName,
                yName,
                dataset,
                PlotOrientation.VERTICAL,
                true,
                true,
                false
        );
        return chart;
    }



    /**
     * 自定义设置图表字体样式
     *
     * @param chart
     */
    private void setChartCSS(JFreeChart chart) {
        //初始化
        chart.setBackgroundPaint(ChartColor.WHITE);
        XYPlot plot = chart.getXYPlot();

        //标题
        TextTitle textTitle = chart.getTitle();
        textTitle.setFont(new Font(titleFont, Font.BOLD, titleFontSize));
        LegendTitle legendTitle = chart.getLegend();
        legendTitle.setItemFont(new Font(titleFont, Font.PLAIN, titleFontSize));


        //图表xy轴字体设置
        plot.getDomainAxis().setLabelFont(new Font(xyFont, Font.PLAIN, xyFontSize));
        plot.getDomainAxis().setTickLabelFont(new Font(xyFont, Font.PLAIN, xyFontSize));
        plot.getRangeAxis().setTickLabelFont(new Font(xyFont, Font.PLAIN, xyFontSize));
        plot.getRangeAxis().setLabelFont(new Font(xyFont, Font.PLAIN, xyFontSize));

        //设置背景色-xy轴格子色
        plot.setBackgroundPaint(ChartColor.WHITE);
        plot.setRangeGridlinePaint(ChartColor.lightGray);
//        plot.setDomainGridlinePaint(ChartColor.lightGray);

        //折线图渲染
        XYLineAndShapeRenderer renderer = new XYLineAndShapeRenderer();
        plot.setRenderer(renderer);
//        renderer.setPaint(ChartColor.BLACK);
        chart.getLegend().setPosition(RectangleEdge.RIGHT);

    }

    /**
     * @param dataSets int:double
     * @param types    折线的种类
     * @return
     */
    private IntervalXYDataset getLineDataset(Map<Double, Double>[] dataSets, String[] types) {

        XYSeriesCollection dataSet = new XYSeriesCollection();
        int index = 0;
        for (String type : types) {
            XYSeries series = new XYSeries(type);
            for (Map.Entry<Double, Double> data : dataSets[index++].entrySet()) {
                series.add(data.getKey(), data.getValue());
            }
            dataSet.addSeries(series);
        }
        return dataSet;
    }
}

结语

其实在真实生产环境中,后端已经不渲染报表图片之类了,都是后端传数据给前端,由前端来进行可视化,这里使用JFreeChart是为了后端做单元测试而编写的。

转载于:https://www.cnblogs.com/keeya/p/9800886.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: JFreeChart 是一个用来创建图表的开源库,支持多种类型的图表,包括折线图、柱状图、饼图等。动态折线图可以实时显示数据的变化,非常适合监控和实时数据分析场景。 以下是创建动态折线图的步骤: 1. 创建数据集 ``` XYSeries series = new XYSeries("Data"); XYSeriesCollection dataset = new XYSeriesCollection(series); ``` 2. 创建图表对象 ``` JFreeChart chart = ChartFactory.createXYLineChart("Dynamic Line Chart", "X", "Y", dataset, PlotOrientation.VERTICAL, true, true, false); ``` 3. 获取图表的绘图区域,并设置自动刷新 ``` XYPlot plot = chart.getXYPlot(); plot.setDomainPannable(true); plot.setRangePannable(true); plot.setAutoscroll(true); ``` 4. 创建定时器,定时更新数据集中的数据 ``` Timer timer = new Timer(1000, new ActionListener() { @Override public void actionPerformed(ActionEvent e) { double x = System.currentTimeMillis(); double y = Math.random() * 100; series.add(x, y); } }); timer.start(); ``` 5. 创建图表面板,并添加到窗口中 ``` ChartPanel chartPanel = new ChartPanel(chart); frame.setContentPane(chartPanel); ``` 完整的代码示例: ``` import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JFrame; import javax.swing.Timer; import org.jfree.chart.ChartFactory; import org.jfree.chart.ChartPanel; import org.jfree.chart.JFreeChart; import org.jfree.chart.plot.PlotOrientation; import org.jfree.chart.plot.XYPlot; import org.jfree.data.xy.XYSeries; import org.jfree.data.xy.XYSeriesCollection; public class DynamicLineChart { public static void main(String[] args) { XYSeries series = new XYSeries("Data"); XYSeriesCollection dataset = new XYSeriesCollection(series); JFreeChart chart = ChartFactory.createXYLineChart("Dynamic Line Chart", "X", "Y", dataset, PlotOrientation.VERTICAL, true, true, false); XYPlot plot = chart.getXYPlot(); plot.setDomainPannable(true); plot.setRangePannable(true); plot.setAutoscroll(true); Timer timer = new Timer(1000, new ActionListener() { @Override public void actionPerformed(ActionEvent e) { double x = System.currentTimeMillis(); double y = Math.random() * 100; series.add(x, y); } }); timer.start(); ChartPanel chartPanel = new ChartPanel(chart); JFrame frame = new JFrame("Dynamic Line Chart"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setSize(800, 600); frame.setContentPane(chartPanel); frame.setVisible(true); } } ``` ### 回答2: jfreechart是一个开源的Java图表库,可以用于创建各种类型的图表,包括动态折线图。 创建动态折线图的基本步骤如下: 1. 导入jfreechart库。 2. 创建一个XY数据集对象,用于存储动态折线图的数据。 3. 创建一个XY线条集合对象,用于存储折线图的线条。 4. 创建一个XYPlot对象,用于定义图表的绘制区域。 5. 创建一个绘制图表的对象ChartPanel。 6. 创建一个定时器,用于定时更新折线图的数据。 7. 将ChartPanel添加到一个容器中以显示图表。 8. 在定时器中更新XY数据集对象的数据,然后重新绘制折线图。 具体代码示例如下: ```java import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JFrame; import javax.swing.Timer; import org.jfree.chart.ChartFactory; import org.jfree.chart.ChartPanel; import org.jfree.chart.JFreeChart; import org.jfree.chart.plot.XYPlot; import org.jfree.data.xy.DefaultXYDataset; import org.jfree.data.xy.XYDataset; public class DynamicLineChartExample extends JFrame { private static final int MAX_DATA_POINTS = 100; private static final int DELAY = 1000; // 每秒更新一次数据 private DefaultXYDataset dataset; private Timer timer; private int dataCount; public DynamicLineChartExample(String title) { super(title); // 创建数据集 dataset = new DefaultXYDataset(); // 创建折线图对象 JFreeChart chart = ChartFactory.createXYLineChart("动态折线图", "X", "Y", dataset); // 获取绘制区域对象 XYPlot plot = chart.getXYPlot(); // 创建图表面板 ChartPanel chartPanel = new ChartPanel(chart); // 创建定时器 timer = new Timer(DELAY, new ActionListener() { @Override public void actionPerformed(ActionEvent e) { updateChart(); // 更新折线图数据 } }); // 添加图表面板到容器 getContentPane().add(chartPanel); // 设置窗口大小和可见性 setSize(500, 400); setVisible(true); // 启动定时器 timer.start(); } private void updateChart() { double[][] data = new double[2][MAX_DATA_POINTS]; for (int i = 0; i < MAX_DATA_POINTS; i++) { data[0][i] = i + dataCount; data[1][i] = Math.sin((i + dataCount) * Math.PI / 180); } dataset.removeSeries("折线1"); dataset.addSeries("折线1", data); dataCount++; } public static void main(String[] args) { new DynamicLineChartExample("动态折线图示例"); } } ``` 上述代码中,我们通过每秒钟更新一次数据来演示动态折线图的效果。每次更新时,我们将计数器的值加到X坐标上,并根据这个计数器的值计算Y坐标。每次更新数据时,我们通过`dataset`对象的`removeSeries`方法删除旧的数据,并通过`addSeries`方法添加新的数据。然后,我们通过调用`repaint`方法重新绘制折线图。 ### 回答3: JFreeChart是一个开源的Java图表库,提供了各种类型的图表,包括折线图。动态折线图是指图表中的数据随着时间的推移而变化,能够实时地展示数据的变化趋势。 要创建JFreeChart的动态折线图,需要以下几个步骤: 1. 导入JFreeChart库:在Java项目中引入JFreeChart的相关库文件。 2. 创建数据集:使用XYSeriesCollection类创建一个数据集,用于存储折线图的数据。可以使用XYSeries类来添加和更新数据。 3. 创建图表:使用ChartFactory类的createXYLineChart方法创建一个折线图。传入相应的参数,包括图表标题、横轴和纵轴的标题等。 4. 创建绘图面板:创建一个ChartPanel对象,将图表对象作为参数传入。 5. 创建定时器:使用javax.swing.Timer类创建一个定时器。在定时器的动作事件中更新数据集的数据,并重新绘制图表。 6. 显示图表:将绘图面板添加到GUI窗口中,并显示出来。 通过以上步骤,动态折线图就能够实现了。在定时器的定时事件中,可以更新数据集的数据,并通过重新绘制图表来实时显示数据的变化。 使用JFreeChart创建动态折线图可以方便地展示数据的实时变化趋势,可以在数据分析、监控等领域得到广泛的应用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值