因为之前在工作中用到了Echarts这个非常简单易用的图表插件,所以这段时间对图表的相关知识很感兴趣。回想到自己的毕业设计中也用到了图表的显示,当时使用的是JFreeChart,现在看看当时做的真的是不堪入目,虽然功能完成了,但是生成的图表实在是不忍直视,用户体验非常不好。但是JFreeChart也有他自己的优点,例如完全使用java语言编写,API简单,对于java程序员可以很快上手,而不需要像ECharts那样需要对js有一定的了解。下面就说说自己的JFreeChart的一些简单的了解吧。

JFreeChart有几个很重要的元素:

1.数据集Dataset,用于存放图表展示的数据

2.整个图表JFreeChart,包括标题,图表,图例

3.图表Plot,为显示图表的那一块

有了上面三个要素,就可以进行图表的操作了。例如:

public class HelloPieChart {

	public static void main(String[] args) throws IOException {
		//dataset是用于存放数据的数据集,JFreeChart中的数据集都继承自AbstractDataset
		DefaultPieDataset pieDataset=getDataset();
		//通过工厂方法生成一个图表对象。参数分别是图表的标题,数据集,是否需要图例,是否需要tooltips,是否需要对图表创建url
		JFreeChart chart=ChartFactory.createPieChart("Programming Language", pieDataset,true,false, false);
		//为整个图表设置背景色,整个chart包括标题,图表,图例等
		chart.setBackgroundPaint(ChartColor.WHITE);
		//plot为图表内图表的部分
		PiePlot plot=(PiePlot) chart.getPlot();
		//为图表内设置背景色
		plot.setBackgroundPaint(ChartColor.DARK_BLUE);
		
		//输出到本地
		FileOutputStream fos=new FileOutputStream(new File("D:\\ProgrammingLanguage.jpg"));
		//ChartUtilies是JFreeChart提供的工具类,writeChartAsPNG意思是将生成的图表作为png格式输出到D:\\ProgrammingLanguage.jpg
		ChartUtilities.writeChartAsPNG(fos, chart, 500, 300);
		fos.close();
	}
	
	/**
	 * 获取一个数据集
	 * @return 数据集
	 */
	private static DefaultPieDataset getDataset(){
		DefaultPieDataset dataset=new DefaultPieDataset();
		dataset.setValue("Java", 100);
		dataset.setValue("C", 150);
		dataset.setValue("C++", 120);
		dataset.setValue("PHP", 80);
		dataset.setValue("#C", 80);
		return dataset;
	}

}

上面示例为统计编程语言的市场份额(我瞎写的),并将数据生成一个饼状图,通过io流可以将生成的图表图片存储到文件系统中,再将其读取到需要显示的页面即可。

JFreeChart能生成的图表有很多,譬如说柱状图,饼图,散点图等。对于各种图表的生成有很多的方法,但是最基本的那几个要素都是共通的。例如下面的3D柱状图:

public class HelloBarChart {

	public static void main(String[] args) throws IOException {
		CategoryDataset dataset = getDataset();
		//设置语言,避免中文乱码的出现
		StandardChartTheme theme = new StandardChartTheme("CN");
		// 设置标题字体
		theme.setExtraLargeFont(new Font("隶书", Font.BOLD, 20));
		// 设置图例的字体
		theme.setRegularFont(new Font("宋书", Font.PLAIN, 15));
		//设置轴向的字体 
		theme.setLargeFont(new Font("宋体", Font.PLAIN, 15));
		ChartFactory.setChartTheme(theme);
		//工厂类创建一个3D的柱状图。参数分别为标题,横轴文字,纵轴文字,数据集。
		JFreeChart chart = ChartFactory.createBarChart3D("Progamming Language","城市", "占比", dataset);
		chart.setBackgroundPaint(ChartColor.WHITE);
		CategoryPlot plot = chart.getCategoryPlot();
		plot.setBackgroundPaint(ChartColor.WHITE);

		FileOutputStream fos = new FileOutputStream(new File("D:\\progammingLanguageOnCity.jpg"));
		ChartUtilities.writeChartAsJPEG(fos, chart, 500, 300);
		fos.close();
	}

	private static CategoryDataset getDataset() {
		DefaultCategoryDataset dataset = new DefaultCategoryDataset();
		dataset.addValue(100, "北京", "java");
		dataset.addValue(70, "西安", "java");
		dataset.addValue(10, "安康", "java");
		dataset.addValue(100, "北京", "php");
		dataset.addValue(60, "西安", "php");
		dataset.addValue(5, "安康", "php");
		dataset.addValue(100, "北京", "#c");
		dataset.addValue(50, "西安", "#c");
		dataset.addValue(2, "安康", "#c");
		return dataset;
	}
}

JFreeChart还提供了对数据库操作的数据集JDBCXxxDataset,可以直接将数据库返回结果作为结果集。应用也是非常的简单,例如:

public class HelloJDBCPieChart {
	
	public static final String driver="com.mysql.jdbc.Driver";
	public static final String url="jdbc:mysql://127.0.0.1:3306/test?characterEncoding=utf-8&transformedBitIsBoolean=true";
	public static final String username="root";
	public static final String password="";

	public static void main(String[] args) throws Exception {
		
		//sql表示查询major以及各个major的数量
		String sql="SELECT MAJOR,COUNT(MAJOR) AS MAJORCOUNT FROM STUDENT GROUP BY MAJOR";
		
		Connection connection=null;
		Class.forName(driver);
		connection=DriverManager.getConnection(url,username,password);
		//JDBCPieDataset可以连接数据库,查询后返回查询的数据集。数据集只有两列,第一列为字符串,第二列为数值。所以可以根据需求写出需要的sql。
		PieDataset dataset=new JDBCPieDataset(connection,sql);
		JFreeChart pieChart=ChartFactory.createPieChart3D("students", dataset, true, true, false);
		
		//输出到本地
		FileOutputStream fos=new FileOutputStream(new File("D:\\majors.jpg"));
		ChartUtilities.writeChartAsPNG(fos, pieChart, 500, 300);
	}

}

至此,就是最近的JFreeChart的一点小了解。JFreeChart有优点也有缺陷,优点就是对于java程序员可以很快的上手,API很方便。但是缺陷是只能生成图片,不及ECharts可以做到很好的用户交互。总之各有利弊,主要还是看实际工作中的具体情况再来选择使用什么来作为图表的显示。