JFreeChart笔记 (三) 时间序列图:设置图表显示属性

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

上篇文章中我们学习了怎么样在swing框架构建一个基本的时间序列图,这一节将学习如果设置JFreeChart的显示样式,本节实例运行效果图如下:


       本实例新增实现功能:


       ① 设置图表背景色、背景图片、网格线颜色等

       ② 设置序列线颜色、数据点外框是否画出,数据点是否填充,填充颜色等


      实现代码如下:

Java代码 
  1. package lw.release.s1TimeSeries;  

  2.  

  3. import java.awt.Color;  

  4. import java.awt.Dimension;  

  5. import java.awt.Font;  

  6. import javax.swing.BorderFactory;  

  7. import javax.swing.JPanel;  

  8. import javax.swing.border.CompoundBorder;  

  9. import org.jfree.chart.ChartFactory;  

  10. import org.jfree.chart.ChartPanel;  

  11. import org.jfree.chart.JFreeChart;  

  12. import org.jfree.chart.StandardChartTheme;  

  13. import org.jfree.chart.labels.StandardXYSeriesLabelGenerator;  

  14. import org.jfree.chart.plot.PlotOrientation;  

  15. import org.jfree.chart.plot.XYPlot;  

  16. import org.jfree.chart.renderer.xy.XYItemRenderer;  

  17. import org.jfree.chart.renderer.xy.XYLineAndShapeRenderer;  

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

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

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

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

  22. import org.jfree.ui.ApplicationFrame;  

  23. import org.jfree.ui.RefineryUtilities;  

  24.  

  25. import lw.release.ChartBasePanel;  

  26.  

  27. /**

  28. * 时间序列图:设置图表显示属性

  29. *

  30. * 新增功能点:

  31. *   ① 设置图表背景色、背景图片、网格线颜色等

  32. *   ② 设置序列线颜色、数据点外框是否画出,数据点是否填充,填充颜色等

  33. *

  34. * @author 刘伟  2012-10-26

  35. *

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

  37. * */  

  38. @SuppressWarnings("serial")  

  39. public class TimeSeries02 extends ApplicationFrame {  

  40.  

  41.    public TimeSeries02(String title) {  

  42.        super(title);  

  43.        setContentPane(new TimeSeriesPanel());  

  44.    }  

  45.  

  46.    public JPanel createDemoPanel() {  

  47.        return new TimeSeriesPanel();  

  48.    }  

  49.  

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

  51.        TimeSeries02 timeSeries = new TimeSeries02("设置图表显示属性");  

  52.        timeSeries.pack();  

  53.        RefineryUtilities.centerFrameOnScreen(timeSeries);  

  54.        timeSeries.setVisible(true);  

  55.    }  

  56.  

  57.    /**

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

  59.     *

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

  61.     * 这个类源码位置:http://lw2078.iteye.com/blog/1705637

  62.     * */  

  63.    private class TimeSeriesPanel extends ChartBasePanel {  

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

  65.        private ChartPanel chartPanel;    

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

  67.  

  68.        public TimeSeriesPanel() {  

  69.            super();  

  70.              

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

  72.              

  73.            /* 将JFreeChart放在专用的图表容器ChartPanel中 */  

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

  75.            this.chartPanel.setPreferredSize(new Dimension(600250));  

  76.              

  77.            // 设置chartPanel容器边框  

  78.            CompoundBorder compoundBorder = BorderFactory.createCompoundBorder(  

  79.                    BorderFactory.createEmptyBorder(44,44),  

  80.                    BorderFactory.createEtchedBorder());  

  81.            this.chartPanel.setBorder(compoundBorder);  

  82.              

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

  84.            add(this.chartPanel);  

  85.        }  

  86.  

  87.        /**

  88.         * 创建jfreechart图表

  89.         * */  

  90.        private JFreeChart createChart() {  

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

  92.            XYDataset xyDataset = createDataset();  

  93.              

  94.            // 增加汉字支持  

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

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

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

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

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

  100.              

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

  102.            JFreeChart jFreeChart = ChartFactory.createTimeSeriesChart(  

  103.                    "设置图表显示属性",     // 图表名  

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

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

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

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

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

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

  110.              

  111. ///////////////////////////// 新功能点 ////////////////////////////////////////      

  112.              

  113.            // XYPlot图表区域的设置对象,用来设置图表的一些显示属性  

  114.            XYPlot xyPlot = (XYPlot) jFreeChart.getPlot();    

  115.            xyPlot.setBackgroundPaint(Color.PINK);          // 设置图表背景颜色  

  116.            xyPlot.setOrientation(PlotOrientation.VERTICAL);// 图表横向显示还是纵向显示  

  117.            xyPlot.setDomainGridlinePaint(Color.BLUE);  // 设置横向网格线蓝色  

  118.            xyPlot.setDomainGridlinesVisible(true);     // 设置显示横向网格线  

  119.            xyPlot.setRangeGridlinePaint(Color.BLUE);   // 设置纵向网格线蓝色  

  120.            xyPlot.setRangeGridlinesVisible(true);      // 设置显示纵向网格线  

  121.            // 设置背景图片  

  122.            //  xyPlot.setBackgroundPaint(null);  

  123.            //  xyPlot.setBackgroundImage(JFreeChart.INFO.getLogo());   // 传入一个Image对象即可  

  124.              

  125.            // XYPlot用XYItemRenderer来画图表中的每一个序列线和数据点  

  126.            // 可以用XYItemRenderer来控制图表中序列线和数据点的画法  

  127.            XYItemRenderer r = xyPlot.getRenderer();  

  128.            if (r instanceof XYLineAndShapeRenderer) {  

  129.                XYLineAndShapeRenderer renderer = (XYLineAndShapeRenderer) r;  

  130.                  

  131.                // 数据点样式设置  

  132.                renderer.setBaseShapesVisible(true);    // 数据点显示外框  

  133.                renderer.setBaseShapesFilled(true);     // 数据点外框内是否填充  

  134.                renderer.setSeriesFillPaint(0, Color.ORANGE);   // 第一条序列线上数据点外框内填充颜色为橘黄色  

  135.                renderer.setSeriesFillPaint(1, Color.white);    // 第二条序列线上数据点外框内填充颜色为白色  

  136.                renderer.setUseFillPaint(true); // 如果要在数据点外框内填充自定义的颜色,这个标志位必须为真  

  137.                

  138.                // 序列线样式设置  

  139.                renderer.setSeriesPaint(0, Color.GREEN);  // 设置第一条序列线为绿色  

  140.                renderer.setSeriesPaint(1, Color.YELLOW); // 设置第二条数据线为黄色  

  141.                renderer.setLegendItemToolTipGenerator(new StandardXYSeriesLabelGenerator("Tooltip {0}"));// 鼠标移到序列线上提示信息为“Toolop + 序列线的名字”  

  142.            }  

  143.              

  144. //////////////////////////////////// ////////////////////////////////////////  

  145.              

  146.            return jFreeChart;  

  147.        }  

  148.  

  149.        /**

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

  151.         *

  152.         * @return

  153.         */  

  154.        private XYDataset createDataset() {  

  155.  

  156.            // 生成数据序列1  

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  171.  

  172.              

  173.            // 生成数据序列2  

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  188.              

  189.            // 将两条数据序列都放在一个数据集合中  

  190.            TimeSeriesCollection dataset = new TimeSeriesCollection();  

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

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

  193.              

  194.            return dataset;  

  195.        }  

  196.    }  

  197.      

  198.      

  199. }  

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

0 0
原创粉丝点击