使用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;
    }
}

运行后:

工具类源码

/**
 * 后端绘图类
 *
 * @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

时间: 2024-11-04 01:34:34

使用JFreeChart绘制XY折线图(工具类设计)的相关文章

JFreeChart在制作折线图

JFreeChart在制作折线图的时候可以使用两种不同的方式 package Line; import java.awt.Color; import java.awt.Font; import org.jfree.chart.ChartFactory; import org.jfree.chart.ChartFrame; import org.jfree.chart.JFreeChart; import org.jfree.chart.StandardChartTheme; import org

HighCharts绘制JS折线图(后台传数据给前台基于JFinal框架)

/*****************************Controller(基于JFinal框架)**************/ package com.zzu.controller;import java.text.SimpleDateFormat;import java.util.ArrayList;import java.util.List;import org.jfree.chart.ChartFactory;import org.jfree.chart.ChartUtilitie

使用Canvas和Paint自己绘制一个折线图

主要就是使用了Canvas写了一个特别简单的小demo.可以手动点击每个月份的数据改变折线的位置.非常简单. 主要就是用paint在canvas上画出来的. 代码就不上了,想要的自己去下载: https://github.com/yocn/chartView?

vue中绘制echarts折线图

1.安装echartscnpm install echarts --save 2.vue代码 <template> <div> //下面的div给表一个容器 <div id="myChart" :style="{width: '1000px', height: '500px'}"></div> </div> </template> <script> // 引入基本模板 let ech

百度推出的echarts,制表折线图柱状图饼图等的超级工具

一.简介: 1.绘制数据图表,有了它,想要网页上绘制个折线图.柱状图,从此easy. 2.使用这个百度的echarts.js插件,是通过把图片绘制在canvas上在显示在页面上. 官网对echarts的简介: ECharts,缩写来自Enterprise Charts,商业级数据图表,一个纯Javascript的图表库,可以流畅的运行在PC和移动设备上,兼容当前绝大部分浏览器(IE6/7/8/9/10/11,chrome,firefox,Safari等),底层依赖轻量级的Canvas类库ZRen

JFreeChart在Struts2中实现3D折线图统计

在Struts2中,用JFreeChart实现3D折线图统计 前段时间学习了一下JFreeChart,现在来整理一下自己所作的实例. 下面分别用两种方式来实现: 一种是以java应用程序的方式,一种是以web项目程序的方式 需要加入的jar包有:  jcommon-1.0.17.jar . jfreechart-1.0.14.jar(前两个是JFreeChart中所带的,在下载的JFreeChart的lib目录下) . struts2-jfreechart-plugin-2.3.16.3.jar

C# 绘制统计图(柱状图, 折线图, 扇形图)

统计图形种类繁多, 有柱状图, 折线图, 扇形图等等, 而统计图形的绘制方法也有很多, 有Flash制作的统计图形, 有水晶报表生成统计图形, 有专门制图软件制作, 也有编程语言自己制作的:这里我们用就C# 制作三款最经典的统计图: 柱状图, 折线图和扇形图:既然是统计, 当然需要数据, 这里演示的数据存于Sql Server2000中, 三款统计图形都是动态生成. 其中柱状图我会附上制作步骤, 其他两款统计图直接附源码. 说明: 需求不一样, 统计图形绘制后的显示效果也不一样, 比如这里柱状图

iOS 动画绘制线条颜色渐变的折线图

效果图 .................... 概述 现状 折线图的应用比较广泛,为了增强用户体验,很多应用中都嵌入了折线图.折线图可以更加直观的表示数据的变化.网络上有很多绘制折线图的demo,有的也使用了动画,但是线条颜色渐变的折线图的demo少之又少,甚至可以说没有.该Blog阐述了动画绘制线条颜色渐变的折线图的实现方案,以及折线图线条颜色渐变的实现原理,并附以完整的示例. 成果 本人已将折线图封装到了一个UIView子类中,并提供了相应的接口.该自定义折线图视图,基本上可以适用于大部分

[转]用Matplotlib绘制 折线图 散点图 柱状图 圆饼图

Matplotlib是一个Python工具箱,用于科学计算的数据可视化.借助它,Python可以绘制如Matlab和Octave多种多样的数据图形. 安装 Matplotlib并不是Python的默认组件,需要额外安装. 官方下载地址 http://matplotlib.org/downloads.html 必须下载与自己的Python版本,操作系统类型对应的安装包.如Windows 64位+Python3.3,应该下载matplotlib-1.3.1.win-amd64-py3.3.exe 第