JFreeCharts绘画折线(柱状图)

记录下画折线(柱状图)的过程。先上图:



    
            画这个图的时候,并没有用CombinedDomainXYPlot来结合。CombinedDomainXYPlot结合说到底还是属于两个图片,只是将图片合到了一张图里面。这里是将数据画在一张图片中。所以用普通的方式生成chart就行了。
        首先还是可以先定义好数据。这里我用的条目数据集合(DefaultCategoryDataset),这里没什么难度。需要注意的是,在此图中,不同的折线可能会对应不同的y轴,但是两条y轴的数据不一样,所以,在设置好数据的之后要指定这条数据需要对应哪一条y轴。用plot.mapDatasetToRangeAxis(0,0)这里的0,0代表你设置进plot中的数据的index和y轴的index。然后,一般折线都会要求在柱状图前面显示。这里用plot.setDatasetRenderingOrder(DatasetRenderingOrder.FORWARD)来设置,注意,参数根据你设置的先后顺序来决定是要正序还是倒序。
    贴下代码:
            //获取画图数据
            String dJson = params.get("data");
            Map<String, Object> data = (Map<String, Object>) JsonUtil.parse(dJson);

            String title = (String) data.get("title");

            //使用y轴1
            DefaultCategoryDataset linedataset = new DefaultCategoryDataset();
            DefaultCategoryDataset bardataset = new DefaultCategoryDataset();
            //使用y轴2
            DefaultCategoryDataset linedataset2 = new DefaultCategoryDataset();
            DefaultCategoryDataset bardataset2 = new DefaultCategoryDataset();

            List<String> dates = (List<String>) data.get("xAxis");//x轴信息
            List<Map<String, Object>> yAxises = (List<Map<String, Object>>) data.get("yAxis");//y轴信息
            List<Map<String, Object>> serieses = (List<Map<String, Object>>) data.get("series");


            for(Map map : serieses){
                List<String> lists = (List<String>) map.get("data");
                if("line".equals(map.get("type")) && map.get("yAxis") == null){
                    for(int i = 0; i < lists.size(); i++){
                        linedataset.addValue(Double.valueOf(lists.get(i)), map.get("name").toString(), dates.get(i));
                    }
                } else if("line".equals(map.get("type"))){
                    for(int i = 0; i < lists.size(); i++){
                        linedataset2.addValue(Double.valueOf(lists.get(i)), map.get("name").toString(), dates.get(i));
                    }
                }
                if("bar".equals(map.get("type")) && map.get("yAxis") == null){
                    for(int i = 0; i < lists.size(); i++){
                        bardataset.addValue(Double.valueOf(lists.get(i)), map.get("name").toString(), dates.get(i));
                    }
                } else if("bar".equals(map.get("type"))){
                    for(int i = 0; i < lists.size(); i++){
                        bardataset2.addValue(Double.valueOf(lists.get(i)), map.get("name").toString(), dates.get(i));
                    }
                }
            }        



            //创建主题样式
            StandardChartTheme standardChartTheme=new StandardChartTheme("CN");
            //设置标题字体
            standardChartTheme.setExtraLargeFont(new Font("微软雅黑",Font.BOLD,20));
            //设置图例的字体
            standardChartTheme.setRegularFont(new Font("微软雅黑",Font.PLAIN,15));
            //设置轴向的字体
            standardChartTheme.setLargeFont(new Font("微软雅黑",Font.PLAIN,15));            
            //应用主题样式
            ChartFactory.setChartTheme(standardChartTheme);
            //定义图标对象
            JFreeChart chart = ChartFactory.createLineChart(title,// 报表题目,字符串类型
                    null, // 横轴
                    null, // 纵轴
                    null, // 数据集
                    PlotOrientation.VERTICAL, // 图标方向垂直
                    true, // 显示图例
                    false, // 不用生成工具
                    false // 不用生成URL地址
                    );


            LineAndShapeRenderer lineRenderer = new LineAndShapeRenderer();//默认折线图画图器


            BarRenderer barRenderer = new BarRenderer();//默认柱状图画图器
            barRenderer.setItemMargin(0.1);

            CategoryPlot plot = chart.getCategoryPlot();//获取画板


            CategoryAxis xAxis = plot.getDomainAxis();//获取x轴
            xAxis.setCategoryLabelPositions(CategoryLabelPositions.UP_90);//设置x轴标签往上倒90度 
            xAxis.setLowerMargin(0);
            xAxis.setCategoryMargin(0.3);

            NumberAxis yAxis1 = new NumberAxis();//y轴1
            yAxis1.setLabel(yAxises.get(0).get("name").toString());
            yAxis1.setAutoRange(false);
            yAxis1.setRange(Double.valueOf(yAxises.get(0).get("min").toString()), Double.valueOf(yAxises.get(0).get("max").toString()));
            yAxis1.setLabelFont(new Font("微软雅黑",Font.PLAIN,15));
            if(yAxises.size() > 1){//如果有需要双y轴,则添加一条y轴
                NumberAxis yAxis2 = new NumberAxis();
                yAxis2.setAutoRange(false);
                yAxis2.setLabel(yAxises.get(1).get("name").toString());
                yAxis2.setRange(Double.valueOf(yAxises.get(1).get("min").toString()), Double.valueOf(yAxises.get(1).get("max").toString()));
                yAxis2.setLabelFont(new Font("微软雅黑",Font.PLAIN,15));
                plot.setRangeAxis(1, yAxis2);
            }
            plot.setRangeAxis(0, yAxis1);

            //如果有数据,则写入数据,并设置数据对应轴线            
            if(bardataset.getColumnCount() > 0){
                plot.setDataset(1, bardataset);
                plot.setRenderer(1, barRenderer);
                plot.mapDatasetToRangeAxis(1, 0);
                plot.setDatasetRenderingOrder(DatasetRenderingOrder.REVERSE);//折线在柱面前面显示
            }
            if(linedataset.getColumnCount() > 0){
                plot.setDataset(0, linedataset);
                plot.setRenderer(0, lineRenderer);
                plot.mapDatasetToRangeAxis(0, 0);
                plot.setDatasetRenderingOrder(DatasetRenderingOrder.FORWARD);//折线在柱面前面显示
            }          
            if(bardataset2.getColumnCount() > 0){
                plot.setDataset(3, bardataset2);
                plot.setRenderer(3, barRenderer);
                plot.mapDatasetToRangeAxis(3, 1);
                plot.setDatasetRenderingOrder(DatasetRenderingOrder.REVERSE);//折线在柱面前面显示
            }
            if(linedataset2.getColumnCount() > 0){
                plot.setDataset(2, linedataset2);
                plot.setRenderer(2, lineRenderer);
                plot.mapDatasetToRangeAxis(2, 1);
                plot.setDatasetRenderingOrder(DatasetRenderingOrder.FORWARD);//折线在柱面前面显示
            }  

            chart.getLegend().setItemLabelPadding(new RectangleInsets(0, 0, 0, 50D));//设置图例间距
            chart.getTitle().setMargin(0, -800, 0, 0);//设置标题居左

            Calendar calendar = Calendar.getInstance();
            calendar.setTimeInMillis(System.currentTimeMillis());
            int day = calendar.get(Calendar.DAY_OF_MONTH);
            int month = calendar.get(Calendar.MONTH) + 1;
            int year = calendar.get(Calendar.YEAR);

            String file_path = PropertiesRead.getinstance().getValue("PATH");
            path = year + "-" + month + "-" + day + "/" + Uuid.getUUID() + "lineChart.png";
            file_path = file_path + path;    
            saveChartAsJPEG(chart, file_path);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值