精华内容
下载资源
问答
  • Java绘制图表

    千次阅读 2019-03-26 17:19:43
    /** * 绘制图表工具类 * * @author wangzhongxing * @version $Id: JFreeChartUtil.java, v 0.1 2019年03月25日 8:06 PM wangzhongxing Exp $ */ public class JFreeChartUtil { /** * 绘制条形图,并生成图片 * * ...

    maven引入配置

    <dependency>
        <groupId>jfree</groupId>
        <artifactId>jfreechart</artifactId>
        <version>1.0.13</version>
    </dependency>
    <dependency>
        <groupId>org.jfree</groupId>
        <artifactId>jcommon</artifactId>
        <version>1.0.24</version>
    </dependency>
    <dependency>
        <groupId>incanter</groupId>
        <artifactId>gnujaxp</artifactId>
        <version>1</version>
    </dependency>
    

    工具类

    当中绘制带刻度的雷达图实现方法是参考别人的解决方案,源文档连接:https://blog.51cto.com/wangjierui/116845

    package com.wangzhongxing.springcloud.common.utils;
    
    import com.wangzhongxing.springcloud.common.config.JFreeChartConfig;
    import org.jfree.chart.ChartFactory;
    import org.jfree.chart.ChartUtilities;
    import org.jfree.chart.JFreeChart;
    import org.jfree.chart.plot.PlotOrientation;
    import org.jfree.chart.title.LegendTitle;
    import org.jfree.chart.title.TextTitle;
    import org.jfree.data.category.DefaultCategoryDataset;
    import org.jfree.data.general.DefaultPieDataset;
    import org.jfree.ui.RectangleEdge;
    
    import javax.imageio.ImageIO;
    import java.awt.*;
    import java.awt.image.BufferedImage;
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.IOException;
    
    /**
     * 绘制图表工具类
     *
     * @author wangzhongxing
     * @version $Id: JFreeChartUtil.java, v 0.1 2019年03月25日 8:06 PM wangzhongxing Exp $
     */
    public class JFreeChartUtil {
    
        /**
         * 绘制条形图,并生成图片
         *
         * @param config     图表配置参数
         * @param dataset    图表内容数据
         * @param outputFile 输出图片路径
         * @return
         */
        public static boolean drawBarChart(JFreeChartConfig config, DefaultCategoryDataset dataset,
                                           String outputFile) {
            JFreeChart barChart = ChartFactory.createBarChart(config.getTitle(),
                    config.getCategoryAxisLabel(), config.getValueAxisLabel(), dataset,
                    PlotOrientation.VERTICAL, true, true, false);
            // 设置图表背景图颜色
            if (null != config.getBackgroundColor()) {
                barChart.getPlot().setBackgroundPaint(config.getBackgroundColor());
            }
            // 设置图表边框的颜色
            if (null != config.getOutlineColor()) {
                barChart.getPlot().setOutlinePaint(config.getOutlineColor());
            }
            // 设置图表背景图
            if (null != config.getBackgroundImage()) {
                barChart.getPlot().setBackgroundImage(config.getBackgroundImage());
            }
    
            try {
                ChartUtilities.saveChartAsJPEG(new File(outputFile), barChart, config.getWidth(),
                        config.getHeight());
    
                return true;
            } catch (IOException e) {
                return false;
            }
        }
    
        /**
         * 绘制折线图,并生成图片
         *
         * @param config     图表配置参数
         * @param dataset    图表内容数据
         * @param outputFile 输出图片路径
         * @return
         */
        public static boolean drawLineChart(JFreeChartConfig config, DefaultCategoryDataset dataset,
                                            String outputFile) {
            JFreeChart lineChartObject = ChartFactory.createLineChart(config.getTitle(),
                    config.getCategoryAxisLabel(), config.getValueAxisLabel(), dataset,
                    PlotOrientation.VERTICAL, true, true, false);
            // 设置图表背景图颜色
            if (null != config.getBackgroundColor()) {
                lineChartObject.getPlot().setBackgroundPaint(config.getBackgroundColor());
            }
            // 设置图表边框的颜色
            if (null != config.getOutlineColor()) {
                lineChartObject.getPlot().setOutlinePaint(config.getOutlineColor());
            }
            // 设置图表背景图
            if (null != config.getBackgroundImage()) {
                lineChartObject.getPlot().setBackgroundImage(config.getBackgroundImage());
            }
    
            try {
                ChartUtilities.saveChartAsJPEG(new File(outputFile), lineChartObject, config.getWidth(),
                        config.getHeight());
    
                return true;
            } catch (IOException e) {
                return false;
            }
        }
    
        /**
         * 绘制饼图,并生成图片
         *
         * @param config     图表配置参数
         * @param dataset    图表内容数据
         * @param outputFile 输出图片路径
         * @return
         */
        public static boolean drawPieChart(JFreeChartConfig config, DefaultPieDataset dataset,
                                           String outputFile) {
            JFreeChart pieChar = ChartFactory.createPieChart(config.getTitle(), dataset, true, true,
                    false);
            // 设置图表背景图颜色
            if (null != config.getBackgroundColor()) {
                pieChar.getPlot().setBackgroundPaint(config.getBackgroundColor());
            }
            // 设置图表边框的颜色
            if (null != config.getOutlineColor()) {
                pieChar.getPlot().setOutlinePaint(config.getOutlineColor());
            }
            // 设置图表背景图
            if (null != config.getBackgroundImage()) {
                pieChar.getPlot().setBackgroundImage(config.getBackgroundImage());
            }
    
            try {
                ChartUtilities.saveChartAsJPEG(new File(outputFile), pieChar, config.getWidth(),
                        config.getHeight());
    
                return true;
            } catch (IOException e) {
                return false;
            }
        }
    
        public static boolean drawSpiderChart(JFreeChartConfig config, DefaultCategoryDataset dataset,
                                              String outputFile) {
            MySpiderWebPlot spiderwebPlot = new MySpiderWebPlot(dataset);
            JFreeChart jfreechart = new JFreeChart(config.getTitle(), TextTitle.DEFAULT_FONT, spiderwebPlot, false);
            LegendTitle legendtitle = new LegendTitle(spiderwebPlot);
            legendtitle.setPosition(RectangleEdge.BOTTOM);
            jfreechart.addSubtitle(legendtitle);
    
            try {
                ChartUtilities.saveChartAsJPEG(new File(outputFile), jfreechart, config.getWidth(), config.getHeight());
            } catch (IOException e) {
                e.printStackTrace();
            }
    
            return true;
        }
    
        public static void main(String[] args) throws IOException {
            // 绘制条形图
            final String price = "price";
            final String number = "number";
            final String type = "type";
            DefaultCategoryDataset dataset = new DefaultCategoryDataset();
            dataset.addValue(1.1, "Guitar", price);
            dataset.addValue(5, "Guitar", type);
            dataset.addValue(7, "Guitar", number);
    
            dataset.addValue(0.9, "Piano", price);
            dataset.addValue(3, "Piano", type);
            dataset.addValue(3, "Piano", number);
    
            dataset.addValue(0.6, "Drum", price);
            dataset.addValue(2, "Drum", type);
            dataset.addValue(1, "Drum", number);
    
            dataset.addValue(0.8, "Bass", price);
            dataset.addValue(5, "Bass", type);
            dataset.addValue(6, "Bass", number);
    
            JFreeChartConfig config = new JFreeChartConfig();
            config.setTitle("Instrument");
            config.setCategoryAxisLabel("category");
            config.setValueAxisLabel("value");
            config.setWidth(640);
            config.setHeight(480);
            Color outlineColor = SystemColor.WHITE;
            Color backgroundColor = SystemColor.WHITE;
            BufferedImage bufferedImage = ImageIO.read(new FileInputStream("D:/temp/小狗1.jpg"));
            config.setOutlineColor(outlineColor);
            config.setBackgroundColor(backgroundColor);
            config.setBackgroundImage(bufferedImage);
            String barChartFile = "D:/temp/barChart.jpeg";
            boolean barChartResult = drawBarChart(config, dataset, barChartFile);
            System.out.println(barChartResult);
    
            // 绘制折线图
            DefaultCategoryDataset lineChartDataset = new DefaultCategoryDataset();
            lineChartDataset.addValue(2000, "Fender tele", "1970");
            lineChartDataset.addValue(3000, "Fender tele", "1980");
            lineChartDataset.addValue(5000, "Fender tele", "1990");
            lineChartDataset.addValue(7000, "Fender tele", "2000");
            lineChartDataset.addValue(10000, "Fender tele", "2010");
            lineChartDataset.addValue(11400, "Fender tele", "2018");
    
            JFreeChartConfig lineConfig = new JFreeChartConfig();
            lineConfig.setTitle("乐器");
            lineConfig.setCategoryAxisLabel("价格");
            lineConfig.setValueAxisLabel("金额");
            lineConfig.setWidth(640);
            lineConfig.setHeight(480);
            String lineChartFile = "/temp/lineChart.png";
            boolean lineChartResult = drawLineChart(lineConfig, lineChartDataset, lineChartFile);
            System.out.println(lineChartResult);
    
            // 绘制饼图
            JFreeChartConfig pieConfig = new JFreeChartConfig();
            pieConfig.setTitle("乐器");
            pieConfig.setCategoryAxisLabel("种类");
            pieConfig.setValueAxisLabel("数量");
            pieConfig.setWidth(640);
            pieConfig.setHeight(480);
    
            DefaultPieDataset pieDataset = new DefaultPieDataset();
            pieDataset.setValue("吉他", 40);
            pieDataset.setValue("钢琴", 20);
            pieDataset.setValue("架子鼓", 10);
            pieDataset.setValue("贝斯", 30);
    
            String pieChartFile = "/temp/pieChart.png";
            boolean pieChartResult = drawPieChart(pieConfig, pieDataset, pieChartFile);
            System.out.println(pieChartResult);
    
            // 绘制雷达图
            JFreeChartConfig spiderConfig = new JFreeChartConfig();
            spiderConfig.setTitle("水果产量");
            spiderConfig.setWidth(640);
            spiderConfig.setHeight(480);
            DefaultCategoryDataset spiderDataset = new DefaultCategoryDataset();
            String apple = "apple";
            String banana = "banana";
            spiderDataset.addValue(5, apple, "1月");
            spiderDataset.addValue(6, apple, "2月");
            spiderDataset.addValue(2, apple, "3月");
            spiderDataset.addValue(3, apple, "4月");
            spiderDataset.addValue(7, apple, "5月");
            spiderDataset.addValue(4, apple, "6月");
            spiderDataset.addValue(2, banana, "1月");
            spiderDataset.addValue(5, banana, "2月");
            spiderDataset.addValue(4, banana, "3月");
            spiderDataset.addValue(5, banana, "4月");
            spiderDataset.addValue(8, banana, "5月");
            spiderDataset.addValue(9, banana, "6月");
            boolean spiderChartResult = JFreeChartUtil.drawSpiderChart(spiderConfig, spiderDataset, "/temp/spiderChart.png");
            System.out.println(spiderChartResult);
        }
    
    }
    
    

    依赖模型

    
    import java.awt.*;
    
    /**
     *
     * @author wangzhongxing
     * @version $Id: JFreeChartConfig.java, v 0.1 2019年03月26日 4:32 PM wangzhongxing Exp $
     */
    public class JFreeChartConfig {
    
        /**
         * 图表主题
         */
        private String title;
        /**
         * 图表横坐标标题
         */
        private String categoryAxisLabel;
        /**
         * 图表纵坐标标题
         */
        private String valueAxisLabel;
        /**
         * 图表宽度
         */
        private int    width;
        /**
         * 图表高度
         */
        private int    height;
        /**
         * 图表边框颜色
         */
        private Color  outlineColor;
        /**
         * 背景颜色
         */
        private Color  backgroundColor;
        /**
         * 背景图
         */
        private Image  backgroundImage;
    
        public String getTitle() {
            return title;
        }
    
        public void setTitle(String title) {
            this.title = title;
        }
    
        public String getCategoryAxisLabel() {
            return categoryAxisLabel;
        }
    
        public void setCategoryAxisLabel(String categoryAxisLabel) {
            this.categoryAxisLabel = categoryAxisLabel;
        }
    
        public String getValueAxisLabel() {
            return valueAxisLabel;
        }
    
        public void setValueAxisLabel(String valueAxisLabel) {
            this.valueAxisLabel = valueAxisLabel;
        }
    
        public int getWidth() {
            return width;
        }
    
        public void setWidth(int width) {
            this.width = width;
        }
    
        public int getHeight() {
            return height;
        }
    
        public void setHeight(int height) {
            this.height = height;
        }
    
        public Color getOutlineColor() {
            return outlineColor;
        }
    
        public void setOutlineColor(Color outlineColor) {
            this.outlineColor = outlineColor;
        }
    
        public Color getBackgroundColor() {
            return backgroundColor;
        }
    
        public void setBackgroundColor(Color backgroundColor) {
            this.backgroundColor = backgroundColor;
        }
    
        public Image getBackgroundImage() {
            return backgroundImage;
        }
    
        public void setBackgroundImage(Image backgroundImage) {
            this.backgroundImage = backgroundImage;
        }
    }
    

    雷达图依赖方法

    该方法是引用别人的,原文连接: https://blog.51cto.com/wangjierui/116845

    package com.wangzhongxing.springcloud.common.utils;
    
    import org.jfree.chart.plot.SpiderWebPlot;
    import org.jfree.data.category.CategoryDataset;
    
    import java.awt.*;
    import java.awt.font.FontRenderContext;
    import java.awt.font.LineMetrics;
    import java.awt.geom.*;
    import java.text.NumberFormat;
    
    
    public class MySpiderWebPlot extends SpiderWebPlot {
        private static final long serialVersionUID = -7763566751166048449L;
        private int ticks = DEFAULT_TICKS;
        private static final int DEFAULT_TICKS = 5;
        private NumberFormat format = NumberFormat.getInstance();
        private static final double PERPENDICULAR = 90;
        private static final double TICK_SCALE = 0.015;
        private int valueLabelGap = DEFAULT_GAP;
        private static final int DEFAULT_GAP = 10;
        private static final double THRESHOLD = 15;
    
        MySpiderWebPlot(CategoryDataset createCategoryDataset) {
            super(createCategoryDataset);
        }
    
        @Override
        protected void drawLabel(final Graphics2D g2, final Rectangle2D plotArea, final double value,
                                 final int cat, final double startAngle, final double extent) {
            super.drawLabel(g2, plotArea, value, cat, startAngle, extent);
            final FontRenderContext frc = g2.getFontRenderContext();
            final double[] transformed = new double[2];
            final double[] transformer = new double[2];
            final Arc2D arc1 = new Arc2D.Double(plotArea, startAngle, 0, Arc2D.OPEN);
    
            for (int i = 1; i <= ticks; i++) {
    
                final Point2D point1 = arc1.getEndPoint();
    
                final double deltaX = plotArea.getCenterX();
                final double deltaY = plotArea.getCenterY();
                double labelX = point1.getX() - deltaX;
                double labelY = point1.getY() - deltaY;
    
                final double scale = ((double) i / (double) ticks);
                final AffineTransform tx = AffineTransform.getScaleInstance(scale, scale);
                final AffineTransform pointTrans = AffineTransform.getScaleInstance(scale + TICK_SCALE, scale + TICK_SCALE);
                transformer[0] = labelX;
                transformer[1] = labelY;
                pointTrans.transform(transformer, 0, transformed, 0, 1);
                final double pointX = transformed[0] + deltaX;
                final double pointY = transformed[1] + deltaY;
                tx.transform(transformer, 0, transformed, 0, 1);
                labelX = transformed[0] + deltaX;
                labelY = transformed[1] + deltaY;
    
    
                double rotated = (PERPENDICULAR);
    
                AffineTransform rotateTrans = AffineTransform.getRotateInstance(Math.toRadians(rotated), labelX, labelY);
                transformer[0] = pointX;
                transformer[1] = pointY;
                rotateTrans.transform(transformer, 0, transformed, 0, 1);
                final double x1 = transformed[0];
                final double y1 = transformed[1];
    
                rotated = (-PERPENDICULAR);
                rotateTrans = AffineTransform.getRotateInstance(Math.toRadians(rotated), labelX, labelY);
    
                rotateTrans.transform(transformer, 0, transformed, 0, 1);
    
                final Composite saveComposite = g2.getComposite();
                g2.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 1.0f));
    
                g2.draw(new Line2D.Double(transformed[0], transformed[1], x1, y1));
    
                if (startAngle == this.getStartAngle()) {
                    final String label = format.format(((double) i / (double) ticks) * this.getMaxValue());
                    final Rectangle2D labelBounds = getLabelFont().getStringBounds(label, frc);
    
    
                    final LineMetrics lm = getLabelFont().getLineMetrics(label, frc);
                    final double ascent = lm.getAscent();
                    if (Math.abs(labelX - plotArea.getCenterX()) < THRESHOLD) {
                        labelX += valueLabelGap;
                        labelY += ascent / (float) 2;
                    } else if (Math.abs(labelY - plotArea.getCenterY()) < THRESHOLD) {
                        labelY += valueLabelGap;
                    } else if (labelX >= plotArea.getCenterX()) {
                        if (labelY < plotArea.getCenterY()) {
                            labelX += valueLabelGap;
                            labelY += valueLabelGap;
                        } else {
                            labelX -= valueLabelGap;
                            labelY += valueLabelGap;
                        }
                    } else {
                        if (labelY > plotArea.getCenterY()) {
                            labelX -= valueLabelGap;
                            labelY -= valueLabelGap;
                        } else {
                            labelX += valueLabelGap;
                            labelY -= valueLabelGap;
                        }
                    }
                    g2.setPaint(getLabelPaint());
                    g2.setFont(getLabelFont());
                    g2.drawString(label, (float) labelX, (float) labelY);
                }
                g2.setComposite(saveComposite);
            }
        }
    }
    

    生成图片样例

    柱状图

    在这里插入图片描述

    折线图

    在这里插入图片描述

    饼图

    在这里插入图片描述

    雷达图

    在这里插入图片描述

    展开全文
  • Java绘制图表的工具——JFreeChart 说明: JFreeChart是java的一个绘图工具,需要的jar包有jcommon.jar和jfreechart.jar。 以下的例子是柱状图、时间序列折线图和饼状图的使用方法。 案例: package com.test; ...

    Java绘制图表的工具——JFreeChart

    说明:

    JFreeChart是java的一个绘图工具,需要的jar包有jcommon.jar和jfreechart.jar。

    以下的例子是柱状图、时间序列折线图和饼状图的使用方法。

    案例:

    package com.test;
    
    import java.awt.Font;
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.text.ParseException;
    import java.text.SimpleDateFormat;
    import java.util.Date;
    
    import org.jfree.chart.ChartFactory;
    import org.jfree.chart.ChartUtilities;
    import org.jfree.chart.JFreeChart;
    import org.jfree.chart.StandardChartTheme;
    import org.jfree.chart.plot.PlotOrientation;
    import org.jfree.data.category.DefaultCategoryDataset;
    import org.jfree.data.general.DefaultPieDataset;
    import org.jfree.data.time.Day;
    import org.jfree.data.time.TimeSeries;
    import org.jfree.data.time.TimeSeriesCollection;
    import org.jfree.data.time.TimeSeriesDataItem;
    
    public class Test {
    	public static void main(String[] args) {
    		setLanguageCN();
    		testBar();
    		testLine();
    		testPie();
    	}
    
    	/**
    	 * 设置语言,防止中文乱码
    	 */
    	public static void setLanguageCN() {
    		// 创建主题样式
    		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);
    	}
    
    	/**
    	 * 测试柱状图
    	 */
    	public static void testBar() {
    		DefaultCategoryDataset dataSet = new DefaultCategoryDataset();
    		dataSet.setValue(123, "a", "苹果");
    		dataSet.setValue(321, "b", "葡萄");
    		dataSet.setValue(456, "c", "香蕉");
    		dataSet.setValue(654, "d", "西瓜");
    		JFreeChart chart = ChartFactory.createBarChart("水果销量统计表", "水果种类", "销量", dataSet, PlotOrientation.HORIZONTAL,
    				true, true, true);
    		FileOutputStream out = null;
    		try {
    			out = new FileOutputStream("C:\\coding\\JavaWeb\\TestJFreeChart\\WebContent\\imgs\\testBar.jpg");
    			ChartUtilities.writeChartAsJPEG(out, 0.5f, chart, 1200, 900, null);
    		} catch (FileNotFoundException e) {
    			e.printStackTrace();
    		} catch (IOException e) {
    			e.printStackTrace();
    		} finally {
    			try {
    				out.close();
    			} catch (Exception ex) {
    				ex.printStackTrace();
    			}
    		}
    	}
    
    	/**
    	 * 测试时间序列的折线图
    	 */
    	public static void testLine() {
    		TimeSeries ts = new TimeSeries("测试例子");
    		ts.add(new TimeSeriesDataItem(new Day(string2Date("2020-05-01")), new Double(Math.random() * 100)));
    		ts.add(new TimeSeriesDataItem(new Day(string2Date("2020-05-02")), new Double(Math.random() * 100)));
    		ts.add(new TimeSeriesDataItem(new Day(string2Date("2020-05-03")), new Double(Math.random() * 100)));
    		ts.add(new TimeSeriesDataItem(new Day(string2Date("2020-05-04")), new Double(Math.random() * 100)));
    		ts.add(new TimeSeriesDataItem(new Day(string2Date("2020-05-05")), new Double(Math.random() * 100)));
    		ts.add(new TimeSeriesDataItem(new Day(string2Date("2020-05-06")), new Double(Math.random() * 100)));
    		ts.add(new TimeSeriesDataItem(new Day(string2Date("2020-05-07")), new Double(Math.random() * 100)));
    		ts.add(new TimeSeriesDataItem(new Day(string2Date("2020-05-08")), new Double(Math.random() * 100)));
    
    		TimeSeriesCollection dataSet = new TimeSeriesCollection();
    		dataSet.addSeries(ts);
    		JFreeChart chart = ChartFactory.createTimeSeriesChart("某软件用户数量变化", "日期", "用户数量", dataSet, true, true, false);
    		FileOutputStream out = null;
    		try {
    			out = new FileOutputStream("C:\\coding\\JavaWeb\\TestJFreeChart\\WebContent\\imgs\\testLine.jpg");
    			ChartUtilities.writeChartAsJPEG(out, 0.5f, chart, 1200, 900, null);
    		} catch (FileNotFoundException e) {
    			e.printStackTrace();
    		} catch (IOException e) {
    			e.printStackTrace();
    		} finally {
    			try {
    				out.close();
    			} catch (Exception ex) {
    				ex.printStackTrace();
    			}
    		}
    	}
    
    	/**
    	 * 测试饼状图
    	 */
    	public static void testPie() {
    		DefaultPieDataset dataSet = new DefaultPieDataset();
    		dataSet.setValue("西瓜", 100);
    		dataSet.setValue("苹果", 80);
    		dataSet.setValue("梨子", 120);
    		dataSet.setValue("香蕉", 300);
    		JFreeChart chart = ChartFactory.createPieChart("水果销量统计表", dataSet, true, true, true);
    		FileOutputStream out = null;
    		try {
    			out = new FileOutputStream("C:\\coding\\JavaWeb\\TestJFreeChart\\WebContent\\imgs\\testPie.jpg");
    			ChartUtilities.writeChartAsJPEG(out, 0.5f, chart, 1200, 900, null);
    		} catch (FileNotFoundException e) {
    			e.printStackTrace();
    		} catch (IOException e) {
    			e.printStackTrace();
    		} finally {
    			try {
    				out.close();
    			} catch (Exception ex) {
    				ex.printStackTrace();
    			}
    		}
    
    	}
    
    	/**
    	 * 将日期字符串转为Date对象
    	 * 
    	 * @param date 日期字符串
    	 * @return Date对象
    	 */
    	private static Date string2Date(String date) {
    		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
    		Date day = null;
    		try {
    			day = sdf.parse(date);
    		} catch (ParseException e) {
    			e.printStackTrace();
    		}
    		return day;
    	}
    
    }
    
    

    结果如下图:
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    展开全文
  • java绘制图表(柱状图、饼图、折线图)包, jfreechart
  • java 图表_Java绘制图表

    2021-02-27 07:56:54
    import java.awt.*;import java.io.File;import java.io.IOException;import org.jfree.chart.ChartFactory;import org.jfree.chart.ChartUtilities;import org.jfree.chart.JFreeChart;import org.jfree.chart.plot...

    import java.awt.*;

    import java.io.File;

    import java.io.IOException;

    import org.jfree.chart.ChartFactory;

    import org.jfree.chart.ChartUtilities;

    import org.jfree.chart.JFreeChart;

    import org.jfree.chart.plot.PlotOrientation;

    import org.jfree.data.category.DefaultCategoryDataset;

    import org.jfree.data.general.DefaultPieDataset;

    /**

    * 绘制图表工具类

    *

    * @author wangzhongxing

    * @version $Id: JFreeChartUtil.java, v 0.1 2019年03月25日 8:06 PM wangzhongxing Exp $

    */

    public class JFreeChartUtil {

    /**

    * 绘制条形图,并生成图片

    * @param config 图表配置参数

    * @param dataset 图表内容数据

    * @param outputFile 输出图片路径

    * @return

    */

    public static boolean drawBarChart(JFreeChartConfig config, DefaultCategoryDataset dataset,

    String outputFile) {

    JFreeChart barChart = ChartFactory.createBarChart(config.getTitle(),

    config.getCategoryAxisLabel(), config.getValueAxisLabel(), dataset,

    PlotOrientation.VERTICAL, true, true, false);

    // 设置图片背景图为白色

    barChart.getPlot().setBackgroundPaint(SystemColor.WHITE);

    try {

    ChartUtilities.saveChartAsJPEG(new File(outputFile), barChart, config.getWidth(),

    config.getHeight());

    return true;

    } catch (IOException e) {

    return false;

    }

    }

    /**

    * 绘制折线图,并生成图片

    * @param config 图表配置参数

    * @param dataset 图表内容数据

    * @param outputFile 输出图片路径

    * @return

    */

    public static boolean drawLineChart(JFreeChartConfig config, DefaultCategoryDataset dataset,

    String outputFile) {

    JFreeChart lineChartObject = ChartFactory.createLineChart(config.getTitle(),

    config.getCategoryAxisLabel(), config.getValueAxisLabel(), dataset,

    PlotOrientation.VERTICAL, true, true, false);

    // 设置图片背景图为白色

    lineChartObject.getPlot().setBackgroundPaint(SystemColor.WHITE);

    File lineChart = new File(outputFile);

    try {

    ChartUtilities.saveChartAsJPEG(lineChart, lineChartObject, config.getWidth(),

    config.getHeight());

    return true;

    } catch (IOException e) {

    return false;

    }

    }

    /**

    * 绘制饼图,并生成图片

    * @param config 图表配置参数

    * @param dataset 图表内容数据

    * @param outputFile 输出图片路径

    * @return

    */

    public static boolean drawPieChart(JFreeChartConfig config, DefaultPieDataset dataset,

    String outputFile) {

    JFreeChart pieChar = ChartFactory.createPieChart(config.getTitle(), dataset, true, true,

    false);

    // 设置图片背景图为白色

    pieChar.getPlot().setBackgroundPaint(SystemColor.WHITE);

    File pieChart = new File(outputFile);

    try {

    ChartUtilities.saveChartAsJPEG(pieChart, pieChar, config.getWidth(),

    config.getHeight());

    return true;

    } catch (IOException e) {

    return false;

    }

    }

    public static void main(String[] args) {

    // 绘制条形图

    final String fiat = "FIAT";

    final String audi = "AUDI";

    final String ford = "FORD";

    final String speed = "Speed";

    final String millage = "Millage";

    final String userrating = "User Rating";

    final String safety = "safety";

    DefaultCategoryDataset dataset = new DefaultCategoryDataset();

    dataset.addValue(1.0, fiat, speed);

    dataset.addValue(3.0, fiat, userrating);

    dataset.addValue(5.0, fiat, millage);

    dataset.addValue(5.0, fiat, safety);

    dataset.addValue(5.0, audi, speed);

    dataset.addValue(6.0, audi, userrating);

    dataset.addValue(10.0, audi, millage);

    dataset.addValue(4.0, audi, safety);

    dataset.addValue(4.0, ford, speed);

    dataset.addValue(2.0, ford, userrating);

    dataset.addValue(3.0, ford, millage);

    dataset.addValue(6.0, ford, safety);

    JFreeChartConfig config = new JFreeChartConfig();

    config.setTitle("title");

    config.setCategoryAxisLabel("categoryAxisLabel");

    config.setValueAxisLabel("valueAxisLabel");

    config.setWidth(640);

    config.setHeight(480);

    String barChartFile = "/Users/wangzhongxing/Downloads/barChart.jpeg";

    boolean barChartResult = drawBarChart(config, dataset, barChartFile);

    System.out.println(barChartResult);

    // 绘制折线图

    String lineChartFile = "/Users/wangzhongxing/Downloads/lineChart.png";

    boolean lineChartResult = drawLineChart(config, dataset, lineChartFile);

    System.out.println(lineChartResult);

    // 绘制饼图

    DefaultPieDataset pieDataset = new DefaultPieDataset();

    pieDataset.setValue("IPhone 5s", new Double(20));

    pieDataset.setValue("SamSung Grand", new Double(20));

    pieDataset.setValue("MotoG", new Double(40 ) );

    pieDataset.setValue("Nokia Lumia", new Double(10));

    String pieChartFile = "/Users/wangzhongxing/Downloads/pieChart.png";

    boolean pieChartResult = drawPieChart(config, pieDataset, pieChartFile);

    System.out.println(pieChartResult);

    }

    }

    展开全文
  • Java绘制图表(柱状图、饼图):开放的图表绘制类库JfreeChart(Servlet篇)操作步骤:实例1:BarChart(柱状图)实例2:PieChart(饼图) 操作步骤: 1、新建Dynamic Web项目。 2、导入JFreeChart所需的jar包。 ...

    Java绘制图表(柱状图、饼图、折线图(时间序列操作)):开放的图表绘制类库JfreeChart(Servlet篇)

    操作步骤:

    1、新建Dynamic Web项目。
    2、导入JFreeChart所需的jar包。
    3、在web.xml文件中配置servlet(根据请求调用JFreeChart显示图表的DisplayChart类)。
    4、编写生成图表的Java类。
    <1>建立数据集(DefaultCategoryDataSet、等方式)。
    <2>使用JFreeChart的工厂类根据数据集生成图表。
    <3>使用ServletUtilities工具类的saveChartAsPNG()方法生成图表的png图片文件名(即fileName)。
    5、根据servlet中配置的jsp页面名称新建jsp页面,在页面中请求第4步中的Java类得到fileName进行显示图表。
    6、部署该项目到tomcat服务器,在浏览器请求jsp页面即可。

    实例1:BarChart(柱状图)

    1、新建Dynamic Web项目。

    关于web项目创建后WEB-INF下面没有出现web.xml的解决方法https://blog.csdn.net/weixin_43209201/article/details/86607913

    2、导入JFreeChart所需的jar包。

    jar包下载地址:https://sourceforge.net/projects/jfreechart/files/

    下载的压缩包解压后在下图所示路径寻找jar包:
    在这里插入图片描述
    将jar包导入项目中(复制粘贴即可),有的jar包可能用不到,为了方便这几全部导入了:
    在这里插入图片描述
    3、在web.xml文件中配置servlet(根据请求调用JFreeChart显示图表的DisplayChart类)。代码如下:

    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    	xmlns="http://xmlns.jcp.org/xml/ns/javaee"
    	xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
    	version="4.0">
    	<display-name>JFreeChart_Demo</display-name>
    	<welcome-file-list>
    		<welcome-file>index.html</welcome-file>
    		<welcome-file>index.htm</welcome-file>
    		<welcome-file>index.jsp</welcome-file>
    		<welcome-file>default.html</welcome-file>
    		<welcome-file>default.htm</welcome-file>
    		<welcome-file>default.jsp</welcome-file>
    	</welcome-file-list>
    
    	<servlet>
    		<servlet-name>DisplayChart</servlet-name>
    		<servlet-class>org.jfree.chart.servlet.DisplayChart</servlet-class>
    	</servlet>
    	<servlet-mapping>
    		<servlet-name>DisplayChart</servlet-name>
    		<url-pattern>/displayChart</url-pattern>
    	</servlet-mapping>
    </web-app>
    

    4、编写生成图表的Java类。
    <1>建立数据集(DefaultCategoryDataSet、等方式)。
    <2>使用JFreeChart的工厂类根据数据集生成图表。
    <3>使用ServletUtilities工具类的saveChartAsPNG()方法生成图表的png图片,返回图片的文件名(即fileName)。代码如下:

    这里根据Dataset的不同封装方式采用两种实现方式,分别为使用DefaultCategoryDataset类生成柱状图和使用DatasetUtilities工具类生成柱状图并进行美化。

    使用DefaultCategoryDataset类生成柱状图:

    package chart;
    
    import java.awt.Font;
    import java.io.IOException;
    
    import javax.servlet.http.HttpSession;
    
    import org.jfree.chart.ChartFactory;
    import org.jfree.chart.JFreeChart;
    import org.jfree.chart.StandardChartTheme;
    import org.jfree.chart.servlet.ServletUtilities;
    import org.jfree.data.category.DefaultCategoryDataset;
    
    /**
     * 使用DefaultCategoryDataset类生成柱状图
     * 
     * @author lingtouyang的csdn博客 ▄┻┳═一 ☆
     *
     */
    public class BarChart_ByDefaultCategoryDataset {
    
    	public static String generateBarChart(HttpSession session) throws IOException {
    
    		/**
    		 * 以下代码通过设置主题样式解決中文乱码问题
    		 */
    		// 创建主题样式
    		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);
    
    		// 采用默认类别数据集采集数据
    		DefaultCategoryDataset defaultDataSet = new DefaultCategoryDataset();
    		defaultDataSet.setValue(9.89, "抖音用户占比", "广东省");// 数据 比较的内容 比较的分类
    		defaultDataSet.setValue(7.21, "抖音用户占比", "江苏省");
    		defaultDataSet.setValue(6.90, "抖音用户占比", "山东省");
    		defaultDataSet.setValue(5.85, "抖音用户占比", "河南省");
    		defaultDataSet.setValue(5.49, "抖音用户占比", "浙江省");
    		// 调用ChartFactory工厂类生成3D柱状图
    		JFreeChart barChart = ChartFactory.createBarChart3D("抖音用户地域分布占比TOP5", // 柱状图标题
    				"地区", // 比较的分类标签
    				"所占比(单位:%)", // 比较的内容标签
    				defaultDataSet // 数据集
    		);
    		// 使用ServletUtilities将工厂类生成的图表保存为png图片
    		String fileName = ServletUtilities.saveChartAsPNG(barChart, // 工厂类生成的图表
    				700, // 要生成图片宽度
    				500, // 要生成图片的高度
    				session // HttpSession
    		);
    
    		// 返回图片的文件名
    		return fileName;
    
    	}
    
    }
    

    使用DatasetUtilities工具类生成柱状图并进行美化:

    package chart;
    
    import java.awt.Color;
    import java.awt.Font;
    import java.io.IOException;
    
    import javax.servlet.http.HttpSession;
    
    import org.jfree.chart.ChartFactory;
    import org.jfree.chart.JFreeChart;
    import org.jfree.chart.StandardChartTheme;
    import org.jfree.chart.labels.ItemLabelAnchor;
    import org.jfree.chart.labels.ItemLabelPosition;
    import org.jfree.chart.labels.StandardCategoryItemLabelGenerator;
    import org.jfree.chart.plot.CategoryPlot;
    import org.jfree.chart.plot.PlotOrientation;
    import org.jfree.chart.renderer.category.BarRenderer3D;
    import org.jfree.chart.servlet.ServletUtilities;
    import org.jfree.data.category.CategoryDataset;
    import org.jfree.data.general.DatasetUtilities;
    import org.jfree.ui.TextAnchor;
    
    /**
     * 使用DatasetUtilities工具类生成柱状图并进行美化
     * 
     * @author lingtouyang的csdn博客 ▄┻┳═一 ☆
     *
     */
    public class BarChart_ByDatasetUtilities {
    
    	public static String generateBarChart(HttpSession session) throws IOException {
    		/**
    		 * 以下代码通过设置主题样式解決中文乱码问题
    		 */
    		// 创建主题样式
    		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);
    
    		double[][] data = new double[][] { { 1310, 720, 1130, 440 }, { 1220, 700, 1020, 400 }, { 1110, 680, 980, 360 },
    				{ 1000, 640, 800, 600 } };
    		String[] rowKeys = new String[] { "猪肉", "牛肉", "鸡肉", "鱼肉" };
    		String[] columnKeys = new String[] { "广州", "深圳", "东莞", "佛山" };
    		// 利用DatasetUtilities工具类创建CategoryDataset
    		CategoryDataset dataSet = DatasetUtilities.createCategoryDataset(rowKeys, // 比较的内容数组(肉类)
    				columnKeys, // 比较的分类数组(地区分类)
    				data // 比较的数据
    		);
    		// 调用ChartFactory工厂类生成3D柱状图
    		JFreeChart barChart = ChartFactory.createBarChart("肉类销量统计图", // 图表的标题
    				"地区", // 比较的分类标签
    				"销量", // 比较的内容标签
    				dataSet, // 比较的数据集
    //    		PlotOrientation.HORIZONTAL,		//图表显示方向:水平方向
    				PlotOrientation.VERTICAL, // 图表显示方向:垂直方向(默认)
    				true, // a flag specifying whether or not a legend is required
    				true, // configure chart to generate tool tips
    				true // configure chart to generate URLs
    		);
    
    		/**
    		 * 设置图表样式:通过matlab的plot()函数设置图表样式,使得图表更加美观
    		 */
    		CategoryPlot plot = barChart.getCategoryPlot();
    		// 设置网格背景颜色
    		plot.setBackgroundPaint(Color.WHITE);
    		// 设置网格竖线颜色
    		plot.setDomainGridlinePaint(Color.PINK);
    		// 设置网格横线颜色
    		plot.setRangeGridlinePaint(Color.pink);
    
    		// 显示每个柱的数值,并修改数值的字体属性(renderer渲染器)
    		BarRenderer3D renderer = new BarRenderer3D();
    		renderer.setBaseItemLabelGenerator(new StandardCategoryItemLabelGenerator());
    		renderer.setBaseItemLabelsVisible(true);
    
    		renderer.setBasePositiveItemLabelPosition(
    				new ItemLabelPosition(ItemLabelAnchor.OUTSIDE12, TextAnchor.BASELINE_LEFT));
    		renderer.setItemLabelAnchorOffset(10D);
    
    		// 设置平行柱之间的间距
    		renderer.setItemMargin(0.4);
    		// 将样式应用到CategoryPlot
    		plot.setRenderer(renderer);
    
    		// 使用ServletUtilities将工厂类生成的图表保存为png图片
    		String fileName = ServletUtilities.saveChartAsPNG(barChart, // 工厂类生成的图表
    				700, // 要生成图片宽度
    				500, // 要生成图片的高度
    				session // HttpSession
    		);
    
    		// 返回图片的文件名
    		return fileName;
    	}
    }
    
    

    5、根据servlet中配置的jsp页面名称新建jsp页面,在页面中请求第4步中的Java类得到fileName进行显示图表。
    barChart_ByDefaultCategoryDataset.jsp:

    <%@page import="chart.BarChart_ByDefaultCategoryDataset"%>    <!-- 注意导包 -->
    <%@ page language="java" contentType="text/html; charset=UTF-8"
    	pageEncoding="UTF-8"%>
    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="UTF-8">
    <title>Insert title here</title>
    </head>
    <body>
    	<%
    		String fileName = BarChart_ByDefaultCategoryDataset.generateBarChart(session); //调用生成图表的Java类,返回柱状图png文件的文件名
    	%>
    	<!--设置图片路径:(servlet的url-pattern)?filename=(上面获取的文件名fileName)  -->
    	<img src="displayChart?filename=<%=fileName%>" width="700"
    		height="500" border="0">
    </body>
    </html>
    

    barChart_ByDatasetUtilities.jsp:

    <%@page import="chart.BarChart_ByDatasetUtilities"%>
    <%@ page language="java" contentType="text/html; charset=UTF-8"
    	pageEncoding="UTF-8"%>
    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="UTF-8">
    <title>Insert title here</title>
    </head>
    <body>
    	<%
    		String fileName = BarChart_ByDatasetUtilities.generateBarChart(session); //调用生成图表的Java类,返回柱状图png文件的文件名
    	%>
    	<!--设置图片路径:(servlet的url-pattern)?filename=(上面获取的文件名fileName)  -->
    	<img src="displayChart?filename=<%=fileName%>" width="700"
    		height="500" border="0">
    </body>
    </html>
    

    6、部署该项目到tomcat服务器,在浏览器请求对应的jsp页面即可。
    使用DefaultCategoryDataset类生成柱状图效果图如下:
    在这里插入图片描述
    使用DatasetUtilities工具类生成柱状图效果图如下:
    在这里插入图片描述
    使用DatasetUtilities工具类生成柱状图并进行美化后的效果图如下:
    在这里插入图片描述

    实例2:PieChart(饼图)

    与实例1柱状图的生成类似的步骤
    1、新建Dynamic Web项目。
    2、导入JFreeChart所需的jar包。
    3、在web.xml文件中配置servlet(根据请求调用JFreeChart显示图表的DisplayChart类)。代码如下:

    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    	xmlns="http://xmlns.jcp.org/xml/ns/javaee"
    	xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
    	version="4.0">
    	<display-name>JFreeChart_Demo</display-name>
    	<welcome-file-list>
    		<welcome-file>index.html</welcome-file>
    		<welcome-file>index.htm</welcome-file>
    		<welcome-file>index.jsp</welcome-file>
    		<welcome-file>default.html</welcome-file>
    		<welcome-file>default.htm</welcome-file>
    		<welcome-file>default.jsp</welcome-file>
    	</welcome-file-list>
    
    	<servlet>
    		<servlet-name>DisplayChart</servlet-name>
    		<servlet-class>org.jfree.chart.servlet.DisplayChart</servlet-class>
    	</servlet>
    	<servlet-mapping>
    		<servlet-name>DisplayChart</servlet-name>
    		<url-pattern>/displayChart</url-pattern>
    	</servlet-mapping>
    </web-app>
    

    4、编写生成图表的Java类。
    <1>建立数据集(DefaultCategoryDataSet、等方式)。
    <2>使用JFreeChart的工厂类根据数据集生成图表。
    <3>使用ServletUtilities工具类的saveChartAsPNG()方法生成图表的png图片,返回图片的文件名(即fileName)。
    这里根据拼图的2D和3D效果采用两种实现方式。代码分别如下:
    2D效果:

    package chart;
    
    import java.awt.Font;
    import java.text.NumberFormat;
    
    import javax.servlet.http.HttpSession;
    
    import org.jfree.chart.ChartFactory;
    import org.jfree.chart.JFreeChart;
    import org.jfree.chart.labels.StandardPieSectionLabelGenerator;
    import org.jfree.chart.plot.PiePlot;
    import org.jfree.chart.servlet.ServletUtilities;
    import org.jfree.chart.title.TextTitle;
    import org.jfree.data.general.DefaultPieDataset;
    /**
     * JFreeChart产生2D的饼图
     * 
     * @author lingtouyang的csdn博客 ▄┻┳═一 ☆
     *
     */
    public class PieChart_2D {
    
    	public static String generatePieChart(HttpSession session) throws Exception {
    
    		/**
    		 * 以下代码通过设置主题样式解決中文乱码问题
    		 */
    		// 创建主题样式
    		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);
    
    		// 采用默认类别数据集采集数据
    		DefaultPieDataset dataset = new DefaultPieDataset();
    		dataset.setValue("黑心矿难", 900);
    		dataset.setValue("醉酒驾驶", 800);
    		dataset.setValue("城管强拆", 400);
    		dataset.setValue("医疗事故", 100);
    		dataset.setValue("其他", 29);
    
    		// 调用ChartFactory工厂类生成饼图
    		JFreeChart chart = ChartFactory.createPieChart(
    				"2018年度非正常死亡人数分布图", // 图表的标题
    				dataset, // 比较的数据集
    				true, // a flag specifying whether or not a legend is required
    				true, // configure chart to generate tool tips
    				true // configure chart to generate URLs
    		);
    
    		// 设置副标题
    		chart.addSubtitle(new TextTitle("————此数据纯属虚构,无任何依据"));
    
    		/**
    		 * 设置图表样式:通过matlab的plot()函数设置图表样式,使得图表更加美观
    		 */
    		PiePlot pieplot = (PiePlot) chart.getPlot();
    		pieplot.setLabelFont(new Font("宋体", 0, 11));
    		// 设置饼图是圆的(true),还是椭圆的(false);默认为true
    		pieplot.setCircular(true);
    		// 没有数据的时候显示的内容
    		pieplot.setNoDataMessage("无数据显示");
    		StandardPieSectionLabelGenerator standarPieIG = new StandardPieSectionLabelGenerator("{0}:({1}.{2})",
    				NumberFormat.getNumberInstance(), NumberFormat.getPercentInstance());
    		pieplot.setLabelGenerator(standarPieIG);
    		// 设置突出显示
    		pieplot.setExplodePercent("城管强拆", 0.23);
    
    		// 使用ServletUtilities将工厂类生成的图表保存为png图片
    		String fileName = ServletUtilities.saveChartAsPNG(
    				chart, // 工厂类生成的图表
    				700, // 要生成图片宽度
    				500, // 要生成图片的高度
    				null, // 设置渲染器
    				session // HttpSession
    		);
    		// 返回图片的文件名
    		return fileName;
    	}
    }
    

    3D效果:

    package chart;
    
    import java.awt.Font;
    import java.text.NumberFormat;
    
    import javax.servlet.http.HttpSession;
    
    import org.jfree.chart.ChartFactory;
    import org.jfree.chart.JFreeChart;
    import org.jfree.chart.labels.StandardPieSectionLabelGenerator;
    import org.jfree.chart.plot.PiePlot;
    import org.jfree.chart.plot.PiePlot3D;
    import org.jfree.chart.servlet.ServletUtilities;
    import org.jfree.chart.title.TextTitle;
    import org.jfree.data.general.DefaultPieDataset;
    import org.jfree.util.Rotation;
    /**
     * JFreeChart产生3D的饼图
     * 
     * @author lingtouyang的csdn博客 ▄┻┳═一 ☆
     *
     */
    public class PieChart_3D {
    
    	public static String generatePieChart(HttpSession session) throws Exception {
    
    		/**
    		 * 以下代码通过设置主题样式解決中文乱码问题
    		 */
    		// 创建主题样式
    		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);
    		
    		// 采用默认类别数据集采集数据
    		DefaultPieDataset dataset = new DefaultPieDataset();
    		dataset.setValue("黑心矿难", 900);
    		dataset.setValue("醉酒驾驶", 800);
    		dataset.setValue("城管强拆", 400);
    		dataset.setValue("医疗事故", 100);
    		dataset.setValue("其他", 29);
    
    		// 调用ChartFactory工厂类生成饼图
    		JFreeChart chart = ChartFactory.createPieChart3D(
    				"2018年度非正常死亡人数分布图", // 图表的标题
    				dataset, // 比较的数据集
    				true, // a flag specifying whether or not a legend is required
    				true, // configure chart to generate tool tips
    				true // configure chart to generate URLs
    		);
    
    		// 设置副标题
    		chart.addSubtitle(new TextTitle("————此数据纯属虚构,无任何依据"));
    
    		/**
    		 * 设置图表样式:通过matlab的plot()函数设置图表样式,使得图表更加美观
    		 */
    		PiePlot pieplot = (PiePlot) chart.getPlot();
    		pieplot.setLabelFont(new Font("宋体", 0, 11));
    		// 设置饼图是圆的(true),还是椭圆的(false);默认为true
    		pieplot.setCircular(true);
    		// 没有数据的时候显示的内容
    		pieplot.setNoDataMessage("无数据显示");
    		StandardPieSectionLabelGenerator standarPieIG = new StandardPieSectionLabelGenerator(
    				"{0}:({1}.{2})",	//labelFormat the label format string (null notpermitted).
    				NumberFormat.getNumberInstance(),//numberFormat the format object for the values (nullnot permitted).
    				NumberFormat.getPercentInstance()//percentFormat the format object for the percentages(null not permitted).
    				);
    		pieplot.setLabelGenerator(standarPieIG);
    		// 设置突出显示无效的?
    		pieplot.setExplodePercent("城管强拆", 0.23);
    
    		// 设置3D显示样式
    		PiePlot3D pieplot3d = (PiePlot3D) chart.getPlot();
    		// 设置开始角度
    		pieplot3d.setStartAngle(120D);
    		// 设置方向为”顺时针方向“
    		pieplot3d.setDirection(Rotation.CLOCKWISE);
    		// 设置透明度,0.5F为半透明,1为不透明,0为全透明
    		pieplot3d.setForegroundAlpha(0.7F);
    
    		// 使用ServletUtilities将工厂类生成的图表保存为png图片
    		String fileName = ServletUtilities.saveChartAsPNG(
    				chart, // 工厂类生成的图表
    				700, // 要生成图片宽度
    				500, // 要生成图片的高度
    				null, // 设置渲染器
    				session // HttpSession
    		);
    		// 返回图片的文件名
    		return fileName;
    	}
    }
    

    5、根据servlet中配置的jsp页面名称新建jsp页面,在页面中请求第4步中的Java类得到fileName进行显示图表。代码如下:
    2D:

    <%@page import="chart.PieChart_2D"%>
    <%@ page language="java" contentType="text/html; charset=UTF-8"
    	pageEncoding="UTF-8"%>
    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="UTF-8">
    <title>Insert title here</title>
    </head>
    <body>
    	<%
    		String fileName = PieChart_2D.generatePieChart(session); //调用生成图表的Java类,返回饼图png文件的文件名
    	%>
    	<!--设置图片路径:(servlet的url-pattern)?filename=(上面获取的文件名fileName)  -->
    	<img src="displayChart?filename=<%=fileName%>" width="700" height="500"
    		border="0">
    </body>
    </html>
    

    3D:

    <%@page import="chart.PieChart_3D"%>
    <%@ page language="java" contentType="text/html; charset=UTF-8"
    	pageEncoding="UTF-8"%>
    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="UTF-8">
    <title>Insert title here</title>
    </head>
    <body>
    	<%
    		String fileName = PieChart_3D.generatePieChart(session); //调用生成图表的Java类,返回饼图png文件的文件名
    	%>
    	<!--设置图片路径:(servlet的url-pattern)?filename=(上面获取的文件名fileName)  -->
    	<img src="displayChart?filename=<%=fileName%>" width="700" height="500"
    		border="0">
    </body>
    </html>
    

    6、部署该项目到tomcat服务器,在浏览器请求相应的jsp页面即可。

    2D效果:
    在这里插入图片描述

    3D效果:
    在这里插入图片描述

    实例3:LineChart(折线图(包含对时间序列操作))

    与实例1柱状图的生成类似的步骤
    1、新建Dynamic Web项目。
    2、导入JFreeChart所需的jar包。
    3、在web.xml文件中配置servlet(根据请求调用JFreeChart显示图表的DisplayChart类)。代码如下:

    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    	xmlns="http://xmlns.jcp.org/xml/ns/javaee"
    	xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
    	version="4.0">
    	<display-name>JFreeChart_Demo</display-name>
    	<welcome-file-list>
    		<welcome-file>index.html</welcome-file>
    		<welcome-file>index.htm</welcome-file>
    		<welcome-file>index.jsp</welcome-file>
    		<welcome-file>default.html</welcome-file>
    		<welcome-file>default.htm</welcome-file>
    		<welcome-file>default.jsp</welcome-file>
    	</welcome-file-list>
    
    	<servlet>
    		<servlet-name>DisplayChart</servlet-name>
    		<servlet-class>org.jfree.chart.servlet.DisplayChart</servlet-class>
    	</servlet>
    	<servlet-mapping>
    		<servlet-name>DisplayChart</servlet-name>
    		<url-pattern>/displayChart</url-pattern>
    	</servlet-mapping>
    </web-app>
    

    4、编写生成图表的Java类。
    <1>建立数据集(DefaultCategoryDataSet、等方式)。
    <2>使用JFreeChart的工厂类根据数据集生成图表。
    <3>使用ServletUtilities工具类的saveChartAsPNG()方法生成图表的png图片,返回图片的文件名(即fileName)。代码如下:

    package chart;
    
    import java.awt.Font;
    
    import javax.servlet.http.HttpSession;
    
    import org.jfree.chart.ChartFactory;
    import org.jfree.chart.JFreeChart;
    import org.jfree.chart.axis.DateAxis;
    import org.jfree.chart.axis.DateTickUnit;
    import org.jfree.chart.labels.ItemLabelAnchor;
    import org.jfree.chart.labels.ItemLabelPosition;
    import org.jfree.chart.labels.StandardXYItemLabelGenerator;
    import org.jfree.chart.plot.XYPlot;
    import org.jfree.chart.renderer.xy.XYItemRenderer;
    import org.jfree.chart.renderer.xy.XYLineAndShapeRenderer;
    import org.jfree.chart.servlet.ServletUtilities;
    import org.jfree.chart.title.TextTitle;
    import org.jfree.data.time.Month;
    import org.jfree.data.time.TimeSeries;
    import org.jfree.data.time.TimeSeriesCollection;
    import org.jfree.ui.TextAnchor;
    
    /**
     * JFreeChart产生折线图
     * 
     * @author lingtouyang的csdn博客 ▄┻┳═一 ☆
     *
     */
    public class LineChart {
    	
    	public static String generateLineChart(HttpSession session)throws Exception{
    		/**
    		 * 以下代码通过设置主题样式解決中文乱码问题
    		 */
    		// 创建主题样式
    		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);
    
    		// 访问量统计
    		TimeSeries timeSeries=new TimeSeries("A网站访问量统计", Month.class);
    		// 添加数据
    		timeSeries.add(new Month(1,2013), 100);
    		timeSeries.add(new Month(2,2013), 200);
    		timeSeries.add(new Month(3,2013), 300);
    		timeSeries.add(new Month(4,2013), 400);
    		timeSeries.add(new Month(5,2013), 560);
    		timeSeries.add(new Month(6,2013), 600);
    		timeSeries.add(new Month(7,2013), 750);
    		timeSeries.add(new Month(8,2013), 890);
    		timeSeries.add(new Month(9,2013), 120);
    		timeSeries.add(new Month(10,2013), 400);
    		timeSeries.add(new Month(11,2013), 1200);
    		timeSeries.add(new Month(12,2013), 1600);
    		
    		// 访问量统计
    		TimeSeries timeSeries2=new TimeSeries("B网站访问量统计", Month.class);
    		// 添加数据
    		timeSeries2.add(new Month(1,2013), 50);
    		timeSeries2.add(new Month(2,2013), 100);
    		timeSeries2.add(new Month(3,2013), 150);
    		timeSeries2.add(new Month(4,2013), 200);
    		timeSeries2.add(new Month(5,2013), 220);
    		timeSeries2.add(new Month(6,2013), 300);
    		timeSeries2.add(new Month(7,2013), 340);
    		timeSeries2.add(new Month(8,2013), 400);
    		timeSeries2.add(new Month(9,2013), 450);
    		timeSeries2.add(new Month(10,2013), 500);
    		timeSeries2.add(new Month(11,2013), 70);
    		timeSeries2.add(new Month(12,2013), 800);
    		
    		// 定义时间序列的集合
    		TimeSeriesCollection lineDataset=new TimeSeriesCollection();
    		lineDataset.addSeries(timeSeries);
    		lineDataset.addSeries(timeSeries2);
    		
    		JFreeChart chart=ChartFactory.createTimeSeriesChart("访问量统计时间折线图", "月份", "访问量", lineDataset, true, true, true);
    		
    		//设置主标题
    		chart.setTitle(new TextTitle("A,B网站访问量统计对比图", new Font("隶书", Font.ITALIC, 15))); 
    		//设置子标题
    		TextTitle subtitle = new TextTitle("2018年度", new Font("黑体", Font.BOLD, 12));
    		chart.addSubtitle(subtitle); 
    		chart.setAntiAlias(true); 
    		
    		//设置时间轴的范围。
    		XYPlot plot = (XYPlot) chart.getPlot(); 
    		DateAxis dateaxis = (DateAxis)plot.getDomainAxis();
    		dateaxis.setDateFormatOverride(new java.text.SimpleDateFormat("M月"));
    		dateaxis.setTickUnit(new DateTickUnit(DateTickUnit.MONTH,1)); 
    		
    		//设置曲线是否显示数据点
    		XYLineAndShapeRenderer xylinerenderer = (XYLineAndShapeRenderer)plot.getRenderer();
    		xylinerenderer.setBaseShapesVisible(true); 
    		
    		//设置曲线显示各数据点的值
    		XYItemRenderer xyitem = plot.getRenderer(); 
    		xyitem.setBaseItemLabelsVisible(true);
    		xyitem.setBasePositiveItemLabelPosition(new ItemLabelPosition(ItemLabelAnchor.OUTSIDE12, TextAnchor.BASELINE_CENTER)); 
    		xyitem.setBaseItemLabelGenerator(new StandardXYItemLabelGenerator());
    		xyitem.setBaseItemLabelFont(new Font("Dialog", 1, 12)); 
    		plot.setRenderer(xyitem);
    		
    		String fileName=ServletUtilities.saveChartAsPNG(chart, 700, 500, session);
    		
    		return fileName;
    }
    }
    

    5、根据servlet中配置的jsp页面名称新建jsp页面,在页面中请求第4步中的Java类得到fileName进行显示图表。代码如下:

    <%@page import="chart.LineChart"%>
    <%@ page language="java" contentType="text/html; charset=UTF-8"
    	pageEncoding="UTF-8"%>
    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="UTF-8">
    <title>Insert title here</title>
    </head>
    <body>
    	<%
    		String fileName = LineChart.generateLineChart(session); //调用生成图表的Java类,返回饼图png文件的文件名
    	%>
    	<!--设置图片路径:(servlet的url-pattern)?filename=(上面获取的文件名fileName)  -->
    	<img src="displayChart?filename=<%=fileName%>" width="700" height="500"
    		border="0">
    </body>
    </html>
    

    6、部署该项目到tomcat服务器,在浏览器请求相应的jsp页面即可。
    在这里插入图片描述
    后来看见这个博客写的也挺全:https://www.cnblogs.com/newwind/p/5680389.html
    说明:在这里,2D、3D与数据集的封装只是为了分类方便,四者可以两两组合,烦请自行组合。另外,图中数据纯属虚构,不代表任何实际意义。谢谢理解!如有问题欢迎指出!

    展开全文
  • 展开全部用jfreechartjfreechart绘制柱状图import java.io.File;import java.io.IOException;import org.jfree.chart.ChartFactory;import org.jfree.chart.ChartUtilities;import org.jfree.chart.JFreeChart;...
  • Java绘制图表(柱状图、饼图、折线图(时间序列操作)):开放的图表绘制类库JfreeChart(Struts2篇)操作步骤:实例1:LineChart(折线图)实例2:PieChart(折线图)与实例1类似实例3:BarChart(折线图)与实例1...
  • .NET3.5中中推出了图表控件,可以同时支持Web和WinForm两种方式,由于平时很少使用,一直网络.NET3.5中中推出了图表控件,可以同时支持Web和WinForm两种方式,由于平时很少使用,一直没有玩玩,闲来无事,简单研究了...
  • Java绘制图表框架JFreeChart入门

    千次阅读 2014-04-29 19:16:00
    3.创建处理绘制图表请求的servlet:JFreeChartServlet ,源码如下: package org.xjh.jfreechart; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet....
  • TeeChart Canvas1 绘图线1.1 2D图表添加一个绘图线:private void Load() {line1.fillSampleValues(20);line1.setVertAxis(VerticalAxis.BOTH);line1.setHorizAxis(HorizontalAxis.BOTH);tChart1.getAspect.setView...
  • import java.awt.*;public class ChartFormatTest{public static void main(String args[]){View m_view = new View();RangeRef newRange = null;try {m_view.getLock();//标题 setTextAsValue(行,...
  • java绘制excel图表(jxcell)

    千次阅读 2018-04-25 16:52:09
    java语言利用jxcell.jar 绘制excel图表( 柱状图) -## 标题 ##-因为需求需要利用java绘制图表找了很多资料最后找到了jxcell可以做这方面的东西 jxcell还可以直接调用excel的公式等。非常不错下面给下载连接以及...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 534
精华内容 213
关键字:

java绘制图表

java 订阅