因为之前在工作中用到了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; } }
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); } }