首先几个核心API要熟悉
JFreeChart 图表对象
XXXXDataset 数据集
XXXXPlot 图表区域对象,即具体的什么类型的图表,柱状,饼状等
XXXXAxis X轴,Y轴对象
XXXXRenderer 负责如何显示图表对象
XXXXURLGenerator
XXXXToolTipGenerator
一般的实现步骤:
1.根据所要画的图,准备对应的数据集.
2.准备Plot,确定所要画的图的种类(如柱状,饼状等)
3.准备Axis,包括X,Y轴所表示的内容.
4.准备Renderer,确定如何显示图表对象
5.创建JFreeChart,把上面准备的相应参数传入.
6.保存图片到本地或传至WEB
java 代码
- package test;
- import java.awt.BasicStroke;
- import java.awt.Color;
- import java.awt.Font;
- import java.io.FileOutputStream;
- import java.io.IOException;
- import java.text.DecimalFormat;
- import java.text.SimpleDateFormat;
- import java.util.TimeZone;
- import org.jfree.data.KeyToGroupMap;
- import org.jfree.data.category.CategoryDataset;
- import org.jfree.data.category.DefaultCategoryDataset;
- import org.jfree.data.general.DefaultPieDataset;
- import org.jfree.data.time.Month;
- import org.jfree.data.time.TimeTableXYDataset;
- import org.jfree.data.xy.XYDataset;
- import org.jfree.ui.RectangleInsets;
- import org.jfree.ui.TextAnchor;
- import org.jfree.chart.*;
- import org.jfree.chart.axis.CategoryAnchor;
- import org.jfree.chart.axis.CategoryAxis;
- import org.jfree.chart.axis.NumberAxis;
- import org.jfree.chart.axis.PeriodAxis;
- import org.jfree.chart.axis.PeriodAxisLabelInfo;
- import org.jfree.chart.axis.ValueAxis;
- import org.jfree.chart.labels.ItemLabelAnchor;
- import org.jfree.chart.labels.ItemLabelPosition;
- import org.jfree.chart.labels.StandardCategoryItemLabelGenerator;
- import org.jfree.chart.labels.StandardCategoryToolTipGenerator;
- import org.jfree.chart.labels.StandardXYItemLabelGenerator;
- import org.jfree.chart.labels.StandardXYToolTipGenerator;
- import org.jfree.chart.plot.*;
- import org.jfree.chart.renderer.category.CategoryItemRenderer;
- import org.jfree.chart.renderer.category.GroupedStackedBarRenderer;
- import org.jfree.chart.renderer.category.LineAndShapeRenderer;
- import org.jfree.chart.renderer.xy.StackedXYBarRenderer;
- import org.jfree.chart.renderer.xy.XYStepRenderer;
- public class ChartDemo {
- public static void main(String[] args)
- {
- ChartDemo chartD = new ChartDemo();
- chartD.createBarDemo("bar.jpg");
- chartD.createPieDemo("pie.jpg");
- chartD.createXYBarDemo("xybar.jpg");
- }
- //创建柱状图
- public void createBarDemo(String jpgname)
- {
- CategoryDataset dataset = getBarDataset();
- JFreeChart chart = ChartFactory.createStackedBarChart("月统计报表", "统计月份", "数据", dataset, PlotOrientation.VERTICAL, true, true, false);
- //创建Renderer
- GroupedStackedBarRenderer groupedstackedbarrenderer = new GroupedStackedBarRenderer();
- //创建若干组,以便可分柱状,和叠方图
- KeyToGroupMap keytogroupmap = new KeyToGroupMap("G1");
- //目标为一组,实际,未完为另一组
- keytogroupmap.mapKeyToGroup("计划", "G1");
- keytogroupmap.mapKeyToGroup("实际", "G2");
- keytogroupmap.mapKeyToGroup("未完", "G2");
- //设置组
- groupedstackedbarrenderer.setSeriesToGroupMap(keytogroupmap);
- //显示数值
- groupedstackedbarrenderer.setBaseItemLabelGenerator(new StandardCategoryItemLabelGenerator());
- //可见?
- groupedstackedbarrenderer.setBaseItemLabelsVisible(true);
- //显示位置
- groupedstackedbarrenderer.setPositiveItemLabelPositionFallback(new ItemLabelPosition(ItemLabelAnchor.CENTER, TextAnchor.BOTTOM_CENTER));
- groupedstackedbarrenderer.setItemMargin(0.05000000000000001D);
- //设置显示颜色
- groupedstackedbarrenderer.setSeriesPaint(0, new Color(255, 137, 255)); // 粉红
- groupedstackedbarrenderer.setSeriesPaint(1, new Color(0, 11, 220));// BLUE
- groupedstackedbarrenderer.setSeriesPaint(2, new Color(0, 148, 52));// 绿色
- CategoryPlot categoryplot = (CategoryPlot)chart.getPlot();
- categoryplot.setDomainGridlinePosition(CategoryAnchor.MIDDLE);
- //横网格线
- categoryplot.setRangeGridlinesVisible(true);
- //竖风格线
- categoryplot.setDomainGridlinesVisible(false);
- //横轴
- CategoryAxis domainAxis=categoryplot.getDomainAxis();
- //间隔
- domainAxis.setCategoryMargin(0.2);
- //竖轴
- //ValueAxis valueaxis = categoryplot.getRangeAxis();
- //设置数值显示范围
- //valueaxis.setRange(0.0D, 30000D);
- categoryplot.setRenderer(groupedstackedbarrenderer);
- categoryplot.setDatasetRenderingOrder(DatasetRenderingOrder.FORWARD);
- categoryplot.setDataset(1, dataset);
- categoryplot.mapDatasetToRangeAxis(1, 1);
- //categoryplot.mapDatasetToRangeAxis(1, 2);
- NumberAxis numberaxis = new NumberAxis("费用");
- //numberaxis.setRange(0,90000);
- //设置右边的Y轴
- categoryplot.setRangeAxis(1, numberaxis);
- LineAndShapeRenderer lineandshaperenderer = new LineAndShapeRenderer();
- lineandshaperenderer.setBaseToolTipGenerator(new StandardCategoryToolTipGenerator());
- lineandshaperenderer.setSeriesPaint(0, new Color(255, 137, 255)); // 粉红
- lineandshaperenderer.setSeriesPaint(1, new Color(0,11,220)); // 蓝色
- categoryplot.setRenderer(1, lineandshaperenderer);
- categoryplot.setDatasetRenderingOrder(DatasetRenderingOrder.FORWARD);
- this.savejpg(chart, jpgname);
- }
- //获取柱状图数据
- private CategoryDataset getBarDataset()
- {
- DefaultCategoryDataset dataset = new DefaultCategoryDataset();
- String plan="计划";
- String actual="实际";
- String leave = "未完";
- dataset.addValue(2000, plan, "一月");
- dataset.addValue(500, actual, "一月");
- dataset.addValue(1500, leave, "一月");
- dataset.addValue(2000, plan, "二月");
- dataset.addValue(500, actual, "二月");
- dataset.addValue(1500, leave, "二月");
- dataset.addValue(5000, plan, "三月");
- dataset.addValue(3200, actual, "三月");
- dataset.addValue(1800, leave, "三月");
- return dataset;
- }
- //创建XYBar
- public void createXYBarDemo(String jpgname)
- {
- TimeTableXYDataset dataset = this.getXYDataset();
- //设置X坐标轴
- PeriodAxis periodaxis = new PeriodAxis("时间");
- periodaxis.setTimeZone(TimeZone.getTimeZone("Pacific/Auckland"));
- periodaxis.setAutoRangeTimePeriodClass(org.jfree.data.time.Month.class);
- periodaxis.setMajorTickTimePeriodClass(org.jfree.data.time.Month.class);
- PeriodAxisLabelInfo aperiodaxislabelinfo[] = new PeriodAxisLabelInfo[2];
- aperiodaxislabelinfo[0] = new PeriodAxisLabelInfo(org.jfree.data.time.Month.class,
- new SimpleDateFormat("MMM"),
- new RectangleInsets(2D, 2D, 2D, 2D),
- new Font("SansSerif", 1, 10),
- Color.BLACK, false, new BasicStroke(0.0F), Color.lightGray);
- aperiodaxislabelinfo[1] = new PeriodAxisLabelInfo(org.jfree.data.time.Year.class, new SimpleDateFormat("yyyy"));
- periodaxis.setLabelInfo(aperiodaxislabelinfo);
- periodaxis.setLowerMargin(0.01D);
- periodaxis.setUpperMargin(0.01D);
- //设置Y坐标轴
- NumberAxis numberaxis = new NumberAxis("登入次数");
- numberaxis.setStandardTickUnits(NumberAxis.createIntegerTickUnits());
- numberaxis.setUpperMargin(0.10000000000000001D);
- numberaxis.setRange(0,20000);
- //设置Renderer
- StackedXYBarRenderer stackedxybarrenderer = new StackedXYBarRenderer(0.14999999999999999D);
- stackedxybarrenderer.setDrawBarOutline(true);
- stackedxybarrenderer.setBaseItemLabelsVisible(false);
- stackedxybarrenderer.setBaseItemLabelGenerator(new StandardXYItemLabelGenerator());
- stackedxybarrenderer.setBasePositiveItemLabelPosition(new ItemLabelPosition(ItemLabelAnchor.OUTSIDE12, TextAnchor.BOTTOM_CENTER));
- stackedxybarrenderer.setBaseToolTipGenerator(new StandardXYToolTipGenerator("{0} : {1} = {2}", new SimpleDateFormat("yyyy"), new DecimalFormat("0")));
- stackedxybarrenderer.setMargin(0.2);
- stackedxybarrenderer.setSeriesPaint(0, new Color(0,11,220));
- stackedxybarrenderer.setSeriesPaint(1, new Color(51,129,50));
- stackedxybarrenderer.setSeriesPaint(2, new Color(255,0,0));
- XYPlot plot = new XYPlot(dataset,periodaxis,numberaxis,stackedxybarrenderer);//数据集,X轴,Y轴,renderer
- plot.setRangeGridlinesVisible(true);
- plot.setDomainGridlinesVisible(false);
- JFreeChart chart = new JFreeChart("工作量统计",plot);
- XYPlot xyplot1=(XYPlot)chart.getPlot();
- XYStepRenderer xysteprenderer1 = new XYStepRenderer();
- xysteprenderer1.setBaseShapesVisible(true);
- xysteprenderer1.setSeriesStroke(0, new BasicStroke(1F));
- xysteprenderer1.setSeriesPaint(0, new Color(255,0,0));
- //xysteprenderer1.setBaseToolTipGenerator(new StandardXYToolTipGenerator());
- //xysteprenderer1.setDefaultEntityRadius(6);
- xyplot1.setDataset(1, getXYDatasetLevel1());
- xyplot1.setRenderer(1,xysteprenderer1);
- XYStepRenderer xysteprenderer2 = new XYStepRenderer();
- xysteprenderer2.setBaseShapesVisible(true);
- xysteprenderer2.setSeriesStroke(0, new BasicStroke(2.0F));
- xysteprenderer2.setSeriesPaint(0, Color.yellow);
- xyplot1.setDataset(2, getXYDatasetLevel2());
- xyplot1.setRenderer(2,xysteprenderer2);
- this.savejpg(chart, jpgname);
- }
- private TimeTableXYDataset getXYDataset()
- {
- TimeTableXYDataset dataset = new TimeTableXYDataset();
- dataset.add(new Month(1,2005), 8000, "已完");
- dataset.add(new Month(1,2005), 2000, "未完");
- dataset.add(new Month(2,2005), 8000, "未完");
- return dataset;
- }
- private XYDataset getXYDatasetLevel1()
- {
- TimeTableXYDataset ttd1 = new TimeTableXYDataset();// 目标
- ttd1.add(new Month(1,2005), 8000, "目标");
- ttd1.add(new Month(2,2005), 9000, "目标");
- ttd1.add(new Month(3,2005), 10000, "目标");
- return ttd1;
- }
- private XYDataset getXYDatasetLevel2()
- {
- TimeTableXYDataset ttd2 = new TimeTableXYDataset();// 分布
- ttd2.add(new Month(1,2005), 2000, "分布");
- ttd2.add(new Month(2,2005), 2000, "分布");
- return ttd2;
- }
- //创建饼图
- public void createPieDemo(String jpgname)
- {
- DefaultPieDataset dataset = getPieDataset();
- JFreeChart chart = ChartFactory.createPieChart3D("水果产量", dataset, true, true, true);
- this.savejpg(chart, jpgname);
- }
- //获取饼图数据
- private DefaultPieDataset getPieDataset() {
- DefaultPieDataset dataset = new DefaultPieDataset();
- dataset.setValue("苹果", 100);
- dataset.setValue("梨子", 200);
- dataset.setValue("葡萄", 300);
- dataset.setValue("荔枝", 400);
- dataset.setValue("香蕉", 500);
- dataset.setValue("枣子", 600);
- return dataset;
- }
- //保存为本地图片
- private void savejpg(JFreeChart chart,String jpgname)
- {
- FileOutputStream jpg = null;
- try {
- jpg = new FileOutputStream(jpgname);
- ChartUtilities.writeChartAsJPEG(jpg,0.5f,chart,800,500,null);
- } catch (Exception e) {
- // TODO 自动生成 catch 块
- e.printStackTrace();
- }
- finally
- {
- try {
- jpg.close();
- } catch (IOException e) {
- // TODO 自动生成 catch 块
- e.printStackTrace();
- }
- }
- }
- }