六狼论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博账号登陆

只需一步,快速开始

搜索
查看: 51|回复: 0

JFreeChart应用

[复制链接]

升级  11%

65

主题

65

主题

65

主题

举人

Rank: 3Rank: 3

积分
233
 楼主| 发表于 2013-2-7 14:44:08 | 显示全部楼层 |阅读模式
1.servlet
package com.logcd.servlet;import java.awt.Color;import java.awt.Font;import java.awt.GradientPaint;import java.awt.RenderingHints;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.axis.CategoryAxis;import org.jfree.chart.axis.ValueAxis;import org.jfree.chart.labels.ItemLabelAnchor;import org.jfree.chart.labels.ItemLabelPosition;import org.jfree.chart.labels.StandardCategoryItemLabelGenerator;import org.jfree.chart.labels.StandardPieSectionLabelGenerator;import org.jfree.chart.labels.StandardXYItemLabelGenerator;import org.jfree.chart.plot.CategoryPlot;import org.jfree.chart.plot.PiePlot;import org.jfree.chart.plot.PiePlot3D;import org.jfree.chart.plot.Plot;import org.jfree.chart.plot.PlotOrientation;import org.jfree.chart.plot.XYPlot;import org.jfree.chart.renderer.category.BarRenderer3D;import org.jfree.chart.renderer.category.CategoryItemRenderer;import org.jfree.chart.renderer.category.LineAndShapeRenderer;import org.jfree.chart.renderer.xy.XYLineAndShapeRenderer;import org.jfree.chart.title.LegendTitle;import org.jfree.data.category.CategoryDataset;import org.jfree.data.category.DefaultCategoryDataset;import org.jfree.data.general.Dataset;import org.jfree.data.general.DefaultPieDataset;import org.jfree.data.xy.XYDataset;import org.jfree.data.xy.XYSeries;import org.jfree.data.xy.XYSeriesCollection;import org.jfree.ui.TextAnchor;import org.jfree.util.Rotation;public class JChartServlet extends HttpServlet {private static final long serialVersionUID = 1L;private static enum ChartType {BarChart,BarChart3D,PieChart,PieChart3D,LineChart,LineChart3D,XYLineChart}/** * 处理请求 */public void service(ServletRequest request, ServletResponse response)throws ServletException, IOException {String type = request.getParameter("type");ChartType chartType = getChartType(Integer.parseInt(type)); response.setContentType("image/jpeg");JFreeChart chart = createChart(getDataSet(chartType),chartType);setChartStyle(chart);ChartUtilities.writeChartAsJPEG(response.getOutputStream(), 0.9f, chart,480, 350, null);}/** * 创建图表 * @param dataset * @param chartType * @return */public static JFreeChart createChart(Dataset dataset,ChartType chartType){JFreeChart chart = null;switch(chartType){    case BarChart:chart = ChartFactory.createBarChart("水果产量图",// 图表标题"水果种类",// X轴的显示标签"产量",// Y轴的显示标签(CategoryDataset)dataset, // 数据集PlotOrientation.VERTICAL, // 图表方向:水平、垂直true,//是否显示图例(对于简单的柱状图必须是false)false,false);//是否生成URL链接    break;        case BarChart3D:chart = ChartFactory.createBarChart3D("水果产量图",// 图表标题"水果种类",// X轴的显示标签"产量",// Y轴的显示标签(CategoryDataset)dataset, // 数据集PlotOrientation.VERTICAL, // 图表方向:水平、垂直true,//是否显示图例(对于简单的柱状图必须是false)false,//是否启用提示false);//是否生成URL链接    break;                case PieChart:chart = ChartFactory.createPieChart("水果产量图", (DefaultPieDataset)dataset, true,false, false);    break;        case PieChart3D:chart = ChartFactory.createPieChart3D("水果产量图", (DefaultPieDataset)dataset, true,false, false);    break;        case LineChart:    chart = ChartFactory.createLineChart("水果产量图", "水果种类",                   "产量", (CategoryDataset)dataset, PlotOrientation.VERTICAL, true,                   false, false);      break;        case LineChart3D:    chart = ChartFactory.createLineChart3D("水果产量图", "水果种类",                   "产量", (CategoryDataset)dataset, PlotOrientation.VERTICAL, true,                   false, false);      break;        case XYLineChart:    chart = ChartFactory.createXYLineChart("苹果产量图", "月份",                   "产量", (XYDataset)dataset, PlotOrientation.VERTICAL, true,                   false, false);      break;}return chart;}/** * 设置chart风格 *  * @param chart */public static void setChartStyle(JFreeChart chart) {// 设置一个背景,从渐到深的倾斜chart.setBackgroundPaint(new GradientPaint(0.0F, 0.0F, Color.PINK,10000F, 0.0F, Color.YELLOW));chart.getTitle().setFont(new Font("SimSun", Font.BOLD, 12));// 标题的字体Font font = new Font("黑体", Font.TRUETYPE_FONT, 10);// 公用字体LegendTitle legend = (LegendTitle) chart.getLegend();// 图例legend.setItemFont(font);chart.getRenderingHints().put(RenderingHints.KEY_TEXT_ANTIALIASING,RenderingHints.VALUE_TEXT_ANTIALIAS_OFF);Plot plot = chart.getPlot();if (plot instanceof CategoryPlot) {CategoryPlot categryPlot = (CategoryPlot) chart.getPlot();// 图表层plot.setBackgroundAlpha(0.6f);plot.setForegroundAlpha(0.9F);// 设置透明度CategoryAxis domain_axis = categryPlot.getDomainAxis();domain_axis.setTickLabelFont(font);// X轴标尺字体domain_axis.setLabelFont(font);// X轴标题标签字体//横坐标数据倾斜45度 //domain_axis.setCategoryLabelPositions(CategoryLabelPositions.UP_45); ValueAxis value_axis = categryPlot.getRangeAxis();value_axis.setTickLabelFont(font);// Y轴标尺字体value_axis.setLabelFont(font);// Y轴标题标签字体// VALUE_TEXT_ANTIALIAS_OFF表示将文字的抗锯齿关闭chart.getRenderingHints().put(RenderingHints.KEY_TEXT_ANTIALIASING,RenderingHints.VALUE_TEXT_ANTIALIAS_OFF);CategoryItemRenderer renderer = chart.getCategoryPlot().getRenderer();renderer.setBaseItemLabelGenerator(new StandardCategoryItemLabelGenerator());            //设置item(bar)标签值的位置是在上面还是在bar内 renderer.setBasePositiveItemLabelPosition(new ItemLabelPosition(ItemLabelAnchor.OUTSIDE12, TextAnchor.BASELINE_CENTER)); if(renderer instanceof LineAndShapeRenderer){((LineAndShapeRenderer)renderer).setBaseShapesVisible(true);//显示折线图上的数据标志}if(renderer instanceof BarRenderer3D){((BarRenderer3D)renderer).setItemLabelAnchorOffset(10D);// 设置柱形图上的文字偏离值 }renderer.setBaseItemLabelFont(new Font("Serif", Font.PLAIN, 10));renderer.setBaseItemLabelsVisible(true);}if (plot instanceof PiePlot) {// 得到3D饼图的plot对象PiePlot piePlot = (PiePlot) chart.getPlot();plot.setBackgroundAlpha(0.6f);// 设置旋转角度piePlot.setStartAngle(290);// 设置旋转方向:顺时针方向piePlot.setDirection(Rotation.CLOCKWISE);// 设置透明度piePlot.setForegroundAlpha(0.5f);piePlot.setLabelFont((new Font("宋体", Font.PLAIN, 12)));piePlot.setLabelGenerator(new StandardPieSectionLabelGenerator(               "{0}:{1}({2})"));//名称、值、百分比//设置扇区边框不可见           piePlot.setSectionOutlinesVisible(false);            if(!(plot instanceof PiePlot3D)){            //设置扇区分离显示            piePlot.setExplodePercent("苹果", 0.2D);              }}if(plot instanceof XYPlot){ XYPlot xyPlot = (XYPlot) chart.getPlot(); xyPlot.setBackgroundAlpha(0.6f);  ValueAxis domain_axis = xyPlot.getDomainAxis(); domain_axis.setTickLabelFont(font); domain_axis.setLabelFont(font);  ValueAxis range_axis = xyPlot.getRangeAxis(); range_axis.setTickLabelFont(font); range_axis.setLabelFont(font);  XYLineAndShapeRenderer renderer       = (XYLineAndShapeRenderer) xyPlot.getRenderer();             renderer.setBaseShapesVisible(true);//显示数据标志 renderer.setBaseItemLabelGenerator(new StandardXYItemLabelGenerator());     renderer.setBaseItemLabelsVisible(true);     renderer.setBaseItemLabelFont(font);}}public static ChartType getChartType(Integer type){ChartType chartType = ChartType.PieChart;switch(type){   case 0: chartType = ChartType.BarChart;   break;   case 1: chartType = ChartType.BarChart3D;   break;   case 2: chartType = ChartType.PieChart;   break;   case 3: chartType = ChartType.PieChart3D;   break;   case 4: chartType = ChartType.LineChart;   break;   case 5: chartType = ChartType.LineChart3D;   break;   case 6: chartType = ChartType.XYLineChart;   break;}return chartType;}/** * 获取一个演示用的简单数据集对象 *  * @return */private static Dataset getDataSet(ChartType type) {switch(type){   case BarChart :    case BarChart3D:   case LineChart:   case LineChart3D:DefaultCategoryDataset categorydataset = new DefaultCategoryDataset();categorydataset.addValue(100, "北京", "苹果");categorydataset.addValue(70, "上海", "苹果");categorydataset.addValue(120, "广州", "苹果");categorydataset.addValue(220, "北京", "梨子");categorydataset.addValue(260, "上海", "梨子");categorydataset.addValue(300, "广州", "梨子");categorydataset.addValue(320, "北京", "葡萄");categorydataset.addValue(370, "上海", "葡萄");categorydataset.addValue(320, "广州", "葡萄");categorydataset.addValue(490, "北京", "香蕉");categorydataset.addValue(450, "上海", "香蕉");categorydataset.addValue(400, "广州", "香蕉");categorydataset.addValue(200, "北京", "荔枝");categorydataset.addValue(230, "上海", "荔枝");categorydataset.addValue(340, "广州", "荔枝");return categorydataset;   case PieChart:   case PieChart3D:DefaultPieDataset pieDataset = new DefaultPieDataset();pieDataset.setValue("苹果", 100);pieDataset.setValue("梨子", 200);pieDataset.setValue("葡萄", 300);pieDataset.setValue("香蕉", 400);pieDataset.setValue("荔枝", 500);return pieDataset;   case XYLineChart:   XYSeriesCollection xyDataset = new XYSeriesCollection();   XYSeries apple = new XYSeries("苹果");   for(int i=0;i<12;i++){   apple.add(i+1, (int)(500*Math.random()));   }   xyDataset.addSeries(apple);   return xyDataset;}return null;}}
2.web.xml
<servlet>        <servlet-name>JChartServlet</servlet-name>        <servlet-class>com.logcd.servlet.JChartServlet</servlet-class>    </servlet>    <servlet-mapping>        <servlet-name>JChartServlet</servlet-name>        <url-pattern>/jChartImg</url-pattern>    </servlet-mapping>
3.html中调用
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html>   <head>     <title>JChart Test</title> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0">      </head>     <body>     <img src="./jChartImg?type=0"/>     <img src="./jChartImg?type=1"/>     <img src="./jChartImg?type=2"/>     <img src="./jChartImg?type=3"/>     <img src="./jChartImg?type=4"/>     <img src="./jChartImg?type=5"/>     <img src="./jChartImg?type=6"/>   </body> </html>
您需要登录后才可以回帖 登录 | 立即注册 新浪微博账号登陆

本版积分规则

快速回复 返回顶部 返回列表