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