JFreeChart笔记 (二) 时间序列图:基本时间序列图

来源:互联网 发布:企业域名注册流程 编辑:程序博客网 时间:2024/06/05 00:02

时间序列图是一种基本的图表,它的特点是横轴是时间,纵轴是值。像是每周的营业额、每年利润等图表都是这种类型。这一部分先学习下如何利用swing组件构建一个基本的时间序列图。

本实例新增功能点:

 ① Swing框架下如何使用JfreeChart

② 基本的时间序列图构建需要哪些步骤

③ 实现汉字支持

④ 某些数据点没有数据,序列线不连续该如何处理


先看本示例运行截图:

                             基本时间序列图

下面是本实例源码,注释已经写的很清楚,可以当API使用:

  1. package lw.release.s1TimeSeries;

  2. import java.awt.Dimension;  

  3. import java.awt.Font;  

  4. import javax.swing.BorderFactory;  

  5. import javax.swing.JPanel;  

  6. import javax.swing.border.CompoundBorder;  

  7. import org.jfree.chart.ChartFactory;  

  8. import org.jfree.chart.ChartPanel;  

  9. import org.jfree.chart.JFreeChart;  

  10. import org.jfree.chart.StandardChartTheme;  

  11. import org.jfree.data.time.Month;  

  12. import org.jfree.data.time.TimeSeries;  

  13. import org.jfree.data.time.TimeSeriesCollection;  

  14. import org.jfree.data.xy.XYDataset;  

  15. import org.jfree.ui.ApplicationFrame;  

  16. import org.jfree.ui.RefineryUtilities;

  17. import lw.release.ChartBasePanel;

  18. /**

  19. * 时间序列图:基本时间序列图

  20. * 新增功能点:

  21. *   ① Swing框架下如何使用JfreeChart

  22. *   ② 基本的时间序列图构建需要哪些步骤

  23. *   ③ 实现汉字支持

  24. *   ④ 某些数据点没有数据,序列线不连续该如何处理

  25. * @author 刘伟  2012-10-24

  26. * 注:楼主辛勤整理,无私免费提供给大家观看,体惜楼主辛苦,转载时请注明出处:http://lw2078.iteye.com/

  27. *

  28. * */  

  29. @SuppressWarnings("serial")  

  30. public class TimeSeries01 extends ApplicationFrame {

  31.    public TimeSeries01(String title) {  

  32.        super(title);  

  33.        setContentPane(new TimeSeriesPanel());  

  34.    }

  35.    public JPanel createDemoPanel() {  

  36.        return new TimeSeriesPanel();  

  37.    }

  38.    public static void main(String[] arg) {  

  39.        TimeSeries01 timeSeries = new TimeSeries01("基础时间序列图");  

  40.        timeSeries.pack();  

  41.        RefineryUtilities.centerFrameOnScreen(timeSeries);  

  42.        timeSeries.setVisible(true);  

  43.    }

  44.    /**

  45.     * 显示该Demo图表的容器

  46.     * ChartBasePanel类是Swing框架下所有例子共同使用的,这里不重复贴出

  47.     * 这个类源码在 http://lw2078.iteye.com/blog/1705637

  48.     * */  

  49.    private class TimeSeriesPanel extends ChartBasePanel {  

  50.        private TimeSeries series[] = new TimeSeries[2];    // 间隔定长时间(如年、月、日、时、分、秒等)的数据序列  

  51.        private ChartPanel chartPanel;    

  52.        private JFreeChart chart = createChart();   // 创建一个JFreeChart时间序列图表

  53.        public TimeSeriesPanel() {  

  54.            super();

  55.            addChart(this.chart);   // 将此JFreeChart加入JFreeChart列表中

  56.            /* ChartPanels是用于专门显示JFreeChart图表的一个容器,该容器封装了一些事件监听器(如鼠标点击等),

  57.             * 当JFreeChart中任何内容发生改变时,该容器会自动重新绘制其中的内容,

  58.             * 在swing应用中JFreeChart必须放在ChartPanels才能正常运作 */  

  59.            this.chartPanel = new ChartPanel(this.chart);  

  60.            this.chartPanel.setPreferredSize(new Dimension(600250)); // Dimension 类封装单个对象中组件的宽度和高度

  61.            // 设置chartPanel容器边框  

  62.            CompoundBorder compoundBorder = BorderFactory.createCompoundBorder(  

  63.                    BorderFactory.createEmptyBorder(44,44),  

  64.                    BorderFactory.createEtchedBorder());  

  65.            this.chartPanel.setBorder(compoundBorder);

  66.            // 将chartPanel加入到本容器中  

  67.            add(this.chartPanel);  

  68.        }

  69.        /**

  70.         * 创建jfreechart图表

  71.         * */  

  72.        private JFreeChart createChart() {  

  73.            // 生成图表数据集合  

  74.            XYDataset xyDataset = createDataset();

  75.            // 增加汉字支持  

  76.            StandardChartTheme standardChartTheme=new StandardChartTheme("CN"); //创建主题样式            

  77.            standardChartTheme.setExtraLargeFont(new Font("隶书",Font.BOLD,20));//设置标题字体        

  78.            standardChartTheme.setRegularFont(new Font("SimSun",Font.PLAIN,15)); //设置图例的字体      

  79.            standardChartTheme.setLargeFont(new Font("宋体",Font.PLAIN,15));//设置轴向的字体    

  80.            ChartFactory.setChartTheme(standardChartTheme); //应用主题样式      

  81.              

  82.            // 创建一个时间序列图表的JFreeChart  

  83.            JFreeChart jFreeChart = ChartFactory.createTimeSeriesChart(  

  84.                    "基础时间序列图",  // 图表名  

  85.                    "时间",               // 横轴标签文字  

  86.                    "数值",               // 纵轴标签文字  

  87.                    xyDataset,          // 图表的数据集合  

  88.                    true,               // 是否显示图表中每条数据序列的说明  

  89.                    false,              // 是否显示工具提示  

  90.                    false);             // 是否显示图表中设置的url网络连接  

  91.          

  92.            return jFreeChart;  

  93.        }  

  94.  

  95.        /**

  96.         * 创建jfreechart图表所用的数据集合

  97.         * @return

  98.         */  

  99.        private XYDataset createDataset() {

  100.            /*

  101.             * 如果某个时间点对应的没有数据,体现在序列线中应该是线在改点是断开不连续的,

  102.             * 此时应该将该时间点的数值设置为null,这样做出来的图表在改点是断开的,

  103.             * 否则JFreeChart会将改点的前后两点自动连接,体现不出该点没有数据

  104.             * */  

  105.            // 生成数据序列1  

  106.            this.series[0] = new TimeSeries("序列1");  

  107.            series[0].add(new Month(22001), 181.8);  

  108.            series[0].add(new Month(32001), 167.3);  

  109.            series[0].add(new Month(42001), 153.8);  

  110.            series[0].add(new Month(52001), 167.6);  

  111.            series[0].add(new Month(62001), 158.8);  

  112.            series[0].add(new Month(72001), null);    // 没有数据不连续的情况,该时间点的数值应该设置为null  

  113.            series[0].add(new Month(82001), 153.9);  

  114.            series[0].add(new Month(92001), 142.7);  

  115.            series[0].add(new Month(102001), 123.2);  

  116.            series[0].add(new Month(112001), 131.8);  

  117.            series[0].add(new Month(122001), 139.6);  

  118.            series[0].add(new Month(12002), 142.9);  

  119.            series[0].add(new Month(22002), 138.7);

  120.              

  121.            // 生成数据序列2  

  122.            this.series[1] = new TimeSeries("序列2");  

  123.            series[1].add(new Month(22001), 129.6);  

  124.            series[1].add(new Month(32001), 123.2);  

  125.            series[1].add(new Month(42001), 117.2);  

  126.            series[1].add(new Month(52001), 124.1);  

  127.            series[1].add(new Month(62001), 122.6);  

  128.            series[1].add(new Month(72001), 119.2);  

  129.            series[1].add(new Month(82001), 116.5);  

  130.            series[1].add(new Month(92001), 112.7);  

  131.            series[1].add(new Month(102001), 101.5);  

  132.            series[1].add(new Month(112001), 106.1);  

  133.            series[1].add(new Month(122001), 110.3);  

  134.            series[1].add(new Month(12002), 111.7);  

  135.            series[1].add(new Month(22002), 111.0);  

  136.              

  137.            // SeriesCollection存放的是图表中的数据集合  

  138.            // 将两条数据序列都放在一个数据集合中,这样图表中就会同时显示两条数据序列线  

  139.            TimeSeriesCollection dataset = new TimeSeriesCollection();  

  140.            dataset.addSeries(this.series[0]);    

  141.            dataset.addSeries(this.series[1]);    

  142.              

  143.            return dataset;  

  144.        }  

  145.    }  

  146. }  

本文链接:领悟书生教程网,转自http://lw2078.iteye.com

0 0
原创粉丝点击