freeChart是一个用Java开发的开源库。 它可以在基于Java的应用程序中使用,以创建各种图表。 通过使用JFreeChart,我们可以创建所有主要类型的2D和3D图表,如饼图,条形图,折线图,XY图表和3D图表。
下载地址:
Jfree官网下载
1.验证Java安装:打开终端并执行表格中的java命令
系统 | 任务 | 命令 |
---|---|---|
Windows | 打开命令控制台 | C:> java -version |
Linux | 打开命令终端 | $ java -version |
返回java版本则证明已经安装过java,没有则需先配置好Java再进行Jfree的配置
2.配置java环境:将JAVA_HOME环境变量设置为指向计算机上安装Java的基本目录位置(以jdk1.7.0为例)
系统 | 命令1 | 命令2 |
---|---|---|
Windows | 将环境变量JAVA_HOME设置为C:\ProgramFiles\java\jdk1.7.0_60 | 附加字符串; C:\Program Files\Java\jdk1.7.0_60\bin到系统变量PATH的末尾。 |
Linux | export JAVA_HOME =/usr/local/java-current | export PATH = path : JAVA_HOME/bin/ |
备注:如果在安装java是没有按默认选择而是改变了路径,这里的命令和表格中提供的将会有差异。
3.安装Jfreechart:从链接http://www.jfree.org/jfreechart/download/下载最新版本的JFreeChart.zip,并把zip文件解压。本例中我将其解压到C盘中,所以执行命令如表格:
系统 | 命令 |
---|---|
Windows | 将字符串“C:\jfreechart-1.0.18\lib\jfreechart-1.0.18.jar”和“C:\jfreechart-1.0.18\lib\jcommon-1.0.22.jar”附加到用户的末尾变量CLASSPATH |
Linux | 导出CLASSPATH = $ CLASSPATH:/usr/share/jfreechart1.0.18/lib/jfreechart-1.0.18.jar:/usr/share/jfreechart-1.0.18/lib/jcommon1.0.22.jar |
如解压到别的地方,可将命令中的路径改为该文件的路径。
1.下载JfreeChart:从链接http://www.jfree.org/jfreechart/download/下载最新版本的JFreeChart.zip,并把zip文件解压。
2.导入idea:把JFreeChart.jar 和 jcommon.jar 两个包导入IDEA。
在https://iowiki.com/jfreechart/jfreechart_quick_guide.html中对JfreeChart的基本类有着非常详尽的介绍,不在赘述。这里简单放几个示例代码,笔者会尽量详尽地进行注释,阅读一遍可以了解大概的用法。
想用Jfree作图,核心需要得到的就是一个参数:数据集。
图的名字、图的类型、图的大小等等,都是一两行代码、一两个方法就能解决的。所以每次用Jfree处理图像,核心代码功能就在于处理数据集,并将处理好的数据集映射到Jfree的点集中。
以折线图为例:
经过种种方法你处理好了一个 double[] timeset , 则已快得到胜利。接下来只需要:
a.创建 XYseries(点集),一个XYseries对象代表了一条新线,想要图里有一条折线就创建一个,多条就多个。将timeset映射到XYseries中,一般用 点集对象.add(数据集中的x轴数据,数据集中的y轴数据)来添加。
b.创建XYSeriesCollection(图的数据集) ,一般用 图集对象.addSeries(点集对象)来添加
c.生成图像,创建Jfreechart对象等于ChartFactory.createXYLineChart {“图的标题名”,“X轴名称”,“Y轴名称”,刚刚处理好的图的数据集}
d.创建画布,新建ChartPanel对象,然后调用.setPreferredSize(X轴大小,Y轴大小)。
大概就是全部流程。接下来看几段示例代码以理解具体实现。
import org.jfree.chart.ChartPanel;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.JFreeChart;
import org.jfree.ui.ApplicationFrame;
import org.jfree.ui.RefineryUtilities;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.data.category.DefaultCategoryDataset;
public class LineChart extends ApplicationFrame {
public LineChart( String applicationTitle , String chartTitle ) {
super(applicationTitle);
//帮助理解中提到的创建JfreeChart
JFreeChart lineChart = ChartFactory.createLineChart(
chartTitle,//标题名
"Years",//X轴
"Number of Schools",//Y轴
createDataset(),//图的数据集
PlotOrientation.VERTICAL,
true,true,false);
//创建并设置画布大小
ChartPanel chartPanel = new ChartPanel( lineChart );
chartPanel.setPreferredSize( new java.awt.Dimension( 560 , 367 ) );
setContentPane( chartPanel );
}
private DefaultCategoryDataset createDataset( ) {
//产生数据集
DefaultCategoryDataset dataset = new DefaultCategoryDataset( );
dataset.addValue( 15 , "schools" , "1970" );
dataset.addValue( 30 , "schools" , "1980" );
dataset.addValue( 60 , "schools" , "1990" );
dataset.addValue( 120 , "schools" , "2000" );
dataset.addValue( 240 , "schools" , "2010" );
dataset.addValue( 300 , "schools" , "2014" );
return dataset;
}
//在主函数中执行
public static void main( String[ ] args ) {
LineChart chart = new LineChart(
"School Vs Years" ,
"Numer of Schools vs years");
chart.pack( );
RefineryUtilities.centerFrameOnScreen( chart );
chart.setVisible( true );
}
}
import javax.swing.JPanel;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.JFreeChart;
//相比折线图改动
import org.jfree.data.general.DefaultPieDataset;
import org.jfree.data.general.PieDataset;
import org.jfree.ui.ApplicationFrame;
import org.jfree.ui.RefineryUtilities;
public class PieChart extends ApplicationFrame {
public PieChart( String title ) {
super( title );
setContentPane(createDemoPanel( ));
}
private static PieDataset createDataset( ) {
DefaultPieDataset dataset = new DefaultPieDataset( );
//("数值对应名称",百分比)
dataset.setValue( "1970",10.00);
dataset.setValue( "1980",20.00);
dataset.setValue( "1990",30.00 );
dataset.setValue( "2000",20.00 );
dataset.setValue( "2010",10.00);
dataset.setValue( "2014",10.00);
return dataset;
}
private static JFreeChart createChart( PieDataset dataset ) {
JFreeChart chart = ChartFactory.createPieChart(
"Years vs Sschools", // 标题
dataset, // 数据
true,
true,
false);
return chart;
}
public static JPanel createDemoPanel( ) {
JFreeChart chart = createChart(createDataset( ) );
return new ChartPanel( chart );
}
public static void main( String[ ] args ) {
PieChart demo = new PieChart( "Years vs Sschools" );
demo.setSize( 560 , 367 );
RefineryUtilities.centerFrameOnScreen( demo );
demo.setVisible( true );
}
}
import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartFrame;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.data.category.DefaultCategoryDataset;
public class Chart {
public static void main(String[] args) {
DefaultCategoryDataset dataset = new DefaultCategoryDataset();
dataset.addValue(15, "school1", "1970");
dataset.addValue(30, "school1", "1980");
dataset.addValue(60, "school1", "1990");
dataset.addValue(120, "school2", "1970");
dataset.addValue(240, "school2", "1980");
dataset.addValue(300, "school2", "1990");
JFreeChart chart = ChartFactory.createBarChart3D(
"Years vs School",
"year",
"number",
dataset,
PlotOrientation.VERTICAL,
true, true, false);
ChartFrame chartFrame = new ChartFrame("Test", chart);
chartFrame.pack();
chartFrame.setVisible(true);
}
}
import org.jfree.chart.ChartPanel;
import org.jfree.chart.JFreeChart;
import org.jfree.data.xy.XYSeries;
import org.jfree.data.xy.XYSeriesCollection;
import javax.swing.*;
`
public class OmegaExample extends JFrame {
public OmegaExample(String title) {
super(title);
XYSeries nSeries = new XYSeries("n"); //第一个点集(即图里第一条线)的名字
XYSeries nSquaredSeries = new XYSeries("n^2"); //第二个点集(即图里第二条线)的名字
int maxValue = 10;
//为点集填充数值
for (int n = 1; n <= maxValue; n++) {
nSeries.add(n, n);
nSquaredSeries.add(n, Math.pow(n, 2));
}
//将两个点集添加到collection里
XYSeriesCollection dataset = new XYSeriesCollection();
dataset.addSeries(nSeries);
dataset.addSeries(nSquaredSeries);
JFreeChart chart = ChartFactory.createXYLineChart(
"Growth Rates: n vs n^2", //图的标题
"n", //X轴的名字
"Value", //y轴的名字
dataset //绘图所用数据集
);
ChartPanel chartPanel = new ChartPanel(chart);
chartPanel.setPreferredSize(new java.awt.Dimension(560, 370)); //创建560×370的画布
setContentPane(chartPanel);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(() -> {
OmegaExample example = new OmegaExample("OmegaExample");
example.setSize(800, 600);
example.setLocationRelativeTo(null);
example.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
example.setVisible(true); //让图片可见
});
}
}
Q1:我导入了Jfreechart但是IDEA提示无法识别方法?
A1:点进Project Structure-Lib,检查是否已添加Jfreechart和Jcommon,两个都得有。常见情况是没有加上Jcommon。
Q2:IDEA提示无法识别setVisible()等方法?
A2:大概率是你复制代码到IDEA中,但是更改过源代码的类名。若是此种情况,在主函数中找到使用了原类名的地方修改成新类名即可。