JFreeChart学习笔记

首先几个核心API要熟悉

JFreeChart     图表对象
XXXXDataset  数据集
XXXXPlot     图表区域对象,即具体的什么类型的图表,柱状,饼状等
XXXXAxis     X,Y轴对象
XXXXRenderer  负责如何显示图表对象
XXXXURLGenerator
XXXXToolTipGenerator

一般的实现步骤:

1.根据所要画的图,准备对应的数据集.

2.准备Plot,确定所要画的图的种类(如柱状,饼状等)

3.准备Axis,包括X,Y轴所表示的内容.

4.准备Renderer,确定如何显示图表对象

5.创建JFreeChart,把上面准备的相应参数传入.

6.保存图片到本地或传至WEB

java 代码
  1. package test;   
  2.   
  3. import java.awt.BasicStroke;   
  4. import java.awt.Color;   
  5. import java.awt.Font;   
  6. import java.io.FileOutputStream;   
  7. import java.io.IOException;   
  8. import java.text.DecimalFormat;   
  9. import java.text.SimpleDateFormat;   
  10. import java.util.TimeZone;   
  11.   
  12. import org.jfree.data.KeyToGroupMap;   
  13. import org.jfree.data.category.CategoryDataset;   
  14. import org.jfree.data.category.DefaultCategoryDataset;   
  15. import org.jfree.data.general.DefaultPieDataset;   
  16. import org.jfree.data.time.Month;   
  17. import org.jfree.data.time.TimeTableXYDataset;   
  18. import org.jfree.data.xy.XYDataset;   
  19. import org.jfree.ui.RectangleInsets;   
  20. import org.jfree.ui.TextAnchor;   
  21. import org.jfree.chart.*;   
  22. import org.jfree.chart.axis.CategoryAnchor;   
  23. import org.jfree.chart.axis.CategoryAxis;   
  24. import org.jfree.chart.axis.NumberAxis;   
  25. import org.jfree.chart.axis.PeriodAxis;   
  26. import org.jfree.chart.axis.PeriodAxisLabelInfo;   
  27. import org.jfree.chart.axis.ValueAxis;   
  28. import org.jfree.chart.labels.ItemLabelAnchor;   
  29. import org.jfree.chart.labels.ItemLabelPosition;   
  30. import org.jfree.chart.labels.StandardCategoryItemLabelGenerator;   
  31. import org.jfree.chart.labels.StandardCategoryToolTipGenerator;   
  32. import org.jfree.chart.labels.StandardXYItemLabelGenerator;   
  33. import org.jfree.chart.labels.StandardXYToolTipGenerator;   
  34. import org.jfree.chart.plot.*;   
  35. import org.jfree.chart.renderer.category.CategoryItemRenderer;   
  36. import org.jfree.chart.renderer.category.GroupedStackedBarRenderer;   
  37. import org.jfree.chart.renderer.category.LineAndShapeRenderer;   
  38. import org.jfree.chart.renderer.xy.StackedXYBarRenderer;   
  39. import org.jfree.chart.renderer.xy.XYStepRenderer;   
  40.   
  41. public class ChartDemo {   
  42.   
  43.     public static void main(String[] args)    
  44.     {   
  45.         ChartDemo chartD = new ChartDemo();   
  46.         chartD.createBarDemo("bar.jpg");   
  47.         chartD.createPieDemo("pie.jpg");   
  48.         chartD.createXYBarDemo("xybar.jpg");   
  49.            
  50.     }   
  51.        
  52.     //创建柱状图   
  53.     public void createBarDemo(String jpgname)   
  54.     {   
  55.            
  56.         CategoryDataset dataset = getBarDataset();   
  57.         JFreeChart chart = ChartFactory.createStackedBarChart("月统计报表""统计月份""数据", dataset, PlotOrientation.VERTICAL, truetruefalse);   
  58.            
  59.         //创建Renderer   
  60.         GroupedStackedBarRenderer groupedstackedbarrenderer = new GroupedStackedBarRenderer();   
  61.            
  62.         //创建若干组,以便可分柱状,和叠方图   
  63.         KeyToGroupMap keytogroupmap = new KeyToGroupMap("G1");   
  64.         //目标为一组,实际,未完为另一组   
  65.         keytogroupmap.mapKeyToGroup("计划""G1");    
  66.         keytogroupmap.mapKeyToGroup("实际""G2");    
  67.         keytogroupmap.mapKeyToGroup("未完""G2");    
  68.             //设置组   
  69.         groupedstackedbarrenderer.setSeriesToGroupMap(keytogroupmap);   
  70.            
  71.         //显示数值   
  72.         groupedstackedbarrenderer.setBaseItemLabelGenerator(new StandardCategoryItemLabelGenerator());   
  73.             //可见?   
  74.         groupedstackedbarrenderer.setBaseItemLabelsVisible(true);   
  75.             //显示位置   
  76.         groupedstackedbarrenderer.setPositiveItemLabelPositionFallback(new ItemLabelPosition(ItemLabelAnchor.CENTER, TextAnchor.BOTTOM_CENTER));   
  77.         groupedstackedbarrenderer.setItemMargin(0.05000000000000001D);   
  78.            
  79.         //设置显示颜色   
  80.         groupedstackedbarrenderer.setSeriesPaint(0new Color(255137255)); // 粉红   
  81.         groupedstackedbarrenderer.setSeriesPaint(1new Color(011220));// BLUE   
  82.         groupedstackedbarrenderer.setSeriesPaint(2new Color(014852));// 绿色   
  83.            
  84.            
  85.         CategoryPlot categoryplot = (CategoryPlot)chart.getPlot();   
  86.         categoryplot.setDomainGridlinePosition(CategoryAnchor.MIDDLE);   
  87.            
  88.         //横网格线   
  89.         categoryplot.setRangeGridlinesVisible(true);   
  90.         //竖风格线   
  91.         categoryplot.setDomainGridlinesVisible(false);   
  92.            
  93.         //横轴   
  94.         CategoryAxis domainAxis=categoryplot.getDomainAxis();   
  95.         //间隔   
  96.         domainAxis.setCategoryMargin(0.2);   
  97.         //竖轴          
  98.         //ValueAxis valueaxis = categoryplot.getRangeAxis();   
  99.         //设置数值显示范围   
  100.         //valueaxis.setRange(0.0D, 30000D);   
  101.            
  102.         categoryplot.setRenderer(groupedstackedbarrenderer);   
  103.         categoryplot.setDatasetRenderingOrder(DatasetRenderingOrder.FORWARD);   
  104.            
  105.         categoryplot.setDataset(1, dataset);   
  106.         categoryplot.mapDatasetToRangeAxis(11);   
  107.         //categoryplot.mapDatasetToRangeAxis(1, 2);   
  108.            
  109.            
  110.         NumberAxis numberaxis = new NumberAxis("费用");   
  111.         //numberaxis.setRange(0,90000);   
  112.         //设置右边的Y轴   
  113.         categoryplot.setRangeAxis(1, numberaxis);   
  114.            
  115.         LineAndShapeRenderer lineandshaperenderer = new LineAndShapeRenderer();   
  116.         lineandshaperenderer.setBaseToolTipGenerator(new StandardCategoryToolTipGenerator());   
  117.         lineandshaperenderer.setSeriesPaint(0new Color(255137255)); // 粉红   
  118.         lineandshaperenderer.setSeriesPaint(1new Color(0,11,220)); // 蓝色   
  119.            
  120.         categoryplot.setRenderer(1, lineandshaperenderer);   
  121.         categoryplot.setDatasetRenderingOrder(DatasetRenderingOrder.FORWARD);   
  122.            
  123.                
  124.         this.savejpg(chart, jpgname);   
  125.     }   
  126.   
  127.     //获取柱状图数据   
  128.     private CategoryDataset getBarDataset()    
  129.     {   
  130.         DefaultCategoryDataset dataset = new DefaultCategoryDataset();   
  131.         String plan="计划";   
  132.         String actual="实际";   
  133.         String leave = "未完";   
  134.            
  135.         dataset.addValue(2000, plan, "一月");   
  136.         dataset.addValue(500, actual, "一月");   
  137.         dataset.addValue(1500, leave, "一月");   
  138.            
  139.         dataset.addValue(2000, plan, "二月");   
  140.         dataset.addValue(500, actual, "二月");   
  141.         dataset.addValue(1500, leave, "二月");   
  142.            
  143.         dataset.addValue(5000, plan, "三月");   
  144.         dataset.addValue(3200, actual, "三月");   
  145.         dataset.addValue(1800, leave, "三月");   
  146.            
  147.            
  148.            
  149.         return dataset;   
  150.            
  151.     }   
  152.        
  153.     //创建XYBar   
  154.     public void createXYBarDemo(String jpgname)   
  155.     {   
  156.         TimeTableXYDataset dataset = this.getXYDataset();   
  157.            
  158.         //设置X坐标轴   
  159.         PeriodAxis periodaxis = new PeriodAxis("时间");   
  160.         periodaxis.setTimeZone(TimeZone.getTimeZone("Pacific/Auckland"));   
  161.         periodaxis.setAutoRangeTimePeriodClass(org.jfree.data.time.Month.class);   
  162.         periodaxis.setMajorTickTimePeriodClass(org.jfree.data.time.Month.class);   
  163.         PeriodAxisLabelInfo aperiodaxislabelinfo[] = new PeriodAxisLabelInfo[2];   
  164.         aperiodaxislabelinfo[0] = new PeriodAxisLabelInfo(org.jfree.data.time.Month.class,    
  165.                 new SimpleDateFormat("MMM"),    
  166.                 new RectangleInsets(2D, 2D, 2D, 2D),    
  167.                 new Font("SansSerif"110),   
  168.                 Color.BLACK, falsenew BasicStroke(0.0F), Color.lightGray);   
  169.         aperiodaxislabelinfo[1] = new PeriodAxisLabelInfo(org.jfree.data.time.Year.classnew SimpleDateFormat("yyyy"));   
  170.         periodaxis.setLabelInfo(aperiodaxislabelinfo);   
  171.         periodaxis.setLowerMargin(0.01D);   
  172.         periodaxis.setUpperMargin(0.01D);   
  173.            
  174.         //设置Y坐标轴   
  175.         NumberAxis numberaxis = new NumberAxis("登入次数");   
  176.         numberaxis.setStandardTickUnits(NumberAxis.createIntegerTickUnits());   
  177.         numberaxis.setUpperMargin(0.10000000000000001D);   
  178.         numberaxis.setRange(0,20000);   
  179.            
  180.         //设置Renderer   
  181.         StackedXYBarRenderer stackedxybarrenderer = new StackedXYBarRenderer(0.14999999999999999D);   
  182.         stackedxybarrenderer.setDrawBarOutline(true);   
  183.         stackedxybarrenderer.setBaseItemLabelsVisible(false);   
  184.         stackedxybarrenderer.setBaseItemLabelGenerator(new StandardXYItemLabelGenerator());   
  185.         stackedxybarrenderer.setBasePositiveItemLabelPosition(new ItemLabelPosition(ItemLabelAnchor.OUTSIDE12, TextAnchor.BOTTOM_CENTER));   
  186.         stackedxybarrenderer.setBaseToolTipGenerator(new StandardXYToolTipGenerator("{0} : {1} = {2}"new SimpleDateFormat("yyyy"), new DecimalFormat("0")));   
  187.         stackedxybarrenderer.setMargin(0.2);   
  188.            
  189.         stackedxybarrenderer.setSeriesPaint(0new Color(0,11,220));   
  190.         stackedxybarrenderer.setSeriesPaint(1new Color(51,129,50));   
  191.         stackedxybarrenderer.setSeriesPaint(2new Color(255,0,0));   
  192.            
  193.         XYPlot plot = new XYPlot(dataset,periodaxis,numberaxis,stackedxybarrenderer);//数据集,X轴,Y轴,renderer   
  194.         plot.setRangeGridlinesVisible(true);   
  195.         plot.setDomainGridlinesVisible(false);   
  196.         JFreeChart chart = new JFreeChart("工作量统计",plot);   
  197.            
  198.            
  199.         XYPlot xyplot1=(XYPlot)chart.getPlot();   
  200.            
  201.         XYStepRenderer xysteprenderer1 = new XYStepRenderer();   
  202.         xysteprenderer1.setBaseShapesVisible(true);   
  203.         xysteprenderer1.setSeriesStroke(0new BasicStroke(1F));   
  204.         xysteprenderer1.setSeriesPaint(0new Color(255,0,0));   
  205.         //xysteprenderer1.setBaseToolTipGenerator(new StandardXYToolTipGenerator());   
  206.         //xysteprenderer1.setDefaultEntityRadius(6);   
  207.         xyplot1.setDataset(1, getXYDatasetLevel1());   
  208.         xyplot1.setRenderer(1,xysteprenderer1);   
  209.   
  210.         XYStepRenderer xysteprenderer2 = new XYStepRenderer();   
  211.         xysteprenderer2.setBaseShapesVisible(true);   
  212.         xysteprenderer2.setSeriesStroke(0new BasicStroke(2.0F));   
  213.         xysteprenderer2.setSeriesPaint(0, Color.yellow);   
  214.         xyplot1.setDataset(2, getXYDatasetLevel2());   
  215.         xyplot1.setRenderer(2,xysteprenderer2);   
  216.            
  217.            
  218.         this.savejpg(chart, jpgname);   
  219.            
  220.     }   
  221.        
  222.     private TimeTableXYDataset getXYDataset()   
  223.     {   
  224.         TimeTableXYDataset dataset = new TimeTableXYDataset();   
  225.         dataset.add(new Month(1,2005), 8000"已完");   
  226.         dataset.add(new Month(1,2005), 2000"未完");   
  227.         dataset.add(new Month(2,2005), 8000"未完");   
  228.            
  229.            
  230.         return dataset;   
  231.     }   
  232.        
  233.     private XYDataset getXYDatasetLevel1()   
  234.     {   
  235.         TimeTableXYDataset ttd1 = new TimeTableXYDataset();// 目标   
  236.   
  237.         ttd1.add(new Month(1,2005), 8000"目标");   
  238.         ttd1.add(new Month(2,2005), 9000"目标");   
  239.         ttd1.add(new Month(3,2005), 10000"目标");   
  240.            
  241.         return ttd1;   
  242.     }   
  243.   
  244.     private XYDataset getXYDatasetLevel2()   
  245.     {   
  246.         TimeTableXYDataset ttd2 = new TimeTableXYDataset();// 分布   
  247.   
  248.         ttd2.add(new Month(1,2005), 2000"分布");   
  249.         ttd2.add(new Month(2,2005), 2000"分布");   
  250.            
  251.         return ttd2;   
  252.     }   
  253.        
  254.        
  255.     //创建饼图   
  256.     public void createPieDemo(String jpgname)   
  257.     {   
  258.         DefaultPieDataset dataset = getPieDataset();   
  259.         JFreeChart chart = ChartFactory.createPieChart3D("水果产量", dataset, truetruetrue);   
  260.            
  261.         this.savejpg(chart, jpgname);   
  262.     }   
  263.   
  264.     //获取饼图数据   
  265.     private DefaultPieDataset getPieDataset() {   
  266.         DefaultPieDataset dataset = new DefaultPieDataset();   
  267.         dataset.setValue("苹果"100);   
  268.         dataset.setValue("梨子"200);   
  269.         dataset.setValue("葡萄"300);   
  270.         dataset.setValue("荔枝"400);   
  271.         dataset.setValue("香蕉"500);   
  272.         dataset.setValue("枣子"600);   
  273.         return dataset;   
  274.     }   
  275.        
  276.        
  277.     //保存为本地图片   
  278.     private void savejpg(JFreeChart chart,String jpgname)   
  279.     {   
  280.         FileOutputStream jpg = null;   
  281.         try {   
  282.             jpg = new FileOutputStream(jpgname);   
  283.             ChartUtilities.writeChartAsJPEG(jpg,0.5f,chart,800,500,null);   
  284.                
  285.                
  286.         } catch (Exception e) {   
  287.             // TODO 自动生成 catch 块   
  288.             e.printStackTrace();   
  289.         }   
  290.         finally  
  291.         {   
  292.             try {   
  293.                 jpg.close();   
  294.             } catch (IOException e) {   
  295.                 // TODO 自动生成 catch 块   
  296.                 e.printStackTrace();   
  297.             }   
  298.         }   
  299.            
  300.     }   
  301.        
  302. }   
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值