<%@ 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>