JfreeChart例子生成柱状堆积图

来源:互联网 发布:有关网络暴力的视频 编辑:程序博客网 时间:2024/05/16 10:05

<%@ page language="java" contentType="text/html; charset=GBK"
    pageEncoding="GBK"%>
  <%@ page import="org.jfree.data.general.DefaultPieDataset"%>
<%@ page import="org.jfree.chart.JFreeChart"%>
<%@ page import="org.jfree.chart.plot.PiePlot"%>
<%@ page import="org.jfree.chart.ChartRenderingInfo"%>
<%@ page import="org.jfree.chart.servlet.ServletUtilities"%>
<%@ page import="org.jfree.chart.urls.StandardPieURLGenerator"%>
<%@ page import="org.jfree.chart.entity.StandardEntityCollection"%>
<%@ page import="org.jfree.chart.encoders.SunPNGEncoderAdapter"%>
<%@ page import="org.jfree.chart.renderer.category.BarRenderer"%>
 <%@ page import="org.jfree.chart.renderer.category.StackedBarRenderer"%>
  <%@ page import="org.jfree.data.category.CategoryDataset"%>
  <%@ page import="org.jfree.chart.ChartFactory"%>
    <%@ page import="java.awt.Color"%>
     <%@ page import="java.awt.Font"%>
   
<%@ page import="java.io.File"%>
<%@ page import="java.io.FileOutputStream"%>
<%@ page import="java.text.DecimalFormat"%>
<%@ page import="java.text.NumberFormat"%>
<%@ page import="org.jfree.chart.ChartUtilities"%>
<%@ page import="org.jfree.chart.axis.CategoryAxis"%>
<%@ page import="org.jfree.chart.axis.CategoryLabelPositions"%>
<%@ page import="org.jfree.chart.axis.NumberAxis"%>
<%@ page import="org.jfree.chart.axis.ValueAxis"%>
<%@ page import="org.jfree.chart.labels.StandardCategoryItemLabelGenerator"%>
<%@ page import="org.jfree.chart.labels.StandardPieSectionLabelGenerator"%>

<%@ page import="org.jfree.chart.title.TextTitle"%>

<%@ page import="org.jfree.data.category.CategoryDataset"%>

<%@ page import="org.jfree.data.general.DatasetUtilities"%>
<%@ page import="org.jfree.chart.plot.CategoryPlot"%>
<%@ page import="org.jfree.chart.plot.PlotOrientation"%>


<%@ page import="org.jfree.ui.TextAnchor"%>
<%@ page import="org.jfree.chart.labels.ItemLabelAnchor"%>
<%@ page import="org.jfree.chart.labels.ItemLabelPosition"%>


 
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=GBK">
<title>Insert title here</title>
</head>
<body>
<%!
 


private void isChartPathExist(String chartPath) {  
    File file = new File(chartPath);  
    if (!file.exists()) {  
        file.mkdirs();  
  
    }  
}  


%>

<%!
// 柱状图,折线图 数据集  
public CategoryDataset getBarData(double[][] data, String[] rowKeys,  
        String[] columnKeys) {  
    return DatasetUtilities.createCategoryDataset(rowKeys, columnKeys, data);  

}  


%>
<%!
//调数据
public JFreeChart makeStackedBarChart(double[][] workValue,String[] username) {
  
 
  // double[][] data = new double[][] { { 0.21, 0.66, 0.23, 0.40, 0.26 },
    //  { 0.25, 0.21, 0.10, 0.40, 0.16 } };
     double[][] data=workValue;
    //String[] rowKeys = {"苹果", "梨子" };
    String[] rowKeys=username;
    //String[] columnKeys = { "北京", "上海", "广州", "成都", "深圳" };
   String[] columnKeys = { "呼叫(提)", "呼叫(分)", "呼叫(回)",  "业务(提)", "业务(分)", "业务(回)","费用(录)","装机(访)","回流(访)","故障(访)","流失(访)","赠品(访)","帐号(访)"};
    CategoryDataset dataset =getBarData(data, rowKeys, columnKeys);
  //  String fileName=   createStackedBarChart(filePath,dataset, "x坐标", "y坐标", "工作量统计图", "stsckedBar.png");
  JFreeChart chart= createStackedBarChart(dataset, "x坐标", "y坐标", "工作量统计图", "stsckedBar.png");
 
  return chart;
   
}

%>
<%!
//生成图
public JFreeChart createStackedBarChart(CategoryDataset dataset, String xName,
     String yName, String chartTitle, String charName) {
     // 1:得到 CategoryDataset
     // 2:JFreeChart对象
     JFreeChart chart = ChartFactory.createStackedBarChart(chartTitle, // 图表标题
       xName, // 目录轴的显示标签
       yName, // 数值轴的显示标签
       dataset, // 数据集
       //PlotOrientation.VERTICAL, // 图表方向:水平、垂直
       PlotOrientation.HORIZONTAL,
       true, // 是否显示图例(对于简单的柱状图必须是false)
       false, // 是否生成工具
       false // 是否生成URL链接
       );
    
    
     // 图例字体清晰
     chart.getLegend().setItemFont(new Font("宋体", Font.BOLD, 14));
     chart.setTextAntiAlias(false);
     chart.setBackgroundPaint(Color.WHITE);
     // 2 .2 主标题对象 主标题对象是 TextTitle 类型
     chart.setTitle(new TextTitle(chartTitle, new Font("隶书", Font.BOLD,25)));
     // 2 .2.1:设置中文
     // x,y轴坐标字体
     Font labelFont = new Font("SansSerif", Font.TRUETYPE_FONT, 12);
     // 2 .3 Plot 对象 Plot 对象是图形的绘制结构对象
     CategoryPlot plot = chart.getCategoryPlot();
   
     // 设置横虚线可见
     plot.setRangeGridlinesVisible(true);
     // 虚线色彩
     plot.setRangeGridlinePaint(Color.gray);
     // 数据轴精度
     NumberAxis vn = (NumberAxis) plot.getRangeAxis();
     // 设置最大值是1
     vn.setUpperBound(1);
     // 设置数据轴坐标从0开始
    // vn.setAutoRangeIncludesZero(true);
     // Y轴数据显示格式是百分比
     DecimalFormat df = new DecimalFormat("0%");
     vn.setNumberFormatOverride(df); // 数据轴数据标签的显示格式
   
     // DomainAxis (区域轴,相当于 x 轴), RangeAxis (范围轴,相当于 y 轴)
     CategoryAxis domainAxis = plot.getDomainAxis();
     domainAxis.setLabelFont(labelFont);// 轴标题
     domainAxis.setTickLabelFont(labelFont);// 轴数值
    
    
     // x轴坐标太长,建议设置倾斜,如下两种方式选其一,两种效果相同
     // 倾斜(1)横轴上的 Lable 45度倾斜
     domainAxis.setCategoryLabelPositions(CategoryLabelPositions.UP_45);
    // domainAxis.setLowerMargin(0.1);
     // 倾斜(2)Lable(Math.PI 3.0)度倾斜
     // domainAxis.setCategoryLabelPositions(CategoryLabelPositions
     // .createUpRotationLabelPositions(Math.PI / 3.0));
     domainAxis.setMaximumCategoryLabelWidthRatio(0.6f);// 横轴上的 Lable 是否完整显示
     plot.setDomainAxis(domainAxis);
     // y轴设置
     ValueAxis rangeAxis = plot.getRangeAxis();
     rangeAxis.setLabelFont(labelFont);
     rangeAxis.setTickLabelFont(labelFont);
     // 设置最高的一个 Item 与图片顶端的距离
    // rangeAxis.setUpperMargin(0.15);
      rangeAxis.setUpperMargin(0.01);
     // 设置最低的一个 Item 与图片底端的距离
     //rangeAxis.setLowerMargin(0.15);
     rangeAxis.setLowerMargin(0.01);
     //显示的数据的范围
     rangeAxis.setRange(0.01,1.0);
  
     plot.setRangeAxis(rangeAxis);
    
     // Renderer 对象是图形的绘制单元
     StackedBarRenderer renderer = new StackedBarRenderer();
     //显示注记
     renderer.setItemLabelGenerator(new StandardCategoryItemLabelGenerator());
     //注记显示为百分比 {1}{2}{0}显示的东西是不一样的,可以显示人的名字也可以显示数据的百分比
     //renderer.setItemLabelGenerator(new StandardCategoryItemLabelGenerator("{1}",java.text.NumberFormat.getPercentInstance()));
     renderer.setItemLabelGenerator(new StandardCategoryItemLabelGenerator("{2}",java.text.NumberFormat.getPercentInstance()));
     //注记的颜色字体设置
     renderer.setItemLabelFont(new Font("黑体",Font.BOLD,12));
     renderer.setItemLabelsVisible(true); 
     ItemLabelPosition itemLabelPositionFallback=new ItemLabelPosition(ItemLabelAnchor.OUTSIDE12,TextAnchor.BASELINE_LEFT,TextAnchor.HALF_ASCENT_LEFT,-1.57D);
    //显示小于显示范围的数据
     renderer.setPositiveItemLabelPositionFallback(itemLabelPositionFallback);
     renderer.setNegativeItemLabelPositionFallback(itemLabelPositionFallback);
    
    
    
     // 设置柱子宽度
     renderer.setMaximumBarWidth(0.02);
     // 设置柱子高度
     renderer.setMinimumBarLength(0.1);
     // 设置柱的边框颜色
     renderer.setBaseOutlinePaint(Color.BLACK);
     // 设置柱的边框可见
     renderer.setDrawBarOutline(true);
     // // 设置柱的颜色(可设定也可默认)
     renderer.setSeriesPaint(0, new Color(204, 255, 204));
     renderer.setSeriesPaint(1, new Color(255, 204, 153));
     // 设置每个地区所包含的平行柱的之间距离
     renderer.setItemMargin(0.4);
     plot.setRenderer(renderer);
     // 设置柱的透明度(如果是3D的必须设置才能达到立体效果,如果是2D的设置则使颜色变淡)
   // plot.setForegroundAlpha(0.65f);
         
     return chart;
  }
%>
<%

String userName=request.getParameter("userName");//接受参数
  if(!"".equals(userName))
   userName=new String(userName.getBytes("iso8859_1"),"GBK");
String userCount[]=userName.split(",");//放名字的数组
String everyWork=request.getParameter("everyWorkCount");//接受参数
String everyWorkCount[]=everyWork.split("str-");//数组一级分开


int i=userCount.length;
double arr[][]=new double[i][13];//放数值
double typesum[] =new double[13];//每一项的总数
for(int m=0;m<i;m++)
{
  for(int n=0;n<13;n++)
  {
   String aa=everyWorkCount[m].split(",")[n];

   if(!"".equals(aa))
      arr[m][n]=Double.parseDouble(aa);
   if(n==0)
         typesum[0]+= arr[m][n];
   if(n==1)
      typesum[1]+=arr[m][n];
   if(n==2)
      typesum[2]+=arr[m][n];
   if(n==3)
   typesum[3]+=arr[m][n];
      if(n==4)
        typesum[4]+=arr[m][n];
   if(n==5)
     typesum[5]+=arr[m][n];
   if(n==6)
        typesum[6]+=arr[m][n];
   if(n==7)
     typesum[7]+=arr[m][n];
   if(n==8)
   typesum[8]+=arr[m][n];
   if(n==9)
   typesum[9]+=arr[m][n];
   if(n==10)
  typesum[10]+=arr[m][n];
   if(n==11)
  typesum[11]+=arr[m][n];
   if(n==12)
  typesum[12]+=arr[m][n];
  }
}
//给数值换算成百分数
for(int s=0;s<i;s++)
{
  for(int k=0;k<13;k++)
  {
   if(k==0)
     arr[s][k]= arr[s][k]/typesum[0];
   if(k==1)
   arr[s][k]= arr[s][k]/typesum[1];
   if(k==2)
   arr[s][k]= arr[s][k]/typesum[2];
   if(k==3)
  arr[s][k]= arr[s][k]/typesum[3];
   if(k==4)
  arr[s][k]= arr[s][k]/typesum[4];
   if(k==5)
  arr[s][k]= arr[s][k]/typesum[5];
   if(k==6)
  arr[s][k]= arr[s][k]/typesum[6];
   if(k==7)
  arr[s][k]= arr[s][k]/typesum[7];
   if(k==8)
   arr[s][k]= arr[s][k]/typesum[8];
   if(k==9)
   arr[s][k]= arr[s][k]/typesum[9];
   if(k==10)
   arr[s][k]= arr[s][k]/typesum[10];
   if(k==11)
   arr[s][k]= arr[s][k]/typesum[11];
   if(k==12)
   arr[s][k]= arr[s][k]/typesum[12];
  }
}

 

ChartRenderingInfo info = new ChartRenderingInfo(new StandardEntityCollection());//?

JFreeChart chart= makeStackedBarChart(arr,userCount);//传数据生成图形
String filename = ServletUtilities.saveChartAsPNG(chart,1200, 1200, info, session);//保存路径
String graphURL = request.getContextPath() + "/servlet/DisplayChart?filename=" + filename;//获得


%>
  <img src="<%=graphURL %>"  width="1200" height="1200" border=0 >
</body>
</html>

原创粉丝点击