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);
}
}
}