- package com.yyh.jfreechart;
- import java.awt.Color;
- import java.awt.Font;
- import java.io.File;
- import java.io.FileOutputStream;
- import java.text.DecimalFormat;
- import java.text.NumberFormat;
- import org.jfree.chart.ChartFactory;
- import org.jfree.chart.ChartUtilities;
- import org.jfree.chart.JFreeChart;
- import org.jfree.chart.axis.CategoryAxis;
- import org.jfree.chart.axis.CategoryLabelPositions;
- import org.jfree.chart.axis.NumberAxis;
- import org.jfree.chart.axis.ValueAxis;
- import org.jfree.chart.labels.StandardCategoryItemLabelGenerator;
- import org.jfree.chart.labels.StandardPieSectionLabelGenerator;
- import org.jfree.chart.plot.CategoryPlot;
- import org.jfree.chart.plot.PiePlot3D;
- import org.jfree.chart.plot.PlotOrientation;
- import org.jfree.chart.renderer.category.BarRenderer;
- import org.jfree.chart.renderer.category.LineAndShapeRenderer;
- import org.jfree.chart.renderer.category.StackedBarRenderer;
- import org.jfree.chart.title.TextTitle;
- import org.jfree.data.category.CategoryDataset;
- import org.jfree.data.general.DatasetUtilities;
- import org.jfree.data.general.DefaultPieDataset;
- import org.jfree.data.general.PieDataset;
- /**
- * 实际取色的时候一定要16位的,这样比较准确
- *
- * @author new
- */
- public class CreateChartServiceImpl {
- private static final String CHART_PATH = "E:/test/";
- public static void main(String[] args) {
- // TODO Auto-generated method stub
- CreateChartServiceImpl pm = new CreateChartServiceImpl();
- // 生成饼状图
- pm.makePieChart();
- // 生成单组柱状图
- pm.makeBarChart();
- // 生成多组柱状图
- pm.makeBarGroupChart();
- // 生成堆积柱状图
- pm.makeStackedBarChart();
- // 生成折线图
- pm.makeLineAndShapeChart();
- }
- /**
- * 生成折线图
- */
- public void makeLineAndShapeChart() {
- double[][] data = new double[][]{
- {672, 766, 223, 540, 126},
- {325, 521, 210, 340, 106},
- {332, 256, 523, 240, 526}
- };
- String[] rowKeys = {"苹果", "梨子", "葡萄"};
- String[] columnKeys = {"北京", "上海", "广州", "成都", "深圳"};
- CategoryDataset dataset = getBarData(data, rowKeys, columnKeys);
- createTimeXYChar("折线图", "x轴", "y轴", dataset, "lineAndShap.png");
- }
- /**
- * 生成分组的柱状图
- */
- public void makeBarGroupChart() {
- double[][] data = new double[][]{
- {672, 766, 223, 540, 126},
- {325, 521, 210, 340, 106},
- {332, 256, 523, 240, 526}
- };
- String[] rowKeys = {"苹果", "梨子", "葡萄"};
- String[] columnKeys = {"北京", "上海", "广州", "成都", "深圳"};
- CategoryDataset dataset = getBarData(data, rowKeys, columnKeys);
- createBarChart(dataset, "x坐标", "y坐标", "柱状图", "barGroup.png");
- }
- /**
- * 生成柱状图
- */
- public void makeBarChart() {
- double[][] data = new double[][]{
- {672, 766, 223, 540, 126}
- };
- String[] rowKeys = {"苹果"};
- String[] columnKeys = {"北京", "上海", "广州", "成都", "深圳"};
- CategoryDataset dataset = getBarData(data, rowKeys, columnKeys);
- createBarChart(dataset, "x坐标", "y坐标", "柱状图", "bar.png");
- }
- /**
- * 生成堆栈柱状图
- */
- public void makeStackedBarChart() {
- double[][] data = new double[][]{
- {0.21, 0.66, 0.23, 0.40, 0.26},
- {0.25, 0.21, 0.10, 0.40, 0.16}
- };
- String[] rowKeys = {"苹果", "梨子"};
- String[] columnKeys = {"北京", "上海", "广州", "成都", "深圳"};
- CategoryDataset dataset = getBarData(data, rowKeys, columnKeys);
- createStackedBarChart(dataset, "x坐标", "y坐标", "柱状图", "stsckedBar.png");
- }
- /**
- * 生成饼状图
- */
- public void makePieChart() {
- double[] data = {9, 91};
- String[] keys = {"失败率", "成功率"};
- createValidityComparePimChar(getDataPieSetByUtil(data, keys), "饼状图",
- "pie2.png", keys);
- }
- // 柱状图,折线图 数据集
- public CategoryDataset getBarData(double[][] data, String[] rowKeys,
- String[] columnKeys) {
- return DatasetUtilities.createCategoryDataset(rowKeys, columnKeys, data);
- }
- // 饼状图 数据集
- public PieDataset getDataPieSetByUtil(double[] data,
- String[] datadescription) {
- if (data != null && datadescription != null) {
- if (data.length == datadescription.length) {
- DefaultPieDataset dataset = new DefaultPieDataset();
- for (int i = 0; i < data.length; i++) {
- dataset.setValue(datadescription[i], data[i]);
- }
- return dataset;
- }
- }
- return null;
- }
- /**
- * 柱状图
- *
- *@param dataset 数据集
- * @param xName x轴的说明(如种类,时间等)
- * @param yName y轴的说明(如速度,时间等)
- * @param chartTitle 图标题
- * @param charName 生成图片的名字
- * @return
- */
- public String createBarChart(CategoryDataset dataset, String xName,
- String yName, String chartTitle, String charName) {
- JFreeChart chart = ChartFactory.createBarChart(chartTitle, // 图表标题
- xName, // 目录轴的显示标签
- yName, // 数值轴的显示标签
- dataset, // 数据集
- PlotOrientation.VERTICAL, // 图表方向:水平、垂直
- true, // 是否显示图例(对于简单的柱状图必须是false)
- false, // 是否生成工具
- false // 是否生成URL链接
- );
- Font labelFont = new Font("SansSerif", Font.TRUETYPE_FONT, 12);
- /*
- * VALUE_TEXT_ANTIALIAS_OFF表示将文字的抗锯齿关闭,
- * 使用的关闭抗锯齿后,字体尽量选择12到14号的宋体字,这样文字最清晰好看
- */
- // chart.getRenderingHints().put(RenderingHints.KEY_TEXT_ANTIALIASING,RenderingHints.VALUE_TEXT_ANTIALIAS_OFF);
- chart.setTextAntiAlias(false);
- chart.setBackgroundPaint(Color.white);
- // create plot
- CategoryPlot plot = chart.getCategoryPlot();
- // 设置横虚线可见
- plot.setRangeGridlinesVisible(true);
- // 虚线色彩
- plot.setRangeGridlinePaint(Color.gray);
- // 数据轴精度
- NumberAxis vn = (NumberAxis) plot.getRangeAxis();
- // vn.setAutoRangeIncludesZero(true);
- DecimalFormat df = new DecimalFormat("#0.00");
- vn.setNumberFormatOverride(df); // 数据轴数据标签的显示格式
- // x轴设置
- CategoryAxis domainAxis = plot.getDomainAxis();
- domainAxis.setLabelFont(labelFont);// 轴标题
- domainAxis.setTickLabelFont(labelFont);// 轴数值
- // Lable(Math.PI/3.0)度倾斜
- // domainAxis.setCategoryLabelPositions(CategoryLabelPositions
- // .createUpRotationLabelPositions(Math.PI / 3.0));
- domainAxis.setMaximumCategoryLabelWidthRatio(0.6f);// 横轴上的 Lable 是否完整显示
- // 设置距离图片左端距离
- domainAxis.setLowerMargin(0.1);
- // 设置距离图片右端距离
- domainAxis.setUpperMargin(0.1);
- // 设置 columnKey 是否间隔显示
- // domainAxis.setSkipCategoryLabelsToFit(true);
- plot.setDomainAxis(domainAxis);
- // 设置柱图背景色(注意,系统取色的时候要使用16位的模式来查看颜色编码,这样比较准确)
- plot.setBackgroundPaint(new Color(255, 255, 204));
- // y轴设置
- ValueAxis rangeAxis = plot.getRangeAxis();
- rangeAxis.setLabelFont(labelFont);
- rangeAxis.setTickLabelFont(labelFont);
- // 设置最高的一个 Item 与图片顶端的距离
- rangeAxis.setUpperMargin(0.15);
- // 设置最低的一个 Item 与图片底端的距离
- rangeAxis.setLowerMargin(0.15);
- plot.setRangeAxis(rangeAxis);
- BarRenderer renderer = new BarRenderer();
- // 设置柱子宽度
- renderer.setMaximumBarWidth(0.05);
- // 设置柱子高度
- renderer.setMinimumBarLength(0.2);
- // 设置柱子边框颜色
- renderer.setBaseOutlinePaint(Color.BLACK);
- // 设置柱子边框可见
- renderer.setDrawBarOutline(true);
- // // 设置柱的颜色
- renderer.setSeriesPaint(0, new Color(204, 255, 255));
- renderer.setSeriesPaint(1, new Color(153, 204, 255));
- renderer.setSeriesPaint(2, new Color(51, 204, 204));
- // 设置每个地区所包含的平行柱的之间距离
- renderer.setItemMargin(0.0);
- // 显示每个柱的数值,并修改该数值的字体属性
- renderer.setIncludeBaseInRange(true);
- renderer.setBaseItemLabelGenerator(new StandardCategoryItemLabelGenerator());
- renderer.setBaseItemLabelsVisible(true);
- plot.setRenderer(renderer);
- // 设置柱的透明度
- plot.setForegroundAlpha(1.0f);
- FileOutputStream fos_jpg = null;
- try {
- isChartPathExist(CHART_PATH);
- String chartName = CHART_PATH + charName;
- fos_jpg = new FileOutputStream(chartName);
- ChartUtilities.writeChartAsPNG(fos_jpg, chart, 500, 500, true, 10);
- return chartName;
- } catch (Exception e) {
- e.printStackTrace();
- return null;
- } finally {
- try {
- fos_jpg.close();
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- }
- /**
- * 横向图
- *
- * @param dataset 数据集
- * @param xName x轴的说明(如种类,时间等)
- * @param yName y轴的说明(如速度,时间等)
- * @param chartTitle 图标题
- * @param charName 生成图片的名字
- * @return
- */
- public String createHorizontalBarChart(CategoryDataset dataset,
- String xName, String yName, String chartTitle, String charName) {
- JFreeChart chart = ChartFactory.createBarChart(chartTitle, // 图表标题
- xName, // 目录轴的显示标签
- yName, // 数值轴的显示标签
- dataset, // 数据集
- PlotOrientation.VERTICAL, // 图表方向:水平、垂直
- true, // 是否显示图例(对于简单的柱状图必须是false)
- false, // 是否生成工具
- false // 是否生成URL链接
- );
- CategoryPlot plot = chart.getCategoryPlot();
- // 数据轴精度
- NumberAxis vn = (NumberAxis) plot.getRangeAxis();
- //设置刻度必须从0开始
- // vn.setAutoRangeIncludesZero(true);
- DecimalFormat df = new DecimalFormat("#0.00");
- vn.setNumberFormatOverride(df); // 数据轴数据标签的显示格式
- CategoryAxis domainAxis = plot.getDomainAxis();
- domainAxis.setCategoryLabelPositions(CategoryLabelPositions.UP_45); // 横轴上的
- // Lable
- Font labelFont = new Font("SansSerif", Font.TRUETYPE_FONT, 12);
- domainAxis.setLabelFont(labelFont);// 轴标题
- domainAxis.setTickLabelFont(labelFont);// 轴数值
- domainAxis.setMaximumCategoryLabelWidthRatio(0.8f);// 横轴上的 Lable 是否完整显示
- // domainAxis.setVerticalCategoryLabels(false);
- plot.setDomainAxis(domainAxis);
- ValueAxis rangeAxis = plot.getRangeAxis();
- // 设置最高的一个 Item 与图片顶端的距离
- rangeAxis.setUpperMargin(0.15);
- // 设置最低的一个 Item 与图片底端的距离
- rangeAxis.setLowerMargin(0.15);
- plot.setRangeAxis(rangeAxis);
- BarRenderer renderer = new BarRenderer();
- // 设置柱子宽度
- renderer.setMaximumBarWidth(0.03);
- &nb
JFreeChart生成图表
最新推荐文章于 2021-03-14 15:42:31 发布