jfreechart详细设置 http://gavinshaw.iteye.com/blog/468956
package CreateChart;
import graph.readXmlFile.ReadXmlFileToObject;
import graph.xmlModel.Chart;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.awt.Color;
import java.awt.Font;
import java.awt.Paint;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import org.jfree.chart.ChartFactory;
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.NumberAxis;
import org.jfree.chart.axis.NumberTickUnit;
import org.jfree.chart.axis.ValueAxis;
import org.jfree.chart.plot.CategoryPlot;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.plot.XYPlot;
import org.jfree.chart.renderer.category.LineAndShapeRenderer;
import org.jfree.chart.renderer.category.LineRenderer3D;
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;
public class CreateChart {
//图片宽高
private static int width= 0;
private static int height = 0;
//图片横向、纵向扩展倍数
private static int XExtendNum = 20;
private static int YExtendNum = 10;
//y轴最小值、最大值
private static double yMinValue= 0.0;
private static double yMaxValue= 0.0;
//y轴刻度间隔值
private static final double YDISTANCE = 0.5d;
//定义一个集合xmlMoneyList,存放xml_money已得到最大最小值
private static List<Double> xmlMoneyList = new ArrayList<Double>();
//定义标题、横轴、纵轴、图例名称
private static String titleName = "时间&金钱";
private static String XName = "时间";
private static String YName = "金钱";
private static String TLName = "波动率";
//图片生成到的路径
private static String picOutPath = "e:/money.jpg";
//设置背景颜色
private static Paint backColor = Color.LIGHT_GRAY;
//设置背景 横向网格线条的颜色
private static Paint backXColor = Color.blue;
//设置背景 纵向网格线条的颜色
private static Paint backYColor = Color.blue;
//设置波动率 线条的颜色,alpha
private static Color lineColor = new Color(9,171,40);
//控制波动率图线的alpha值,alpha值在0.0-1.0之间
private static float alpha = 1.0f;
//设置图表边框的颜色
private static Paint borderColor = Color.yellow;
//设置标题字体、加粗类型、大小
private static Font titleFont = new Font("宋体", Font.BOLD, 22);
//设置横轴、刻度(字体、加粗类型、大小)
private static Font XFont = new Font("宋体" , Font.BOLD , 15);
private static Font XKDFont = new Font("宋体" , Font.PLAIN , 10);
//设置纵轴、刻度(字体、加粗类型、大小)
private static Font YFont = new Font("宋体" , Font.BOLD , 15);
//设置图例、刻度(字体、加粗类型、大小)
private static Font TLFont = new Font("宋体" , Font.PLAIN , 10);
//设置横轴数据 倾斜方向
private static CategoryLabelPositions xplable = CategoryLabelPositions.UP_90;
/**
* 生成图表
* @param args
* @throws IOException
*/
public static void main(String[] args) throws IOException
{
//获取Xml文件路径,当然,这里路径是写死的
String Path = System.getProperty("user.dir")+"\\sourceXmlFile\\klineServlet.xml";
ReadXmlFileToObject r = ReadXmlFileToObject.getInstance();
Chart chartObject = r.insertDataToChart(Path);
//定义JFreeChart
JFreeChart chart = ChartFactory.createLineChart(
titleName, // 标题
XName, // 横坐标
YName, // 纵坐标
(CategoryDataset) getDataSet(chartObject),//获取数据
PlotOrientation.VERTICAL, // 竖直图表
true, // 是否显示legend
false, // 是否显示tooltip
false // 是否使用url链接
);
//处理标题、x、y轴中英文字体,避免中文乱码、图表样式
doHandleWord(chart);
//输出图片
outPutPic(chart);
}
//处理标题、x、y轴中英文字体,避免中文乱码、图表样式
private static void doHandleWord(JFreeChart chart) {
//start标题处理
TextTitle textTitle = chart.getTitle();
textTitle.setFont(titleFont);
//nd标题处理
//设置图的高级属性
CategoryPlot plot = (CategoryPlot)chart.getPlot();
LineAndShapeRenderer lineandshaperenderer = (LineAndShapeRenderer) plot.getRenderer();
//start横轴处理
//取得横轴
CategoryAxis categoryAxis = plot.getDomainAxis();
//设置横轴显示标签的字体
categoryAxis.setLabelFont(XFont);
//分类标签以90度角倾斜
categoryAxis.setCategoryLabelPositions(xplable);
categoryAxis.setTickLabelFont(XKDFont);
//end横轴处理
//start纵轴处理
NumberAxis numberAxis = (NumberAxis)plot.getRangeAxis();
//设置纵轴显示标签的字体
numberAxis.setLabelFont(YFont);
//设置纵轴刻度 非自动处理
numberAxis.setAutoTickUnitSelection(false);
//设置增值 为10各单位 ,太小了图片会很模糊
NumberTickUnit nt= new NumberTickUnit(YDISTANCE);
numberAxis.setTickUnit(nt);
//设置纵坐标的起始值
numberAxis.setLowerBound(yMinValue);
numberAxis.setUpperBound(yMaxValue);
//end纵轴处理
//底部图例中文设置
chart.getLegend().setItemFont(TLFont);
//设置网格竖线颜色
plot.setDomainGridlinePaint(backYColor);
plot.setDomainGridlinesVisible(true);
//设置网格横线颜色
plot.setRangeGridlinePaint(backXColor);
plot.setRangeGridlinesVisible(true);
//图片背景色
plot.setBackgroundPaint(backColor);
plot.setOutlineVisible(true);
//图边框颜色
plot.setOutlinePaint(borderColor);
//控制波动率图线的alpha值,alpha值在0.0-1.0之间
plot.setForegroundAlpha(alpha);
//设置波动率图线的颜色
lineandshaperenderer.setSeriesPaint(0, lineColor);
}
//输出图片
private static void outPutPic(JFreeChart chart) {
FileOutputStream fos = null;
try {
fos = new FileOutputStream(picOutPath);
ChartUtilities.writeChartAsPNG(fos, chart, width, height);
} catch (IOException e) {
e.printStackTrace();
}finally{
try {
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
//返回一个CategoryDataset实例
private static CategoryDataset getDataSet(Chart chartObject)
{
//关键1.定义你要使用的图形类型实例
DefaultCategoryDataset dataset = new DefaultCategoryDataset();
//根据取到的数据多少,决定图片大小,规则自己定义(图片的长=横轴显示的个数*20 宽=横轴显示的个数*10 动态扩展)
List<String> stringList = disposeString(chartObject);
width = stringList.size() * XExtendNum;
height = stringList.size() * YExtendNum;
for(int i = 0 ;i < stringList.size() ; i++)
{
String ptValue = stringList.get(i);
String[] rs=ptValue.split("%");
String time = rs[0];
String xml_money =rs[1];
//你们让取的最后一个值,我不知道要用到什么地方,就先把值传到这里吧,
String index_number = rs[2];
//把所有的xml_money都放放入集合xmlMoneyList
xmlMoneyList.add(Double.parseDouble(xml_money));
//关键2.将你取到的数据,添加到实例dataset中去,参数1:y轴数据、参数2:图例名称、参数3:x轴数据
dataset.addValue(Double.parseDouble(xml_money),TLName, time);
}
//对xmlMoneyList排序,默认为升序
Collections.sort(xmlMoneyList);
/**取到最大、最小值,因为我们得到的最大值最小值可能处于75.45-76.4之间,
这样在步伐增值为0.5的时候就会丢失一些不必要的数据,所以我们采用
最小值向下取最小整数(75),最大值向上取最小整数 77
*/
yMinValue = Math.floor(xmlMoneyList.get(0));
yMaxValue = Math.round(xmlMoneyList.get(xmlMoneyList.size() - 1) + 0.5);
//关键3:返回数据
return dataset;
}
/**
* 处理XML文件中PT标签中的值,得到我需要得到的即可,我只需要得到第2、6、7个数据
*/
private static List<String> disposeString(Chart chartObject)
{
//因为一条数据里面有好几种,所以考虑用list嵌套
List<String> ptValue = new ArrayList<String>();
//获得pt的个数
int pt_num = chartObject.getPts().getPtList().size();
for(int i = 0 ;i < pt_num ; i++)
{
//遍历数据
String data = chartObject.getPts().getPtList().get(i).getValue();
/*
* 因为数据格式是:20110624;09:35;75.75;75.6;75.75;75.5;706000;53407200.000;0;0
* 我暂时不考虑其他情况,默认为数据都是这样的数据
*/
String[] datas = data.split(";");
//按照您们的要求去取2、6、7、的数据
String time = datas[1];
String money = datas[5];
String index_number = datas[6];
String rs = time+"%"+money+"%"+index_number;
//然后把数据放到集合中
ptValue.add(rs);
}
return ptValue;
}
}