前一篇文章说明了JFreeChar生成柱状图以及解决中文只能显示问方框的问题,本文主要记录柱状图的显示案例,可供初学者参考:
先看一个简单的柱状图生成案例:
package org.ml.servlet;
import java.awt.Font;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServlet;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartUtilities;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.plot.CategoryPlot;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.title.TextTitle;
import org.jfree.data.category.CategoryDataset;
import org.jfree.data.category.DefaultCategoryDataset;
import org.jfree.data.general.DefaultPieDataset;
public class ChartDemoServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
public ChartDemoServlet() {
super();
}
/**
* 创建一个数据集合
*
* @return
*/
private static DefaultPieDataset getDataSet() {
DefaultPieDataset dataset = new DefaultPieDataset();
dataset.setValue("苹果", 100);
dataset.setValue("梨子", 200);
dataset.setValue("葡萄", 300);
dataset.setValue("香蕉", 400);
dataset.setValue("荔枝", 500);
return dataset;
}
@Override
public void service(ServletRequest req, ServletResponse res)
throws ServletException, IOException {
res.setContentType("image/jpeg");// 将输出设置为image/jepg格式
CategoryDataset dataset = getDataSet2();// 取得数据集合
JFreeChart chart2 = ChartFactory.createBarChart3D("水果产量图", // 图表标题
"水果", // 目录轴的显示标签
"产量", // 数值轴的显示标签
dataset, // 数据集
PlotOrientation.VERTICAL, // HORIZONTAL,// 图表方向:水平、垂直
false, // 是否显示图例(对于简单的柱状图是false,因为只有一种,没有必要显示)
false, // 是否生成工具
false // 是否生成URL链接
);
Font titleFont = new Font("黑体", Font.BOLD, 20);
Font plotFont = new Font("宋体", Font.PLAIN, 16);
TextTitle textTitle2 = chart2.getTitle();
textTitle2.setFont(titleFont);// 为标题设置上字体
CategoryPlot categoryPlot = chart2.getCategoryPlot();
categoryPlot.getRangeAxis().setLabelFont(plotFont);// 设置Y轴标识字体
categoryPlot.getDomainAxis().setLabelFont(plotFont);// 设置X轴标识字体
categoryPlot.getDomainAxis().setTickLabelFont(plotFont);// 设置轴标记的坐标的标记字体
ChartUtilities.writeChartAsJPEG(res.getOutputStream(), 1.0f, chart2,
800, 450, null);// 输出图表
}
private static CategoryDataset getDataSet2() {
DefaultCategoryDataset dataset = new DefaultCategoryDataset();
dataset.addValue(100, "", "苹果");
dataset.addValue(200, "", "梨子");
dataset.addValue(300, "", "葡萄");
dataset.addValue(400, "", "香蕉");
dataset.addValue(500, "", "荔枝");
return dataset;
}
}
这是一个简单的柱状图实例,只有各种水果产量之间的简单对比,下面看一个对各个城市之间的水果产量进行对比的例子:
package org.ml.servlet;
import java.awt.Font;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServlet;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartUtilities;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.plot.CategoryPlot;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.title.LegendTitle;
import org.jfree.chart.title.TextTitle;
import org.jfree.data.category.CategoryDataset;
import org.jfree.data.category.DefaultCategoryDataset;
public class ChartDemoServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
public ChartDemoServlet() {
super();
}
/**
* 创建一个数据集合
*
* @return
*/
// private static DefaultPieDataset getDataSet() {
// DefaultPieDataset dataset = new DefaultPieDataset();
// dataset.setValue("苹果", 100);
// dataset.setValue("梨子", 200);
// dataset.setValue("葡萄", 300);
// dataset.setValue("香蕉", 400);
// dataset.setValue("荔枝", 500);
// return dataset;
// }
@Override
public void service(ServletRequest req, ServletResponse res)
throws ServletException, IOException {
res.setContentType("image/jpeg");// 将输出设置为image/jepg格式
CategoryDataset dataset = getDataSet3();// 取得数据集合
JFreeChart chart2 = ChartFactory.createBarChart3D("水果产量图", // 图表标题
"水果", // 目录轴的显示标签
"产量", // 数值轴的显示标签
dataset, // 数据集
PlotOrientation.VERTICAL, // HORIZONTAL,// 图表方向:水平、垂直
true, // 是否显示图例(对于简单的柱状图是false,因为只有一种,没有必要显示)
false, // 是否生成工具
false // 是否生成URL链接
);
Font titleFont = new Font("黑体", Font.BOLD, 20);
Font plotFont = new Font("宋体", Font.PLAIN, 16);
Font LegendFont = new Font("楷体", Font.PLAIN, 18);
TextTitle textTitle2 = chart2.getTitle();
textTitle2.setFont(titleFont);// 为标题设置上字体
LegendTitle legend2 = chart2.getLegend(0);
legend2.setItemFont(LegendFont);// 为图例说明设置字体
CategoryPlot categoryPlot = chart2.getCategoryPlot();
categoryPlot.getRangeAxis().setLabelFont(plotFont);// 设置Y轴标识字体
categoryPlot.getDomainAxis().setLabelFont(plotFont);// 设置X轴标识字体
categoryPlot.getDomainAxis().setTickLabelFont(plotFont);// 设置轴标记的坐标的标记字体
ChartUtilities.writeChartAsJPEG(res.getOutputStream(), 1.0f, chart2,
800, 450, null);// 输出图表
}
private CategoryDataset getDataSet3() {
DefaultCategoryDataset dataset = new DefaultCategoryDataset();
dataset.addValue(100, "北京", "苹果");
dataset.addValue(100, "上海", "苹果");
dataset.addValue(100, "广州", "苹果");
dataset.addValue(200, "北京", "梨子");
dataset.addValue(200, "上海", "梨子");
dataset.addValue(200, "广州", "梨子");
dataset.addValue(300, "北京", "葡萄");
dataset.addValue(300, "上海", "葡萄");
dataset.addValue(300, "广州", "葡萄");
dataset.addValue(400, "北京", "香蕉");
dataset.addValue(400, "上海", "香蕉");
dataset.addValue(400, "广州", "香蕉");
dataset.addValue(500, "北京", "荔枝");
dataset.addValue(500, "上海", "荔枝");
dataset.addValue(500, "广州", "荔枝");
return dataset;
}
}
运行结果如下:
JFreeChar生成柱状图的方式和饼状图的大体一致,如果不清楚可以参考这里(点击进入).