JFreeChart是一组功能强大、灵活易用的 Java绘图 API,使用它可以生成多种通用性的报表,包括柱状图、饼图、曲线图等。它能够用在 Swing和 Web等中制作自定义的图表或报表,并且得到广泛的应用。
一、jfreechart使用步骤:
1、下载并导入jfreechart所需jar包:jcommon-1.0.17.jar jfreechart-1.0.14.jar
2、环境配置:
在 web.xml文件中增加如下配置:
<
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
>
3、实现:
单色柱状图:
DefaultCategoryDataset dataset =
new
DefaultCategoryDataset();
dataset.addValue(
510
,
"深圳"
,
"苹果"
);
dataset.addValue(
320
,
"深圳"
,
"香蕉"
);
dataset.addValue(
580
,
"深圳"
,
"橘子"
);
dataset.addValue(
390
,
"深圳"
,
"梨子"
);
JFreeChart chart = ChartFactory.createBarChart3D(
"水果销量统计图"
,
"水果"
,
"销量"
,
dataset,
PlotOrientation.VERTICAL,
false
//是否显示用例
,
false
,
false
);
//其中createBarChart3D是做成3d效果平面就把3d去掉
String filename = ServletUtilities.saveChartAsPNG(chart,
420
,
300
,
null
, session);
String graphURL = request.getContextPath() +
"/DisplayChart?filename="
+ filename;
jsp页面:
<img src=
"<%= graphURL %>"
width=
420
height=
300
border=
0
>
效果如下:
混色柱状图:
double
[][] data =
new
double
[][] {{
1320
}, {
720
}, {
830
}, {
400
}};
String[] rowKeys = {
"苹果"
,
"香蕉"
,
"橘子"
,
"梨子"
};
String[] columnKeys = {
""
};
CategoryDataset dataset = DatasetUtilities.createCategoryDataset(rowKeys, columnKeys, data);
JFreeChart chart = ChartFactory.createBarChart3D(
"水果销量统计图"
,
"水果"
,
"销量"
,
dataset,
PlotOrientation.VERTICAL,
true
,
false
,
false
);
String filename = ServletUtilities.saveChartAsPNG(chart,
450
,
300
,
null
, session);
String graphURL = request.getContextPath() +
"/DisplayChart?filename="
+ filename;
jsp页面:
<img src=
"<%= graphURL %>"
width=
420
height=
300
border=
0
>
效果如下:
混色分类柱状图:
所谓混色分类柱状图,也属于混色柱状图,其它地方不变,只需修改如下部分:
double
[][] data =
new
double
[][] {{
1230
,
1110
,
1120
,
1210
}, {
720
,
750
,
860
,
800
}, {
830
,
780
,
790
,
700
,}, {
400
,
380
,
390
,
450
}};
String[] rowKeys = {
"苹果"
,
"香蕉"
,
"橘子"
,
"梨子"
};
String[] columnKeys = {
"鹤壁"
,
"西安"
,
"深圳"
,
"北京"
};
<img src=
"<%= graphURL %>"
width=
420
height=
300
border=
0
>
效果如下:
上述几例中,在某个柱子上都没有显示相应的数值,下面让我们为每个柱子都加上它的数值
double
[][] data =
new
double
[][] {{
1230
,
1110
,
1120
,
1210
}, {
720
,
750
,
860
,
800
}, {
830
,
780
,
790
,
700
,}, {
400
,
380
,
390
,
450
}};
String[] rowKeys = {
"苹果"
,
"香蕉"
,
"橘子"
,
"梨子"
};
String[] columnKeys = {
"鹤壁"
,
"西安"
,
"深圳"
,
"北京"
};
CategoryDataset dataset = DatasetUtilities.createCategoryDataset(rowKeys, columnKeys, data);
JFreeChart chart = ChartFactory.createBarChart3D(
"水果销量统计图"
,
"水果"
,
"销量"
,
dataset,
PlotOrientation.VERTICAL,
true
,
true
,
false
);
CategoryPlot plot = chart.getCategoryPlot();
//设置网格背景颜色
plot.setBackgroundPaint(Color.white);
//设置网格竖线颜色
plot.setDomainGridlinePaint(Color.pink);
//设置网格横线颜色
plot.setRangeGridlinePaint(Color.pink);
//显示每个柱的数值,并修改该数值的字体属性
BarRenderer3D renderer =
new
BarRenderer3D();
renderer.setBaseItemLabelGenerator(
new
StandardCategoryItemLabelGenerator());
renderer.setBaseItemLabelsVisible(
true
);
//默认的数字显示在柱子中,通过如下两句可调整数字的显示
//注意:此句很关键,若无此句,那数字的显示会被覆盖,给人数字没有显示出来的问题
renderer.setBasePositiveItemLabelPosition(
new
ItemLabelPosition(ItemLabelAnchor.OUTSIDE12, TextAnchor.BASELINE_LEFT));
renderer.setItemLabelAnchorOffset(10D);
//设置每个地区所包含的平行柱的之间距离
renderer.setItemMargin(
0.4
);
plot.setRenderer(renderer);
//设置地区、销量的显示位置
//将下方的“肉类”放到上方
//plot.setDomainAxisLocation(AxisLocation.TOP_OR_RIGHT);
//将默认放在左边的“销量”放到右方
//plot.setRangeAxisLocation(AxisLocation.BOTTOM_OR_RIGHT);
String filename = ServletUtilities.saveChartAsPNG(chart,
500
,
300
,
null
, session);
String graphURL = request.getContextPath() +
"/DisplayChart?filename="
+ filename;
%>
<img src=
"<%= graphURL %>"
width=
420
height=
300
border=
0>
效果如下:
以上4个案例都是纵向的柱子。下面在看一个横向的列子:
DefaultCategoryDataset dataset =
new
DefaultCategoryDataset();
dataset.addValue(
390
,
"中国"
,
"河南"
);
dataset.addValue(
220
,
"中国"
,
"河北"
);
dataset.addValue(
510
,
"中国"
,
"辽宁"
);
dataset.addValue(
580
,
"中国"
,
"山东"
);
dataset.addValue(
320
,
"中国"
,
"山西"
);
dataset.addValue(
410
,
"中国"
,
"陕西"
);
JFreeChart chart = ChartFactory.createBarChart(
"苹果年产量统计图"
,
"省份"
,
"产量(万吨)"
,
dataset,
PlotOrientation.HORIZONTAL,
false
,
false
,
false
);
CategoryPlot plot = chart.getCategoryPlot();
//设置网格背景颜色
plot.setBackgroundPaint(Color.white);
//设置网格竖线颜色
plot.setDomainGridlinePaint(Color.pink);
//设置网格横线颜色
plot.setRangeGridlinePaint(Color.pink);
//显示每个柱的数值,并修改该数值的字体属性
BarRenderer renderer =
new
BarRenderer();
renderer.setBaseItemLabelGenerator(
new
StandardCategoryItemLabelGenerator());
renderer.setBaseItemLabelsVisible(
true
);
//默认的数字显示在柱子中,通过如下两句可调整数字的显示
//注意:此句很关键,若无此句,那数字的显示会被覆盖,给人数字没有显示出来的问题
renderer.setBasePositiveItemLabelPosition(
new
ItemLabelPosition(ItemLabelAnchor.OUTSIDE3, TextAnchor.BASELINE_RIGHT));
renderer.setItemLabelAnchorOffset(20D);
plot.setRenderer(renderer);
String filename = ServletUtilities.saveChartAsPNG(chart,
500
,
300
,
null
, session);
String graphURL = request.getContextPath() +
"/DisplayChart?filename="
+ filename;
<img src=
"<%= graphURL %>"
width=
420
height=
300
border=
0>
效果如下: