import java.awt.BasicStroke; import java.awt.Color; import java.awt.Font; import java.awt.Rectangle; import java.awt.geom.Ellipse2D; import java.io.IOException; import java.io.PrintWriter; import java.text.DecimalFormat; import java.text.NumberFormat; import java.text.SimpleDateFormat; import javax.servlet.http.HttpSession; import org.jfree.chart.ChartFactory; import org.jfree.chart.ChartRenderingInfo; import org.jfree.chart.ChartUtilities; import org.jfree.chart.JFreeChart; import org.jfree.chart.axis.AxisLocation; import org.jfree.chart.axis.CategoryAxis; import org.jfree.chart.axis.CategoryLabelPositions; import org.jfree.chart.axis.DateAxis; import org.jfree.chart.axis.NumberAxis; import org.jfree.chart.axis.ValueAxis; import org.jfree.chart.block.BlockBorder; import org.jfree.chart.entity.StandardEntityCollection; import org.jfree.chart.labels.StandardCategoryItemLabelGenerator; import org.jfree.chart.labels.StandardCategoryToolTipGenerator; import org.jfree.chart.labels.StandardPieSectionLabelGenerator; import org.jfree.chart.labels.StandardPieToolTipGenerator; import org.jfree.chart.plot.CategoryPlot; import org.jfree.chart.plot.DatasetRenderingOrder; import org.jfree.chart.plot.MultiplePiePlot; import org.jfree.chart.plot.PiePlot; 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.LineAndShapeRenderer; import org.jfree.chart.renderer.category.StackedBarRenderer3D; import org.jfree.chart.renderer.xy.XYItemRenderer; import org.jfree.chart.renderer.xy.XYLineAndShapeRenderer; import org.jfree.chart.servlet.ServletUtilities; import org.jfree.chart.title.LegendTitle; import org.jfree.chart.title.TextTitle; import org.jfree.data.category.CategoryDataset; import org.jfree.data.category.DefaultCategoryDataset; import org.jfree.data.time.Month; import org.jfree.data.time.TimeSeries; import org.jfree.data.time.TimeSeriesCollection; import org.jfree.data.xy.XYDataset; import org.jfree.ui.RectangleInsets; import org.jfree.util.TableOrder; /** * * @author Bingo汇集生成曲线、柱形、堆积柱形、饼形图的数据集,图形生成 方法。 */ public class CreateChart { private Font font = new Font("黑体", Font.BOLD, 14); private Font fontText = new Font("黑体", Font.PLAIN, 12); private Font fontAxis = new Font("黑体", Font.PLAIN, 12); // 定义文件名称 private String fileName = ""; /** * 生成曲线图数据集 */ public XYDataset createLineDateSet(String strTtimePointZone, String[][] arr) { TimeSeriesCollection dataset = new TimeSeriesCollection(); // 得到传值。时间和值。 // String[] str = strTtimePointZone.split(",");//应该是 指标周期 // 处理传值。根据传值设置曲线数。 int ty = 0; int tm = 0; for (int i = 1; i < arr[0].length; i++) { TimeSeries s_i = new TimeSeries(arr[0][i], Month.class); // Day.class); // 创建时间数据源,每一个//TimeSeries在图上是一 条曲线 for (int j = 3; j < arr.length; j++) { if (!arr[j][i].equals("--")) { ty = Integer.parseInt(arr[j] [0].substring(0, 4)); tm = Integer.parseInt(arr[j] [0].substring(4, 6));//怎么比较同月数据 s_i.add(new Month(tm, ty), Double.parseDouble(arr[j][i]));// 时间点,数值 } } dataset.addSeries(s_i); } return dataset; } /** * 生成堆栈柱状图数据集 * 一个时间轴点上有多个数据。所以废数据不能删除 */ public CategoryDataset createStackedBarDateSet(String strTtimePointZone, String[][] arr) { DefaultCategoryDataset dataset = new DefaultCategoryDataset();// 定义一个柱图的数据集合。 int rowindex = arr[0].length; int columindex = arr.length; String ty = ""; String tm = ""; String[] rowKeys = new String[rowindex-1];//定义每个柱 子,指标名称 for (int i = 1; i < rowindex; i++) { rowKeys[i - 1] = arr[0][i];//指标名称 } String[] columnKeys = new String[columindex-3];//定义统 计时间 double[][] data = new double[rowindex-1][columindex-3]; for (int j = 3; j < columindex; j++) { ty = arr[j][0].substring(2, 4); tm = arr[j][0].substring(4, 6); columnKeys[j-3] = ty + "/" + tm;//指标时间 for (int i = 1; i < rowindex; i++) { if (!arr[j][i].equals("--")) { data[i - 1][j-3] = Double.parseDouble(arr[j][i]); } } } for(int n=0;n<data.length;n++){ for(int m = 0;m<data[0].length;m++){ dataset.addValue(data[n][m], rowKeys [n], columnKeys[m]); } } return dataset; } /** * 生成柱形图所需的数据集 * * @return 返回数据集 */ public DefaultCategoryDataset createBarDataSet(String strTtimePointZone, String[][] arr) { DefaultCategoryDataset dataset = new DefaultCategoryDataset();// 定义一个柱图的数据集合。 int rowindex = arr[0].length; int columindex = arr.length; String ty = ""; String tm = ""; String[] rowKeys = new String[rowindex-1];//定义每个柱 子,指标名称 for (int i = 1; i < rowindex; i++) { rowKeys[i - 1] = arr[0][i];//指标名称 } String[] columnKeys = new String[columindex-3];//定义统 计时间 double[][] data = new double[rowindex-1][columindex-3]; for (int j = 3; j < columindex; j++) { ty = arr[j][0].substring(2, 4); tm = arr[j][0].substring(4, 6); columnKeys[j-3] = ty + "/" + tm;//指标时间 for (int i = 1; i < rowindex; i++) { if (!arr[j][i].equals("--")) { data[i - 1][j-3] = Double.parseDouble(arr[j][i]); } } } for(int n=0;n<data.length;n++){ for(int m = 0;m<data[0].length;m++){ dataset.addValue(data[n][m], rowKeys [n], columnKeys[m]); } } return dataset; } /** * 混合图所需数据集同上(折线) * @return */ public DefaultCategoryDataset createDataSet(String strTtimePointZone, String[][] arr){//柱形和折线所用数据集一样? DefaultCategoryDataset dataset = new DefaultCategoryDataset();// 定义一个柱图的数据集合。 int rowindex = arr[0].length; int columindex = arr.length; String ty = ""; String tm = ""; String[] rowKeys = new String[rowindex-1];//定义每个柱 子,指标名称 for (int i = 1; i < rowindex; i++) { rowKeys[i - 1] = arr[0][i];//指标名称 } String[] columnKeys = new String[columindex-3];//定义统 计时间 double[][] data = new double[rowindex-1][columindex-3]; for (int j = 3; j < columindex; j++) { ty = arr[j][0].substring(2, 4); tm = arr[j][0].substring(4, 6); columnKeys[j-3] = ty + "/" + tm;//指标时间 for (int i = 1; i < rowindex; i++) { if (!arr[j][i].equals("--")) { data[i - 1][j-3] = Double.parseDouble(arr[j][i]); } } } for(int n=0;n<data.length;n++){ for(int m = 0;m<data[0].length;m++){ dataset.addValue(data[n][m], rowKeys [n], columnKeys[m]); } } return dataset; } /** * 生成饼形图所需的数据集 * * @return 返回数据集 */ public CategoryDataset createPieDataSet(String strTtimePointZone, String[][] arr) { DefaultCategoryDataset dataset = new DefaultCategoryDataset();// 定义一个柱图的数据集合。 int rowindex = arr[0].length; int columindex = arr.length; String ty = ""; String tm = ""; String[] rowKeys = new String[rowindex-1];//定义每个柱 子,指标名称 for (int i = 1; i < rowindex; i++) { rowKeys[i - 1] = arr[0][i];//指标名称 } String[] columnKeys = null;//指标时间,年或者月 double[][] data = null;//存指标值 double sum = 0.0;//计算指标值 int sYear = Integer.parseInt(arr[3][0].substring(0, 4)); int year = Integer.parseInt(arr[columindex-1] [0].substring(0, 4))-sYear; int month = Integer.parseInt(arr[columindex-1] [0].substring(4, 6))-Integer.parseInt(arr[3][0].substring(4, 6)); if(year==0){ columnKeys = new String[month+1];//定义统计时间 data = new double[rowindex-1][month+1];//不跨年 for (int j = 3; j < columindex; j++) { ty = arr[j][0].substring(2, 4); tm = arr[j][0].substring(4, 6); columnKeys[j-3] = ty + "/" + tm;//指标 时间 for (int i = 1; i < rowindex; i++) { if (!arr[j][i].equals("--")) { data[i - 1][j-3] = Math.abs(Double.parseDouble(arr[j][i])); } } } }else if(year>0){ columnKeys = new String[year+1]; data = new double[rowindex-1][year+1];//跨年 for(int j = 0;j<year+1;j++){ columnKeys[j] = sYear+j+""; for(int i = 1;i<rowindex;i++){ for(int m = 3;m<columindex;m++){ if(columnKeys [j].equals(arr[m][0].substring(0, 4))){ if(arr[m] [i].equals("--")){ arr[m] [i]="0.0"; } sum += Double.parseDouble(arr[m][i]); } } data[i-1][j] = Math.abs(sum);// 不能显示负数 sum = 0.0; } } } for(int n=0;n<data.length;n++){ for(int m = 0;m<data[0].length;m++){ dataset.addValue(data[n][m], rowKeys [n], columnKeys[m]); } } return dataset; } /** * 生成曲线图形的方法。 * * @param session * @param strTtimePointZone * @param arr * @param pw * @return */ public String getLineChart(HttpSession session, String strTtimePointZone, String[][] arr, PrintWriter pw) { XYDataset dataset = this.createLineDateSet (strTtimePointZone, arr);// 建立数据集 JFreeChart chart = ChartFactory.createTimeSeriesChart(" 指标曲线图", // title "时间", // x-axis label "值", // y-axis label dataset, // data true, // create legend? true, // generate tooltips? false // generate URLs? ); // 设置JFreeChart的显示属性,对图形外部部分进行调整 chart.setBackgroundPaint(Color.white);// 设置曲线图背景 色 // 设置字体大小,形状 TextTitle title = new TextTitle("指标曲线图", font); chart.setTitle(title); XYPlot plot = (XYPlot) chart.getPlot();// 获取图形的画 布 plot.setBackgroundPaint(Color.white);// 设置网格背景色 plot.setDomainGridlinePaint(Color.black);// 设置网格Y (Domain轴)颜色 plot.setRangeGridlinePaint(Color.black);// 设置网格X横 线颜色 plot.setRangeGridlineStroke(new BasicStroke(0.2f)); // 数据X轴网格线条笔触 plot.setDomainGridlineStroke(new BasicStroke(0.1f)); // 数据Y轴网格线条笔触 plot.setAxisOffset(new RectangleInsets(1.0, 1.0, 1.0, 1.0));// 设置曲线图与xy轴的距离 plot.setDomainCrosshairVisible(true); plot.setRangeCrosshairVisible(true); XYItemRenderer r = plot.getRenderer(); if (r instanceof XYLineAndShapeRenderer) { XYLineAndShapeRenderer renderer = (XYLineAndShapeRenderer) r; renderer.setBaseLegendTextFont(fontText); renderer.setShapesVisible(true); renderer.setShapesFilled(true); renderer.setShapesVisible(false);// 设置曲线是 否显示数据点 processRenderer(renderer, dataset); } // 设置Y轴 NumberAxis numAxis = (NumberAxis) plot.getRangeAxis(); numAxis.setLabelFont(fontAxis); numAxis.setStandardTickUnits (NumberAxis.createIntegerTickUnits()); numAxis.setAutoRangeIncludesZero(false); //设置Y轴的数 据自动范围,不从0开始 NumberFormat numFormater = NumberFormat.getNumberInstance(); numFormater.setMinimumFractionDigits(2); numAxis.setNumberFormatOverride(numFormater); SimpleDateFormat mm = new SimpleDateFormat("MM"); SimpleDateFormat yyyy = new SimpleDateFormat("yyyy"); // 设置X轴(日期轴) DateAxis axis = (DateAxis) plot.getDomainAxis(); axis.setLabelFont(fontAxis); axis.setDateFormatOverride(new SimpleDateFormat ("yy/MM")); ChartRenderingInfo info = new ChartRenderingInfo( new StandardEntityCollection()); try { fileName = ServletUtilities.saveChartAsPNG (chart, 720, 540, info, session);// 生成图片,放到服务器 的临时文件夹下 // Write the image map to the PrintWriter ChartUtilities.writeImageMap(pw, fileName, info, false); } catch (IOException e) { e.printStackTrace(); } pw.flush(); return fileName; } /** * 生成堆栈柱状图的方法 * @param String[][] arr * @return */ public String getStackedBarChart(HttpSession session, String strTtimePointZone, String[][] arr, PrintWriter pw) { // 1:得到 CategoryDataset // 2:JFreeChart对象 CategoryDataset dataset = this.createStackedBarDateSet( strTtimePointZone, arr);// 数据集 JFreeChart chart = ChartFactory.createStackedBarChart(" 堆积柱图", // 图表标题 "时间", // x-axis label "值", // y-axis label dataset, // 数据集 PlotOrientation.VERTICAL, // 图表方向: 水平、垂直 true, // 是否显示图例(对于简单的柱状图 必须是false) false, // 是否生成工具 false // 是否生成URL链接 ); // 设置JFreeChart的显示属性,对图形外部部分进行调整 chart.setBackgroundPaint(Color.white);// 设置图背景色 TextTitle title = new TextTitle("指标堆积图", font);// 设置字体大小,形状 chart.setTitle(title); // 图例字体清晰 chart.setTextAntiAlias(true); CategoryPlot plot = chart.getCategoryPlot();//画布属性 plot.setNoDataMessage("NO Data!"); plot.setRangeGridlinesVisible(true);// 设置横虚线可见 plot.setRangeGridlinePaint(Color.gray);// 虚线色彩 plot.setBackgroundPaint(Color.WHITE);// 设置网格背景色 plot.setDomainGridlinePaint(Color.DARK_GRAY);// 设置网 格Y(Domain轴)颜色 plot.setRangeGridlinePaint(Color.DARK_GRAY);// 设置网格 X横线颜色 plot.setRangeGridlineStroke(new BasicStroke(0.2f)); // 数据X轴网格线条笔触 plot.setDomainGridlineStroke(new BasicStroke(0.1f)); // 数据Y轴网格线条笔触 plot.setAxisOffset(new RectangleInsets(1.0, 1.0, 1.0, 1.0));// 设置曲线图与xy轴的距离 plot.setDomainCrosshairVisible(true); plot.setRangeCrosshairVisible(true); NumberAxis vn = (NumberAxis) plot.getRangeAxis();// 数 据轴精度 vn.setAutoRangeIncludesZero(true);// 设置数据轴坐标从0 开始 vn.setLabelFont(fontAxis);// 轴标题 NumberFormat numFormater = NumberFormat.getNumberInstance(); numFormater.setMinimumFractionDigits(2);//显示小数点后2 位 DecimalFormat df = new DecimalFormat("");// 数据显示格 式是百分比 vn.setNumberFormatOverride(df); // 数据轴数据标签的显示 格式 // DomainAxis (区域轴,相当于 x 轴), RangeAxis (范 围轴,相当于 y 轴) CategoryAxis domainAxis = plot.getDomainAxis(); domainAxis.setLabelFont(fontAxis);// X轴标题 domainAxis.setTickLabelFont(fontAxis);// X轴数值 domainAxis.setMaximumCategoryLabelWidthRatio(0.6f);// 横轴上的 Lable 是否完整显示 // domainAxis.setCategoryLabelPositions (CategoryLabelPositions.createUpRotationLabelPositions(Math.PI / 7.0)); domainAxis.setCategoryLabelPositions (CategoryLabelPositions.DOWN_90);//X轴显示位置为90度 plot.setDomainAxis(domainAxis); ValueAxis rangeAxis = plot.getRangeAxis();// y轴设置 rangeAxis.setLabelFont(fontText); rangeAxis.setTickLabelFont(fontText); rangeAxis.setUpperMargin(0.15);// 设置最高的一个 Item 与图片顶端的距离 rangeAxis.setLowerMargin(0.15);// 设置最低的一个 Item 与图片底端的距离 ((NumberAxis) rangeAxis).setNumberFormatOverride (numFormater); plot.setRangeAxis(rangeAxis); // Renderer 对象是图形的绘制单元 // StackedBarRenderer renderer = (StackedBarRenderer) plot.getRenderer(); StackedBarRenderer3D renderer = new StackedBarRenderer3D();//just test renderer.setItemLabelFont(fontText); renderer.setMaximumBarWidth(0.05);// 设置柱子宽度 renderer.setMinimumBarLength(0.1);// 设置柱子高度 renderer.setBaseOutlinePaint(Color.BLACK);// 设置柱的边 框颜色 renderer.setDrawBarOutline(true);// 设置柱的边框可见 renderer.setItemLabelGenerator(new StandardCategoryItemLabelGenerator()); renderer.setItemMargin(0.05);// 设置每个地区所包含的平 行柱的之间距离 plot.setRenderer(renderer); // 取得统计图表的第一个图例 LegendTitle legend = chart.getLegend(0); //设置图例的字体 legend.setItemFont(fontText); ChartRenderingInfo info = new ChartRenderingInfo( new StandardEntityCollection()); try { fileName = ServletUtilities.saveChartAsPNG (chart, 720, 540, info, session);// 生成图片,放到服务器 的临时文件夹下 // Write the image map to the PrintWriter ChartUtilities.writeImageMap(pw, fileName, info, false); } catch (IOException e) { e.printStackTrace(); } pw.flush(); return fileName; } /** * 生成(混合图形)柱形图+曲线图的方法 * * @return 返回文件名称 */ public String getBarChart(HttpSession session, String strTimePointZone, String[][] arr, PrintWriter pw) { CategoryDataset categorydataset1 = this.createBarDataSet(strTimePointZone, arr);//柱线数据集 CategoryDataset categorydataset = this.createBarDataSet(strTimePointZone, arr);//折线数据集(相同方法) JFreeChart chart = ChartFactory.createBarChart("指标混 合图", "时间", "值", categorydataset1, PlotOrientation.VERTICAL, true, false, false); chart.setBackgroundPaint(Color.white);// 设置曲线图背景 色 TextTitle title = new TextTitle("指标混合图", font);// 设置字体大小,形状 chart.setTitle(title); chart.setTextAntiAlias(true); CategoryPlot categoryplot = (CategoryPlot) chart.getPlot(); categoryplot.setNoDataMessage("NO Data!"); categoryplot.setDomainAxisLocation (AxisLocation.BOTTOM_OR_RIGHT); //映射折线数据集 categoryplot.setDataset(1, categorydataset); categoryplot.mapDatasetToRangeAxis(1, 1); categoryplot.setBackgroundPaint(Color.white); categoryplot.setRangeGridlinesVisible(true);// 设置横虚 线可见 categoryplot.setRangeGridlinePaint(Color.gray);// 虚线 色彩 categoryplot.setDomainGridlinePaint(Color.DARK_GRAY);// 设置网格Y(Domain轴)颜色 categoryplot.setRangeGridlinePaint(Color.DARK_GRAY);// 设置网格X横线颜色 categoryplot.setRangeGridlineStroke(new BasicStroke (0.2f)); // 数据X轴网格线条笔触 categoryplot.setDomainGridlineStroke(new BasicStroke (0.1f)); // 数据Y轴网格线条笔触 categoryplot.setAxisOffset(new RectangleInsets(1.0, 1.0, 1.0, 1.0));// 设置图与xy轴的距离 categoryplot.setDomainCrosshairVisible(true); categoryplot.setRangeCrosshairVisible(true); CategoryAxis categoryaxis = categoryplot.getDomainAxis ();//X轴 categoryaxis.setLabelFont(fontText); categoryaxis.setTickLabelFont(fontText); // categoryaxis.setCategoryLabelPositions (CategoryLabelPositions.createUpRotationLabelPositions(Math.PI / 7.0)); categoryaxis.setCategoryLabelPositions (CategoryLabelPositions.DOWN_90);//X轴显示位置为90度 NumberFormat numFormater = NumberFormat.getNumberInstance(); numFormater.setMinimumFractionDigits(2);//显示小数点后2 位 NumberAxis left = new NumberAxis("值");//Y轴 NumberAxis numberaxis = new NumberAxis("比率");//Y轴 numberaxis.setLabelFont(fontText); left.setLabelFont(fontText); left.setNumberFormatOverride(numFormater); numberaxis.setNumberFormatOverride(numFormater); categoryplot.setRangeAxis(0, left);//左侧Y轴 categoryplot.setRangeAxis(1, numberaxis);//右侧Y轴 BarRenderer3D renderer = new BarRenderer3D(); renderer.setBaseOutlinePaint(Color.BLACK); // 设置每个地区所包含的平行柱之间的距离 renderer.setItemMargin(0.1); renderer.setMaximumBarWidth(0.05);// 设置柱子宽度 renderer.setMinimumBarLength(0.1);// 设置柱子高度 renderer.setBaseOutlinePaint(Color.BLACK);// 设置柱的边 框颜色 renderer.setDrawBarOutline(true);// 设置柱的边框可见 renderer.setItemLabelGenerator(new StandardCategoryItemLabelGenerator()); renderer.setItemMargin(0.05); LineAndShapeRenderer lineandshaperenderer = new LineAndShapeRenderer();//折线对象 lineandshaperenderer.setToolTipGenerator(new StandardCategoryToolTipGenerator()); lineandshaperenderer.setSeriesPaint(0, new Color(0, 0, 255)); categoryplot.setRenderer(0,renderer); categoryplot.setRenderer(1, lineandshaperenderer); categoryplot.setDatasetRenderingOrder (DatasetRenderingOrder.FORWARD); //图例各个属性 LegendTitle legendtitle = chart.getLegend(0); legendtitle.setMargin(new RectangleInsets(2D, 2D, 2D, 2D)); legendtitle.setBorder(new BlockBorder()); legendtitle.setItemFont(fontText); /* LegendTitle legendtitle1 = chart.getLegend(1); legendtitle1.setMargin(new RectangleInsets(2D, 2D, 2D, 2D)); legendtitle1.setItemFont(new Font ("SimSun",Font.BOLD,10)); legendtitle1.setBorder(new BlockBorder()); BlockContainer blockcontainer = new BlockContainer(new BorderArrangement()); blockcontainer.add(legendtitle, RectangleEdge.LEFT); blockcontainer.add(legendtitle1, RectangleEdge.RIGHT); blockcontainer.add(new EmptyBlock(2000D, 0.0D)); CompositeTitle compositetitle = new CompositeTitle (blockcontainer); compositetitle.setPosition(RectangleEdge.BOTTOM); chart.addSubtitle(compositetitle); * 可能以后会用到的功能 */ ChartRenderingInfo info = new ChartRenderingInfo(new StandardEntityCollection()); try { fileName = ServletUtilities.saveChartAsPNG (chart, 720, 540, info, session);// 生成图片 ChartUtilities.writeImageMap(pw, fileName, info, false); } catch (IOException e) { e.printStackTrace(); } pw.flush(); return fileName;// 返回生成图片的文件名 } /** * 饼状图 * * @param String[][] * arr * @return */ public String getPieChart(HttpSession session, String strTtimePointZone, String[][] arr, PrintWriter pw) { CategoryDataset dataset = this.createPieDataSet (strTtimePointZone, arr);// 建立数据集 JFreeChart chart = ChartFactory.createMultiplePieChart ("指标饼图", dataset, TableOrder.BY_ROW, true, false, false); chart.setBackgroundPaint(Color.white);// 设置图背景色 TextTitle title = new TextTitle("指标饼图", font);// 设 置字体大小,形状 chart.setTitle(title); chart.setTextAntiAlias(true); MultiplePiePlot multiplepieplot = (MultiplePiePlot) chart.getPlot(); JFreeChart jfreechart1 = multiplepieplot.getPieChart(); jfreechart1.getTitle().setFont(fontText); PiePlot plot = (PiePlot) jfreechart1.getPlot(); //设置背景颜色 plot.setBackgroundPaint(Color.GRAY); //设置透明度 //plot.setForegroundAlpha(0.65f); // 指定饼图轮廓线的颜色 plot.setBaseSectionOutlinePaint(Color.BLACK); plot.setBaseSectionPaint(Color.BLACK); //设置饼图为圆形,默认分饼从12点钟方向开始。 plot.setCircular(false); plot.setLabelLinkPaint(Color.BLUE); plot.setSectionOutlinesVisible(false); //无数据是显示提示和颜色。 plot.setNoDataMessage("无数据!"); plot.setNoDataMessagePaint(Color.BLACK); plot.setToolTipGenerator(new StandardPieToolTipGenerator()); plot.setInteriorGap(0.30); //设置扇区分离显示 plot.setExplodePercent("", 0.2D); //设置扇区边框不可见 plot.setSectionOutlinesVisible(false); // 图片中显示百分比:自定义方式,{0} 表示选项, {1} 表示 数值, {2} 表示所占比例 ,小数点后两位 plot.setLabelGenerator(new StandardPieSectionLabelGenerator( "{1}", NumberFormat.getNumberInstance (), new DecimalFormat("0.0%"))); // 图例显示百分比:自定义方式, 同上说明 plot.setLegendLabelGenerator(new StandardPieSectionLabelGenerator( "{0}")); plot.setLabelFont(fontText); //图例各个属性 LegendTitle legendtitle = new LegendTitle (jfreechart1.getPlot()); legendtitle.setMargin(new RectangleInsets(2D, 2D, 2D, 2D)); legendtitle.setBorder(new BlockBorder()); legendtitle.setItemFont(fontText); ChartRenderingInfo info = new ChartRenderingInfo( new StandardEntityCollection()); try { fileName = ServletUtilities.saveChartAsPNG (chart, 720, 540, info, session);// 生成图片,放到服务器 的临时文件夹下 // Write the image map to the PrintWriter ChartUtilities.writeImageMap(pw, fileName, info, false); } catch (IOException e) { e.printStackTrace(); } pw.flush(); return fileName; } // 曲线图形的微调方法。 private void processRenderer(XYLineAndShapeRenderer renderer, XYDataset dataset) { Ellipse2D ell = new Ellipse2D.Float(-4, -4, 8, 8); if (dataset.getSeriesCount() == 8) { renderer.setSeriesStroke(2, new BasicStroke (2.0F, 1, 1, 1.0F, new float[] { 6F, 6F }, 0.0F));// 虚线 renderer.setSeriesStroke(3, new BasicStroke (2.0F, 1, 1, 1.0F, new float[] { 6F, 6F }, 0.0F));// 虚线 renderer.setSeriesShape(2, ell); // 设置第一个 XYSeries数据点大小 renderer.setSeriesPaint(2, Color.cyan); renderer.setSeriesShape(3, new Rectangle(-3, - 3, 6, 6));// 设置第二个XYSeries数据点大小 renderer.setSeriesPaint(3, Color.green); renderer.setSeriesStroke(4, new BasicStroke (2.0F, 1, 1, 1.0F, new float[] { 6F, 6F }, 0.0F));// 虚线 renderer.setSeriesStroke(5, new BasicStroke (2.0F, 1, 1, 1.0F, new float[] { 6F, 6F }, 0.0F));// 虚线 renderer.setSeriesShape(4, ell); // 设置第一个 XYSeries数据点大小 renderer.setSeriesPaint(4, Color.cyan); renderer.setSeriesShape(5, new Rectangle(-3, - 3, 6, 6));// 设置第二个XYSeries数据点大小 renderer.setSeriesPaint(5, Color.green); renderer.setSeriesStroke(6, new BasicStroke (2.0F, 1, 1, 1.0F, new float[] { 6F, 6F }, 0.0F));// 虚线 renderer.setSeriesStroke(7, new BasicStroke (2.0F, 1, 1, 1.0F, new float[] { 6F, 6F }, 0.0F));// 虚线 renderer.setSeriesShape(6, ell); // 设置第一个 XYSeries数据点大小 renderer.setSeriesPaint(6, Color.pink); renderer.setSeriesShape(7, new Rectangle(-3, - 3, 6, 6));// 设置第二个XYSeries数据点大小 renderer.setSeriesPaint(7, Color.yellow); renderer.setSeriesStroke(8, new BasicStroke (2.0F, 1, 1, 1.0F, new float[] { 6F, 6F }, 0.0F));// 虚线 renderer.setSeriesStroke(9, new BasicStroke (2.0F, 1, 1, 1.0F, new float[] { 6F, 6F }, 0.0F));// 虚线 renderer.setSeriesShape(8, ell); // 设置第一个 XYSeries数据点大小 renderer.setSeriesPaint(8, Color.pink); renderer.setSeriesShape(9, new Rectangle(-3, - 3, 6, 6));// 设置第二个XYSeries数据点大小 renderer.setSeriesPaint(9, Color.yellow); } } }