JfreeChart 画图
----------------------------柱状图
String xml = "";
xml = dao.getHyXml2();
CategoryDataset dataset = common.getDataSetHy(xml);//柱状图数据
JFreeChart chart = FreeChartCommon.createBarChartCommon(dataset,"营业税改增值税分行业税收完成情况(万元)");
StandardEntityCollection sec = new StandardEntityCollection();
ChartRenderingInfo info = new ChartRenderingInfo(sec);
String filename2 = ServletUtilities.saveChartAsPNG(chart, Integer.parseInt(widtht), Integer.parseInt(heightt) ,info, request.getSession());
String graphURL = request.getContextPath()
+ "/servlet/DisplayChart?filename=" + filename2;
public CategoryDataset getDataSetHy(String xml) {
DefaultCategoryDataset dataset = new DefaultCategoryDataset();
try {
System.out.println("xml++=="+xml);
if(xml.indexOf("<ROWSET>")!=-1){//如果有数据
xml=xml.split("<ROWSET>")[1];
xml=xml.split("</ROWSET>")[0];
//xml=xml.split("ROW")[1];
xml = "<ROOT>" + xml + "</ROOT>";
Document document = DocumentHelper.parseText(xml);
// 读取ITEM
List list = document.selectNodes("//ROW");
// 获取NODE细节
Iterator it = list.iterator();
//横轴标记
String series1 = "本年累计数";
while (it.hasNext()) {
Node node = (Node) it.next();
String sz = Tools.nullToSpace(node.valueOf("HY")).trim();
dataset.addValue(Double.parseDouble(node.valueOf("LJ")),
Tools.nullToSpace(series1),
sz);
// dataset.addValue(Double.parseDouble(node.valueOf("ZF")),
// Tools.nullToSpace(series3),
// sz);
}
}
} catch (Exception e) {
e.printStackTrace();
}
return dataset;
}
/**
/**
* 柱形图(公共方法)
* @param xml
* @param sz
* @return
*/
public static JFreeChart createBarChartCommon(CategoryDataset dataset,String title){
JFreeChart chart = ChartFactory.createBarChart(title, // 图表标题
"", // 目录轴的显示标签
"", // 数值轴的显示标签
dataset, // 数据集
PlotOrientation.VERTICAL, // 图表方向:水平、垂直
true, // 是否显示图例(对于简单的柱状图必须是false)
true, // 是否生成工具
true // 是否生成URL链接
);
// 设置总的背景颜色
// chart.setBackgroundPaint(ChartColor.WHITE);
// 设置标题颜色
chart.getTitle().setPaint(ChartColor.black);
//显示每个柱的数值,并修改该数值的字体属性
chart.getTitle().setFont(new Font("宋体",Font.BOLD,20));
chart.getLegend().setItemFont(new Font("宋体",Font.BOLD,10));
CategoryPlot plot=chart.getCategoryPlot();//获取图表区域对象
// 设置表格线为实线
plot.setDomainGridlineStroke(new BasicStroke());
plot.setRangeGridlineStroke(new BasicStroke());
// 设置图的背景颜色
plot.setBackgroundPaint(ChartColor.WHITE);
// 设置表格线颜色
plot.setRangeGridlinePaint(Color.gray.lightGray);
CategoryAxis domainAxis=plot.getDomainAxis();
//水平底部列表
domainAxis.setLabelFont(new Font("宋体",Font.BOLD,14));
//水平底部标题
domainAxis.setTickLabelFont(new Font("宋体",Font.BOLD,12));
domainAxis.setCategoryMargin(0.3);//
//垂直标题
ValueAxis rangeAxis=plot.getRangeAxis();//获取柱状
rangeAxis.setLabelFont(new Font("宋体",Font.BOLD,15));
rangeAxis.setUpperMargin(0.2);
plot.setNoDataMessage("无对应的数据,请重新查询。");
BarRenderer renderer = new BarRenderer();//背景立体控制
// renderer.setItemLabelAnchorOffset(10D);
renderer.setSeriesPaint(0, Color.decode("#F8D661"));// 给series1 Bar
renderer.setSeriesPaint(1, Color.decode("#0000FF")); // 给series2 Bar
renderer.setShadowVisible(false); // 柱状图不显示阴影
//数据下钻用,给每个柱子做一个连接,指向
// renderer.setBaseItemURLGenerator(new StandardCategoryURLGenerator("kkhzAction.do?sz="+sz+"&qx_swjgdm="+qx_swjgdm, "kkzt", "a"));
plot.setRenderer(renderer);
//控制数据显示
renderer.setItemLabelGenerator( new StandardCategoryItemLabelGenerator());
renderer.setItemLabelsVisible( true );
return chart;
}
------------------------------------------折线图--------------------------
String xml = "";
xml = dao.getYf();
CategoryDataset lineDataset = common.getDataSet_3(xml);//
String title="山东国税税收收入趋势(万元)";
JFreeChart chart = FreeChartCommon.generateLineChartCommon(lineDataset,title);
StandardEntityCollection sec = new StandardEntityCollection();
ChartRenderingInfo info = new ChartRenderingInfo(sec);
String filename2 = ServletUtilities.saveChartAsPNG(chart, Integer.parseInt(widtht), Integer.parseInt(heightt) ,info, request.getSession());
String graphURL = request.getContextPath()
+ "/servlet/DisplayChart?filename=" + filename2;
/**
* 折线图(公共)
*/
public static JFreeChart generateLineChartCommon(CategoryDataset dataset,String title) {
JFreeChart chart = ChartFactory.createLineChart(title, // 图表标题
"", // 目录轴的显示标签
"", // 数值轴的显示标签
dataset, // 数据集
PlotOrientation.VERTICAL, // 图表方向:水平、垂直
true, // 是否显示图例(对于简单的柱状图必须是false)
false, // 是否生成工具
false // 是否生成URL链接
);
/*------------配置图表属性--------------*/
// 1,设置整个图表背景颜色
chart.setBackgroundPaint(Color.white);
/*------------设定Plot参数-------------*/
CategoryPlot plot = chart.getCategoryPlot();
// 2,设置详细图表的显示细节部分的背景颜色
// plot.setBackgroundPaint(Color.PINK);
// 3,设置垂直网格线颜色
//plot.setDomainGridlinePaint(Color.gray.lightGray);
// 4,设置是否显示垂直网格线
plot.setDomainGridlinesVisible(true);
plot.setDomainGridlineStroke(new BasicStroke());
// 5,设置水平网格线颜色
plot.setRangeGridlinePaint(Color.gray.lightGray);
// 6,设置是否显示水平网格线
plot.setRangeGridlinesVisible(true);
// 7设置图的背景颜色
plot.setBackgroundPaint(ChartColor.WHITE);
// 8设置水平网格线实线
plot.setRangeGridlineStroke(new BasicStroke());
// // 设置表格线颜色
// plot.setRangeGridlinePaint(ChartColor.gray);
/*----------设置消除字体的锯齿渲染(解决中文问题)--------------*/
//显示每个柱的数值,并修改该数值的字体属性
chart.getTitle().setFont(new Font("宋体", Font.BOLD, 20));
chart.getLegend().setItemFont(new Font("宋体", Font.BOLD, 10));
CategoryAxis domainAxis = plot.getDomainAxis();
/*------设置X轴坐标上的文字-----------*/
domainAxis.setTickLabelFont(new Font("宋体", Font.PLAIN, 13));
/*------设置X轴的标题文字------------*/
domainAxis.setLabelFont(new Font("宋体", Font.PLAIN, 8));
domainAxis.setMaximumCategoryLabelLines(2); // 这边的4代表最多显示4行字
NumberAxis numberaxis = (NumberAxis) plot.getRangeAxis();
/*------设置Y轴坐标上的文字-----------*/
numberaxis.setTickLabelFont(new Font("宋体", Font.PLAIN, 14));
/*------设置Y轴的标题文字------------*/
numberaxis.setLabelFont(new Font("宋体", Font.PLAIN, 12));
numberaxis.setStandardTickUnits(NumberAxis.createIntegerTickUnits());
numberaxis.setAutoRangeIncludesZero(true);
numberaxis.setUpperMargin(0.20);
numberaxis.setLabelAngle(Math.PI / 2.0);
chart.getLegend().setItemFont(new Font("宋体",Font.BOLD,10));
// 获得renderer 注意这里是下嗍造型到lineandshaperenderer!!
LineAndShapeRenderer lineandshaperenderer = (LineAndShapeRenderer)plot.getRenderer();
//
lineandshaperenderer.setBaseShapesVisible(true); // series 点(即数据点)可见
lineandshaperenderer.setBaseShapesFilled(false);
lineandshaperenderer.setBaseLinesVisible(true); // series 点(即数据点)间有连线可见
lineandshaperenderer.setSeriesStroke(0, new BasicStroke(3.0F));
lineandshaperenderer.setSeriesStroke(1, new BasicStroke(3.0F));
lineandshaperenderer.setSeriesStroke(2, new BasicStroke(3.0F));
lineandshaperenderer.setSeriesStroke(3, new BasicStroke(3.0F));
//显示折点数据
// lineandshaperenderer.setBaseItemLabelGenerator(new
// StandardCategoryItemLabelGenerator());
// lineandshaperenderer.setBaseItemLabelsVisible(true);
return chart;
}
----------------------------------------------------------饼图--------------------------
xml = dao.getSsFsz(bn,by);
PieDataset datasetPie = common.getDataSetSzPie(xml);
JFreeChart chart2 = FreeChartCommon.createPieChartCommon(datasetPie,"累计入库数分税种占比");
StandardEntityCollection sec2 = new StandardEntityCollection();
ChartRenderingInfo info2 = new ChartRenderingInfo(sec2);
String filename3 = ServletUtilities.saveChartAsPNG(chart2, Integer.parseInt(widtht), Integer.parseInt(heightt) ,info2, request.getSession());
// ChartUtilities.writeImageMap(out, "map0", info, false); //我们在IMG标签中加入usemap="#map0"就可以为饼图的每一部分加入链接。
String graphURL2 = request.getContextPath()
+ "/servlet/DisplayChart?filename=" + filename3;
/**
* 获取一个饼图数据集对象
*
* @return
*/
public PieDataset getDataSetSzPie(String xml) {
DefaultPieDataset dataset = new DefaultPieDataset();
try {
System.out.println("xml++=="+xml);
if(xml.indexOf("<ROWSET>")!=-1){//如果有数据
xml=xml.split("<ROWSET>")[1];
xml=xml.split("</ROWSET>")[0];
//xml=xml.split("ROW")[1];
xml = "<ROOT>" + xml + "</ROOT>";
Document document = DocumentHelper.parseText(xml);
java.text.DecimalFormat df = new java.text.DecimalFormat("#0.00");
// 读取ITEM
List list = document.selectNodes("//ROW");
// 获取NODE细节
Iterator it = list.iterator();
String series1 = "增值税";
String series3 = "企业所得税";
String series2 = "消费税";
String series5 = "车辆购置税";
String series4 = "个人所得税";
//
int i=0;
while (it.hasNext()) {
String a[] = {series1,series2,series3,series4,series5};
Node node = (Node) it.next();
System.out.println("a[i]=="+a[i]);
dataset.setValue(a[i],Double.parseDouble(df.format(Double.parseDouble(node.valueOf("BNLJ")))));
i++;
}
}
List list = dataset.getKeys();
System.out.println("list=="+list);
} catch (Exception e) {
e.printStackTrace();
}
return dataset;
}
/**
* 饼图公共方法
*/
public static JFreeChart createPieChartCommon(PieDataset dataset,String title){
// PieDataset dataset = getDataSetSzPie(xml);//饼图
// JFreeChart chart = ChartFactory.createPieChart("截止"+year+"年"+month+"月"+day+"日"+hour+"点税收完成情况\n山东国税局分税种税收完成情况(万元/%)", // 图表标题
JFreeChart chart = ChartFactory.createPieChart(title, // 图表标题
dataset, // 数据集
true, // 是否显示图例(对于简单的柱状图必须是false)
true, // 是否生成工具
false // 是否生成URL链接
);
// 设置总的背景颜色
chart.setBackgroundPaint(ChartColor.WHITE);
// 设置标题颜色
chart.getTitle().setPaint(ChartColor.black);
chart.getTitle().setFont(new Font("宋体",Font.BOLD,20));
chart.getLegend().setItemFont(new Font("宋体",Font.BOLD,10));
PiePlot plot = (PiePlot) chart.getPlot();//获取图表区域对象
plot.setBackgroundPaint(ChartColor.WHITE);
plot.setLabelFont(new Font("宋体",Font.PLAIN,12));
plot.setLabelGap(0.01D);//间距
plot.setNoDataMessage("无对应的数据,请重新查询。");
//设置无数据时的信息显示颜色
plot.setNoDataMessagePaint(Color.red);
// 图片中显示百分比:默认方式
plot.setLabelGenerator(new StandardPieSectionLabelGenerator(
StandardPieToolTipGenerator.DEFAULT_TOOLTIP_FORMAT));
// 图片中显示百分比:自定义方式,{0} 表示选项, {1} 表示数值,
//{2} 表示所占比例 ,小数点后两位
plot.setLabelGenerator(new StandardPieSectionLabelGenerator(
"{0}:{2}", NumberFormat.getNumberInstance(),//{0}:{1}({2})
new DecimalFormat("0.00%")));
// 图例显示百分比:自定义方式, {0} 表示选项, {1} 表示数值, {2} 表示所占比例
plot.setLegendLabelGenerator(new StandardPieSectionLabelGenerator(
"{0}"));
// 指定图片的透明度(0.0-1.0)
plot.setForegroundAlpha(1.0f);
// 指定显示的饼图上圆形(true)还椭圆形(false)
plot.setCircular(true);
// 设置图上分类标签label的字体,解决中文乱码
//plot.setLabelFont(new Font("黑体", Font.PLAIN, 12));
// 设置图上分类标签label的最大宽度,相对与plot的百分比
plot.setMaximumLabelWidth(0.2);
//设置起始角度,默认值为90,当为0时,起始值在3点钟方向
plot.setStartAngle(45);
plot.setShadowYOffset(0);//设置阴影对于y轴相对位移为0;
plot.setShadowXOffset(0);//设置阴影对于 x轴相对位移为 0;
// 增加url
// plot.setURLGenerator(new StandardPieURLGenerator("kkhzAction.do?sz="+sz+"&qx_swjgdm="+qx_swjgdm, "kkzt"));
// 设置图标题的字体,解决中文乱码
TextTitle textTitle = chart.getTitle();
textTitle.setFont(new Font("黑体", Font.PLAIN, 20));
// 设置背景色为白色
chart.setBackgroundPaint(Color.white);
// 设置Legend部分字体,解决中文乱码
chart.getLegend().setItemFont(new Font("宋体", Font.PLAIN, 12));
return chart;
}
----------------------------------------------------------柱状图与折线图综合图--------------------------
String xml = "";
xml = dao.getSs();
CategoryDataset dataset = common.getDataSetSz(xml);//柱状图数据
CategoryDataset lineDataset = common.getDataSetSzZfGn(xml);//增幅数据
// JFreeChart chart = FreeChartCommon.createBarChartSzwc(xml);
JFreeChart chart = FreeChartCommon.createBarLineChartCommon(dataset,lineDataset,"");
StandardEntityCollection sec = new StandardEntityCollection();
ChartRenderingInfo info = new ChartRenderingInfo(sec);
//320是图片长度,240是图片高度
String filename2 = ServletUtilities.saveChartAsPNG(chart, Integer.parseInt(widtht), Integer.parseInt(heightt) ,info, request.getSession
());
// ChartUtilities.writeImageMap(out, "map0", info, false); //我们在IMG标签中加入usemap="#map0"就可以为饼图的每一部分加入链接。
String graphURL = request.getContextPath()
+ "/servlet/DisplayChart?filename=" + filename2;
/**
* 获取一个柱状图数据集对象
*
* @return
*/
public CategoryDataset getDataSetSz(String xml) {
DefaultCategoryDataset dataset = new DefaultCategoryDataset();
try {
System.out.println("xml++=="+xml);
if(xml.indexOf("<ROWSET>")!=-1){//如果有数据
xml=xml.split("<ROWSET>")[1];
xml=xml.split("</ROWSET>")[0];
//xml=xml.split("ROW")[1];
xml = "<ROOT>" + xml + "</ROOT>";
Document document = DocumentHelper.parseText(xml);
java.text.DecimalFormat df = new java.text.DecimalFormat("#0.00");
// 读取ITEM
List list = document.selectNodes("//ROW");
// 获取NODE细节
Iterator it = list.iterator();
String series1 = "累计入库数(万元)";
while (it.hasNext()) {
Node node = (Node) it.next();
String sz = Tools.nullToSpace(node.valueOf("SZ")).trim();
dataset.addValue(Double.parseDouble(df.format(Double.parseDouble(node.valueOf("BNLJ")))),
Tools.nullToSpace(series1),
sz);
// dataset.addValue(Double.parseDouble(df.format(Double.parseDouble(node.valueOf("BNRK")))),
// Tools.nullToSpace(series2),
// sz);
}
}
} catch (Exception e) {
e.printStackTrace();
}
return dataset;
}
/**
* 柱形图线形图 综合图(公共)
* @param xml
* @param sz
* @return
*/
public static JFreeChart createBarLineChartCommon(CategoryDataset dataset,CategoryDataset lineDataset,String title){
JFreeChart chart = ChartFactory.createBarChart(title, // 图表标题
"", // 目录轴的显示标签
"", // 数值轴的显示标签
dataset, // 数据集
PlotOrientation.VERTICAL, // 图表方向:水平、垂直
true, // 是否显示图例(对于简单的柱状图必须是false)
true, // 是否生成工具
true // 是否生成URL链接
);
// 设置总的背景颜色
// chart.setBackgroundPaint(ChartColor.WHITE);
// 设置标题颜色
chart.getTitle().setPaint(ChartColor.black);
//显示每个柱的数值,并修改该数值的字体属性
chart.getTitle().setFont(new Font("宋体",Font.BOLD,20));
chart.getLegend().setItemFont(new Font("宋体",Font.BOLD,10));
CategoryPlot plot=chart.getCategoryPlot();//获取图表区域对象
// 设置表格线为实线
plot.setDomainGridlineStroke(new BasicStroke());
plot.setRangeGridlineStroke(new BasicStroke());
// 设置图的背景颜色
plot.setBackgroundPaint(ChartColor.WHITE);
// 设置表格线颜色
plot.setRangeGridlinePaint(Color.gray.lightGray);
CategoryAxis domainAxis=plot.getDomainAxis();
//水平底部列表
domainAxis.setLabelFont(new Font("宋体",Font.BOLD,14));
//水平底部标题
domainAxis.setTickLabelFont(new Font("宋体",Font.BOLD,12));
// domainAxis.setMaximumCategoryLabelLines(2); // 这边的4代表最多显示4行字
domainAxis.setCategoryMargin(0.3);//
//domainAxis.setMaximumCategoryLabelLines(5);
// domainAxis.setCategoryMargin(20);
//domainAxis.setLowerMargin(0.3);
//垂直标题
ValueAxis rangeAxis=plot.getRangeAxis();//获取柱状
rangeAxis.setLabelFont(new Font("宋体",Font.BOLD,15));
rangeAxis.setUpperMargin(0.2);
// rangeAxis.setAutoRangeMinimumSize(10);
// rangeAxis.setAutoRange(false);
// rangeAxis.setAutoTickUnitSelection(false);//数据轴的数据标签是否自动确定(默认为true)
// rangeAxis.setStandardTickUnits(rangeAxis.getStandardTickUnits());//数据轴的数据标签
// rangeAxis.setLowerBound(0.0); //数据轴上的显示最小值;
// rangeAxis.setAutoRangeMinimumSize(100000);//1为一个间隔单位
// plot.setRangeAxis(rangeAxis);
// 得到坐标设置字体解决乱码
//CategoryPlot categoryplot = (CategoryPlot) chart.getPlot();
plot.setNoDataMessage("无对应的数据,请重新查询。");
//画折线图
plot.setDataset(1, lineDataset);//放折线图数据
plot.mapDatasetToRangeAxis(1, 1); //折线图与右坐标关联
plot.setOutlinePaint(Color.white); //设置图片边框颜色,去掉边框
LineAndShapeRenderer lineandshaperenderer = new LineAndShapeRenderer();
lineandshaperenderer.setToolTipGenerator(new StandardCategoryToolTipGenerator());
plot.setRenderer(1, lineandshaperenderer);
plot.setDatasetRenderingOrder(DatasetRenderingOrder.FORWARD);
LegendTitle legendtitle = new LegendTitle(plot.getRenderer(1));
//右边Y轴,相关属性设置 ,坐标设置
// double unit=0.2d;//刻度的长度
NumberAxis numberaxis1 = new NumberAxis("");
numberaxis1.setUpperMargin(0.2);
// unit=Math.floor(50);//刻度的长度
// NumberTickUnit ntu= new NumberTickUnit(unit);
// numberaxis1.setTickUnit(ntu);
// numberaxis1.setRange(0.00,500);//刻度范围
plot.setRangeAxis(1, numberaxis1);
BlockContainer blockcontainer = new BlockContainer(new BorderArrangement());
blockcontainer.add(legendtitle, RectangleEdge.RIGHT);
BarRenderer renderer = new BarRenderer();//背景立体控制
// renderer.setItemLabelAnchorOffset(10D);
renderer.setSeriesPaint(0, Color.decode("#F8D661"));// 给series1 Bar
renderer.setSeriesPaint(1, Color.decode("#0000FF")); // 给series2 Bar
renderer.setShadowVisible(false); // 柱状图不显示阴影
//数据下钻用,给每个柱子做一个连接,指向
// renderer.setBaseItemURLGenerator(new StandardCategoryURLGenerator("kkhzAction.do?sz="+sz+"&qx_swjgdm="+qx_swjgdm, "kkzt", "a"));
plot.setRenderer(renderer);
//控制数据显示
// renderer.setItemLabelGenerator( new StandardCategoryItemLabelGenerator());
// renderer.setItemLabelsVisible( true );
return chart;
}
本文原创,转载必追究版权。