注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

北漂的小羊

Java编程,开发者,程序员,软件开发,编程,代码。新浪微博号:IT国子监

 
 
 

日志

 
 
关于我

在这里是面向程序员的高品质IT技术学习社区,是程序员学习成长的地方。让我们更好地用技术改变世界。请关注新浪微博号: IT国子监(http://weibo.com/itguozijian)

网易考拉推荐

JFreeChart折线时间序列图:显示多重时间标签文字  

2012-11-30 17:07:35|  分类: JFreeChart |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

  JFreeChart是JAVA平台上的一个开放的图表绘制类库。它完全使用JAVA语言编写,是为applications, applets, servlets 以及JSP等使用所设计。JFreeChart可生成饼图(pie charts)、柱状图(bar charts)、散点图(scatter plots)、时序图(time series)、甘特图(Gantt charts)等等多种图表,并且可以产生PNG和JPEG格式的输出,还可以与PDF和EXCEL关联。

  JFreeChart截止2011年2月22日为止的相当不错的java图形解决方案,基本能够解决目前的图形方面的需求。

下载官方地址:http://www.jfree.org/jfreechart/

讲解前先看一下下面的程序运行截图,注意时间轴的标签显示方式。我们之前所有的例子的时间轴的标签文字不管是以什么格式显示的,都是显示在一行。如果我们要下图的这种显示方式,不同时间类型出现在不同行,这种效果该如何做呢?这一节我们将学习如何在时间轴上显示多重时间标签文字。

 

JFreeChart笔记 (九) 时间序列图:显示多重时间标签文字 - 天涯草 - 天涯草
 

 

 

下面是实现代码,关键部分已经标出,使用方法注释中都写明白了:

 

 

Java代码 
  1. package lw.release.s1TimeSeries;  
  2.   
  3. import java.awt.BasicStroke;  
  4. import java.awt.Color;  
  5. import java.awt.Dimension;  
  6. import java.awt.Font;  
  7. import java.text.SimpleDateFormat;  
  8. import java.util.TimeZone;  
  9.   
  10. import javax.swing.BorderFactory;  
  11. import javax.swing.JPanel;  
  12. import javax.swing.border.CompoundBorder;  
  13. import org.jfree.chart.ChartFactory;  
  14. import org.jfree.chart.ChartPanel;  
  15. import org.jfree.chart.ChartUtilities;  
  16. import org.jfree.chart.JFreeChart;  
  17. import org.jfree.chart.StandardChartTheme;  
  18. import org.jfree.chart.axis.PeriodAxis;  
  19. import org.jfree.chart.axis.PeriodAxisLabelInfo;  
  20. import org.jfree.chart.plot.XYPlot;  
  21. import org.jfree.chart.renderer.xy.XYItemRenderer;  
  22. import org.jfree.chart.renderer.xy.XYLineAndShapeRenderer;  
  23. import org.jfree.data.time.Day;  
  24. import org.jfree.data.time.Month;  
  25. import org.jfree.data.time.RegularTimePeriod;  
  26. import org.jfree.data.time.TimeSeries;  
  27. import org.jfree.data.time.TimeSeriesCollection;  
  28. import org.jfree.data.time.Year;  
  29. import org.jfree.data.xy.XYDataset;  
  30. import org.jfree.ui.ApplicationFrame;  
  31. import org.jfree.ui.RectangleInsets;  
  32. import org.jfree.ui.RefineryUtilities;  
  33.   
  34. import lw.release.ChartBasePanel;  
  35.   
  36. /** 
  37.  * 时间序列图:显示多重时间标签文字 
  38.  *  
  39.  * 新增功能点: 
  40.  *   ① 显示多重时间标签文字 
  41.  *  
  42.  * 
  43.  *  
  44.  *  
  45.  * */  
  46. @SuppressWarnings("serial")  
  47. public class TimeSeries08 extends ApplicationFrame {  
  48.   
  49.     public TimeSeries08(String title) {  
  50.         super(title);  
  51.         setContentPane(new TimeSeriesPanel());  
  52.     }  
  53.   
  54.     public JPanel createDemoPanel() {  
  55.         return new TimeSeriesPanel();  
  56.     }  
  57.   
  58.     public static void main(String[] arg) {  
  59.         TimeSeries08 timeSeries = new TimeSeries08("显示多重时间标签文字示例");  
  60.         timeSeries.pack();  
  61.         RefineryUtilities.centerFrameOnScreen(timeSeries);  
  62.         timeSeries.setVisible(true);  
  63.     }  
  64.   
  65.     /** 
  66.      * 显示该Demo图表的容器 
  67.      *  
  68.      * ChartBasePanel类是Swing框架下所有例子共同使用的,这里不重复贴出 
  69.      *  
  70.      * */  
  71.     private class TimeSeriesPanel extends ChartBasePanel {  
  72.         private TimeSeries series;  // 间隔定长时间(如年、月、日、时、分、秒等)的数据序列  
  73.         private ChartPanel chartPanel;    
  74.         private JFreeChart chart = createChart();   // 创建一个JFreeChart时间序列图表  
  75.   
  76.         public TimeSeriesPanel() {  
  77.             super();  
  78.               
  79.             addChart(this.chart);   // 将此JFreeChart加入JFreeChart列表中  
  80.               
  81.             // 将JFreeChart放在专用的图表容器ChartPanel中  
  82.             this.chartPanel = new ChartPanel(this.chart);  
  83.             this.chartPanel.setPreferredSize(new Dimension(600250));  
  84.               
  85.             // 设置chartPanel容器边框  
  86.             CompoundBorder compoundBorder = BorderFactory.createCompoundBorder(  
  87.                     BorderFactory.createEmptyBorder(44,44),  
  88.                     BorderFactory.createEtchedBorder());  
  89.             this.chartPanel.setBorder(compoundBorder);  
  90.               
  91.             // 将chartPanel加入到本容器中  
  92.             add(this.chartPanel);  
  93.         }  
  94.   
  95.         /** 
  96.          * 创建jfreechart图表 
  97.          * */  
  98.         private JFreeChart createChart() {  
  99.             // 生成图表数据集合  
  100.             XYDataset xyDataset = createDataset();   
  101.               
  102.             // 增加汉字支持  
  103.             StandardChartTheme standardChartTheme=new StandardChartTheme("CN");     //创建主题样式            
  104.             standardChartTheme.setExtraLargeFont(new Font("隶书",Font.BOLD,20));    //设置标题字体         
  105.             standardChartTheme.setRegularFont(new Font("SimSun",Font.PLAIN,15));    //设置图例的字体      
  106.             standardChartTheme.setLargeFont(new Font("宋体",Font.PLAIN,15));      //设置轴向的字体     
  107.             ChartFactory.setChartTheme(standardChartTheme); //应用主题样式      
  108.               
  109.             // 创建一个时间序列图表的JFreeChart  
  110.             JFreeChart jFreeChart = ChartFactory.createTimeSeriesChart(  
  111.                     "多重时间标签文字示例",   // 图表名  
  112.                     "时间",               // 横轴标签文字  
  113.                     "数值",               // 纵轴标签文字  
  114.                     xyDataset,          // 图表的数据集合  
  115.                     true,               // 是否显示图表中每条数据序列的说明  
  116.                     false,              // 是否显示工具提示  
  117.                     false);             // 是否显示图表中设置的url网络连接  
  118.           
  119.             // XYPlot图表区域的设置对象,用来设置图表的一些显示属性  
  120.             XYPlot xyPlot = (XYPlot) jFreeChart.getPlot();    
  121.                           
  122.             // 设置数据点和序列线的显示格式  
  123.             XYItemRenderer r = xyPlot.getRenderer();  
  124.             if (r instanceof XYLineAndShapeRenderer) {  
  125.                 XYLineAndShapeRenderer renderer = (XYLineAndShapeRenderer) r;  
  126.                 renderer.setBaseShapesVisible(true);    // 数据点显示外框  
  127.                 renderer.setBaseShapesFilled(true); // 数据点外框内填充  
  128.             }  
  129.               
  130. ///////////////////////////////  新功能点 /////////////////////////////////////////    
  131.             // 自定义新的时间轴,用于显示多重时间标签  
  132.             PeriodAxis periodAxis = new PeriodAxis("时间");   // 自定义X时间轴  
  133.             periodAxis.setTimeZone(TimeZone.getDefault());  // 使用默认时区  
  134.             periodAxis.setAutoRangeTimePeriodClass(Day.class); // 设置该时间轴默认自动增长时间单位为天  
  135.              
  136.             // 设置不同重的时间显示格式  
  137.             PeriodAxisLabelInfo[] arrayOfPeriodAxisLabelInfo = new PeriodAxisLabelInfo[3];  
  138.             arrayOfPeriodAxisLabelInfo[0] = new PeriodAxisLabelInfo(Day.classnew SimpleDateFormat("d")); // 第一行显示天  
  139.             arrayOfPeriodAxisLabelInfo[1] = new PeriodAxisLabelInfo(Month.classnew SimpleDateFormat("MMM"), new RectangleInsets(2.0D, 2.0D, 2.0D, 2.0D), new Font("SansSerif"110), Color.blue, falsenew BasicStroke(0.0F), Color.lightGray); // 第二行显示月  
  140.             arrayOfPeriodAxisLabelInfo[2] = new PeriodAxisLabelInfo(Year.classnew SimpleDateFormat("yyyy年")); // 第三行显示年  
  141.               
  142.             periodAxis.setLabelInfo(arrayOfPeriodAxisLabelInfo); // 设置时间轴上的时间显示格式  
  143.             xyPlot.setDomainAxis(periodAxis);   // 设置X时间轴  
  144.             ChartUtilities.applyCurrentTheme(jFreeChart); // 使用当前主题  
  145. ////////////////////////////////////////////////////////////////////////  
  146.               
  147.             return jFreeChart;  
  148.         }  
  149.   
  150.         /** 
  151.          * 创建jfreechart图表所用的数据集合 
  152.          *  
  153.          * @return 
  154.          */  
  155.         private XYDataset createDataset() {  
  156.   
  157.             // 生成数据序列  
  158.             this.series = new TimeSeries("序列线");      
  159.             setSeriesData(series, 100new Day(25,10,2012), 18); // 以月为时间单位,从2012年10月25日开始,随机产生18天的模拟数据  
  160.               
  161.             // 将数据序列放在一个数据集合中  
  162.             TimeSeriesCollection dataset = new TimeSeriesCollection();  
  163.             dataset.addSeries(this.series);   
  164.               
  165.             return dataset;  
  166.         }  
  167.   
  168.         /** 
  169.          * 随机生成数据,自动定位到时间序列上的下一个时间点,将新数据点加入到数据序列中 
  170.          * 
  171.          * @param series    数据序列对象 
  172.          * @param baseData  生成的随机数据的基准值 
  173.          * @param regularTime   定长的时间间隔(年、月、日、时、分、秒等) 
  174.          * @param sampleNum  生成的数据点个数 
  175.          */  
  176.         private void setSeriesData(TimeSeries series, double baseData, RegularTimePeriod regularTime, int sampleNum) {  
  177.   
  178.             // 生成随机模拟数据  
  179.             double value = baseData;  
  180.             for (int i = 0; i < sampleNum; i++) {  
  181.                 series.add(regularTime, value);       
  182.                 regularTime = regularTime.next();   //自动定位到下一个时间点  
  183.                 value *= (1.0D + (Math.random() - 0.495D) / 4.0D);  
  184.             }  
  185.         }  
  186.     }  
  187.       
  188.       
  189. }  
 
附:官方下载:http://www.jfree.org/
  评论这张
 
阅读(941)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2016