JFreeChart生成图表

本文介绍了如何使用JFreeChart库在Java中生成图表,包括添加必要的依赖、web配置和关键代码示例,涉及折线图、饼图和柱状图的创建,最后展示了在jsp中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.添加依赖

<dependency>
  <groupId>jfree</groupId>
  <artifactId>jcommon</artifactId>
  <version>1.0.12</version>
</dependency>
<dependency>
  <groupId>jfree</groupId>
  <artifactId>jfreechart</artifactId>
  <version>1.0.9</version>
</dependency>

需要两个jar,分别是jcommon和jfreechart,jfreechart的版本不能太高,否则会出现无法识别中文的现象。

2.web配置

<!-- 配置JfreeChart -->
<servlet>
    <servlet-name>DisplayChart</servlet-name>
    <servlet-class>
        org.jfree.chart.servlet.DisplayChart
    </servlet-class>
 </servlet>
 <servlet-mapping>
    <servlet-name>DisplayChart</servlet-name>
    <url-pattern>/DisplayChart</url-pattern>
 </servlet-mapping>

servlet-name可以自定义,但保证上下一致。

3.关键代码

3.1折线图

public static String createLine(HttpServletRequest request, List<String> data, String[] str) {
        HttpSession session = request.getSession(true);
        DefaultCategoryDataset linedataset = new DefaultCategoryDataset();
        if (data!= null && data.size() > 0) {
            for (String data1: data) {
            //Attr1是横坐标数据,Attr2是横坐标数据,str[2]是折线名称。str[2]若为n维数组,则生成n条折线
            linedataset.addValue(data1.getAttr1(), str[2], data1.getAttr2());
            }
        } else {
            return null;
        }

        JFreeChart chart = ChartFactory.createLineChart(str[0], // 折线图名称
                str[1], // 横坐标名称
                str[2], // 纵坐标名称
                linedataset, // 数据
                PlotOrientation.VERTICAL, // 水平显示图像
                true, // include legend
                true, // tooltips
                false // urls
        );
        // 可以重新设置标题,替换标题
        chart.setTitle(new TextTitle(str[0], new Font("宋体", Font.BOLD + Font.ITALIC, 20)));
        // 获得图标中间部分,即plot
        CategoryPlot plot = (CategoryPlot) chart.getPlot();
        plot.setRangeGridlinesVisible(true); // 是否显示格子线
        plot.setBackgroundAlpha(0.3f); // 设置背景透明度
        // 获得横坐标
        CategoryAxis categoryAxis = plot.getDomainAxis();
        categoryAxis.setLabelFont(new Font("微软雅黑", Font.BOLD, 12));
        // 获得纵坐标
        NumberAxis numberAxis = (NumberAxis) plot.getRangeAxis();
        numberAxis.setTickUnit(new NumberTickUnit(2000f));// 间隔
        numberAxis.setLabelFont(new Font("微软雅黑", Font.BOLD, 12));
        ValueAxis valueAxis = (ValueAxis) plot.getRangeAxis();
        valueAxis.setLowerBound(0);// 最小值
        valueAxis.setUpperBound(20000);// 最大值

        // 返回一个字符串文件名,文件名自动生成,生成好的图片会自动放在服务器的临时文件下。url中的DisplayChart要与web中的配置一致
        String fileName = null;
        try {
            fileName = ServletUtilities.saveChartAsPNG(chart, 600, 600, session);
        } catch (IOException e) {
            e.printStackTrace();
        }
        String url = request.getContextPath() + "/DisplayChart?filename=" + fileName;
        return url;
    }

3.2饼图

public static String createPie(HttpServletRequest request, List<String> data, String[] str) {
        HttpSession session = request.getSession(true);
        DefaultPieDataset piedataset= new DefaultPieDataset();
        if (data!= null && data.size() > 0) {
            for (String data1: data) {
                piedataset.setValue(data1.getAttr1(), data1.getAttr2());
            }
        } else {
            return null;
        }
        JFreeChart chart = ChartFactory.createPieChart(str[0], //标题
        piedataset, //数据
        true, //是否显示Legend
        false, //是否显示提示
        false);//图中是否存在URL
        chart.setTitle(new TextTitle(str[0], new Font("宋体", Font.BOLD + Font.ITALIC, 20)));
        String fileName = null;
        try {
            fileName = ServletUtilities.saveChartAsPNG(chart, 600, 600, session);
        } catch (IOException e) {
            e.printStackTrace();
        }
        String url = request.getContextPath() + "/DisplayChart?filename=" + fileName;
        return url;
    }

3.3柱状图

public static String createBar(HttpServletRequest request, List<String> data, String[] str) {
        HttpSession session = request.getSession(true);
        DefaultCategoryDataset bardataset = new DefaultCategoryDataset();
        if (data!= null && data.size() > 0) {
            for (int i = 0; i < 10; i++) {
            //Attr1是横坐标数据,Attr2是柱名称,Attr3是纵坐标数据
                bardataset .setValue(data.get(i).getAttr1(), data.get(i).getAttr2(),
data.get(i).getAttr3());        
            }       
        } else {
            return null;
        }

        JFreeChart chart = ChartFactory.createBarChart(str[0], str[1], str[2], bardataset , PlotOrientation.VERTICAL, true,
                true, false);
        chart.setTitle(new TextTitle(str[0], new Font("宋体", Font.BOLD + Font.ITALIC, 20)));
        CategoryPlot plot = (CategoryPlot) chart.getPlot();
        // 获得横坐标
        CategoryAxis categoryAxis = plot.getDomainAxis();
        categoryAxis.setLabelFont(new Font("微软雅黑", Font.BOLD, 12));
        // 获得纵坐标
        NumberAxis numberAxis = (NumberAxis) plot.getRangeAxis();
        numberAxis.setTickUnit(new NumberTickUnit(1000f));// 间隔
        numberAxis.setLabelFont(new Font("微软雅黑", Font.BOLD, 12));
        String fileName = null;
        try {
            fileName = ServletUtilities.saveChartAsPNG(chart, 600, 600, session);
        } catch (IOException e) {
            e.printStackTrace();
        }
        String url = request.getContextPath() + "/DisplayChart?filename=" + fileName;
        return url;
    }

4.jsp

<img src="${url}" title="${str}" data-action="zoom"
                        data-original="${url}" style="width: 100%; height: 100%;" />

zoom是图片放大工具

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值