如何将数据以柱状图的形式显示出来?
实现过程:
1、获取数据;
2、根据工厂模式生成图形对象,通过获取该图形对象,来进一步获得该图形对象内部的小对象,并对它们的字体等进行设置;
3、将图形放到面板中;
4、构建一个方法,将放置了图形的面板返回出去,当需要使用该面板时只需调用该方法即可(封装);
5、创建一个窗体,将面板放到该窗体中进行显示;
柱形图比饼状图复杂,生成的图标数据需要有两个维度。两个维度从数据集的生成角度可以按照类别分为数据集(DefaultCategoryDataset )和XY分的数据集(XYDataset)两种。
BarChartServlet.java
import java.awt.Font;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.CategoryAxis;
import org.jfree.chart.axis.ValueAxis;
import org.jfree.chart.plot.CategoryPlot;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.data.category.CategoryDataset;
import org.jfree.data.category.DefaultCategoryDataset;
/**
* @author lmb
*报表图形实现类
*/
public class BarChartServlet {
//用于获取数据
private static CategoryDataset getDataset(){
DefaultCategoryDataset dataset=new DefaultCategoryDataset();//创建数据集对象
//往数据集对象中添加数据(实际应用中是从数据库,Excel文件或者文本文件中获取数据,这里为了方便起见将数据直接给出)
//-------------------------------苹果的销售记录
dataset.addValue(100,"北京","苹果");//数据值,X轴,Y轴
dataset.addValue(150,"深圳","苹果");
dataset.addValue(80,"广州","苹果");
//-------------------------------橘子的销售记录
dataset.addValue(120,"北京","梨子");
dataset.addValue(110,"深圳","梨子");
dataset.addValue(170,"广州","梨子");
//-------------------------------葡萄的销售记录
dataset.addValue(140,"北京","葡萄");
dataset.addValue(90,"深圳","葡萄");
dataset.addValue(100,"广州","葡萄");
//-------------------------------香蕉的销售记录
dataset.addValue(380,"北京","香蕉");
dataset.addValue(420,"深圳","香蕉");
dataset.addValue(140,"广州","香蕉");
//-------------------------------榴莲的销售记录
dataset.addValue(320,"北京","荔枝");
dataset.addValue(270,"深圳","荔枝");
dataset.addValue(300,"广州","荔枝");
return dataset;
}
//构建容器面板,用于存放已经画好的图形报表
private ChartPanel frame1;
//在构造方法中将图形报表初始化
public BarChart(){
//获取数据
CategoryDataset dataset = getDataset();
//创建图形实体对象
JFreeChart chart=ChartFactory.createBarChart3D(//工厂模式
"水果", //图形的标题
"水果种类", //目录轴的显示标签(X轴)
"数量", //数据轴的显示标签(Y轴)
dataset, //数据集
PlotOrientation.VERTICAL, //垂直显示图形
true, //是否生成图样
false, //是否生成提示工具
false);//是否生成URL链接
CategoryPlot plot=chart.getCategoryPlot();//获取图形区域对象
//------------------------------------------获取X轴
CategoryAxis domainAxis=plot.getDomainAxis();
domainAxis.setLabelFont(new Font("黑体",Font.BOLD,14));//设置X轴的标题的字体
domainAxis.setTickLabelFont(new Font("宋体",Font.BOLD,12));//设置X轴坐标上的字体
//-----------------------------------------获取Y轴
ValueAxis rangeAxis=plot.getRangeAxis();
rangeAxis.setLabelFont(new Font("黑体",Font.BOLD,15));//设置Y轴坐标上的标题字体
//设置图样的文字样式
chart.getLegend().setItemFont(new Font("黑体",Font.BOLD ,15));
//设置图形的标题
chart.getTitle().setFont(new Font("宋体",Font.BOLD ,20));
frame1 =new ChartPanel(chart,true);//将已经画好的图形报表存放到面板中
}
//构建一个方法,用于获取存放了图形的面板(封装:隐藏具体实现)
public ChartPanel getChartPanel(){
return frame1;
}
}
DemoFrame.java
/**
* @author lmb
*窗体类
*/
public class DemoFrame extends JFrame{
//在构造方法中初始化窗体
public DemoFrame(){
//----------------------设置窗体大小
this.setSize(800,600);
//---------------------------将报表面板添加到窗体中
this.add(new BarChart().getChartPanel());
//----------------------设置窗体大小不可变
this.setResizable(false);
//----------------------设置窗体相对于屏幕居中
this.setLocationRelativeTo(null);
//------------------------设置窗体可见
this.setVisible(true);
}
public static void main(String[] args) {
new DemoFrame();
}
}
为了方便起见该例中的数据直接使用的自定义数据,但在实际应用中我们使用的数据多来自于数据库、Excel文件或者文本文件。
1、利用DefaultCategoryDataset数据集绘制柱形图数据集对象DefaultCategoryDataset;
2、生成数据的方法是addValue(),添加数据时需要指定比较的种类和分类;
3、对应创建柱形图的方法是createBarChart3D();
4、可以对图标的X轴对象CategoryAxis对象进行设置。
按照XY轴分类生成的柱形图可以将数据按照两个维度显示为柱形图,此时生成数据集时要有XYDataset对象。
BarChartServlet2.java
package com.lmb.jfreechart;
import java.awt.Color;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartUtilities;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.plot.XYPlot;
import org.jfree.chart.renderer.xy.XYBarRenderer;
import org.jfree.data.xy.IntervalXYDataset;
import org.jfree.data.xy.XYBarDataset;
import org.jfree.data.xy.XYSeries;
import org.jfree.data.xy.XYSeriesCollection;
public class BarChartServlet2 extends HttpServlet {
private static final long serialVersionUID = 935480272440185396L;
public BarChartServlet2() {
super();
}
public void doGet(HttpServletRequest request, HttpServletResponse
response)
throws ServletException, IOException {
this.doPost(request, response);
}
public void doPost(HttpServletRequest request, HttpServletResponse
response)
throws ServletException, IOException {
// 设置返回类型为图片
response.setContentType("image/png");
// 获取数据集对象
IntervalXYDataset dataset = createDataset();
// 创建图形对象
JFreeChart jfreechart = ChartFactory.createXYBarChart("08年图
书销售量", null,
false, "销量", dataset,
PlotOrientation.VERTICAL, true, false,
false);
// 设置背景为白色
jfreechart.setBackgroundPaint(Color.white);
// 获得图表区域对象
XYPlot xyplot = (XYPlot) jfreechart.getPlot();
// 设置区域对象背景为灰色
xyplot.setBackgroundPaint(Color.lightGray);
// 设置区域对象网格线调为白色
xyplot.setDomainGridlinePaint(Color.white);
xyplot.setRangeGridlinePaint(Color.white);
// 获显示图形对象
XYBarRenderer xybarrenderer = (XYBarRenderer)
xyplot.getRenderer();
// 设置不显示边框线
xybarrenderer.setDrawBarOutline(false);
// 将图表已数据流的方式返回给客户端
ChartUtilities.writeChartAsPNG(response.getOutputStream(),
jfreechart,
500, 270);
}
/**
* 返回数据集
*
* @return
*/
private static IntervalXYDataset createDataset() {
// 创建基本数据
XYSeries xyseries = new XYSeries("JAVA");
XYSeries xyseries1 = new XYSeries("PHP");
for (int i = 1; i <= 12; i++) {
// 添加数据
xyseries.add(i,DataUtils.getRandomData());
xyseries1.add(i,DataUtils.getRandomData());
}
XYSeriesCollection xyseriescollection = new
XYSeriesCollection();
xyseriescollection.addSeries(xyseries);
xyseriescollection.addSeries(xyseries1);
return new XYBarDataset(xyseriescollection,
0.90000000000000002D);
}
}
web.xml略。。。
1、利用XYDataset数据集绘制柱形图数据集对象IntervalXYDataset;
2、生成数据的方法是通过XYSeries对象,并且XYSeriesCollection对象将其转化成XYDataset;
3、对应创建柱状图的方法createXYBarChart();
4、可以对图形渲染对象XYBarRenderer设置图形的显示。