最近項目增加了需求,想要下載折線圖和柱狀圖結合的綜合圖。我查了一會兒,要實現這個功能,我使用了這兩個第三方包了:
- jfreechart-1.0.19.jar
- jcommon-1.0.23.jar
效果:
步驟:
①、導入其相應的 jcommon-1.0.23.jar和 jfreechart-1.0.19.jar文件
②、下面就可以寫實現功能的代碼了
import java.awt.Color;
import java.awt.Font;
import java.io.File;
import java.io.IOException;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartFrame;
import org.jfree.chart.ChartUtilities;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.CategoryAxis3D;
import org.jfree.chart.axis.CategoryLabelPositions;
import org.jfree.chart.axis.NumberAxis3D;
import org.jfree.chart.axis.NumberTickUnit;
import org.jfree.chart.labels.StandardCategoryItemLabelGenerator;
import org.jfree.chart.labels.StandardCategoryToolTipGenerator;
import org.jfree.chart.plot.CategoryPlot;
import org.jfree.chart.plot.DatasetRenderingOrder;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.renderer.category.BarRenderer3D;
import org.jfree.chart.renderer.category.LineAndShapeRenderer;
import org.jfree.data.category.DefaultCategoryDataset;
public class test {
public static void main(String[] args) {
//折線圖數據
DefaultCategoryDataset lineDataset = new DefaultCategoryDataset();
//添加數據
lineDataset.addValue(9, "", "語文");
lineDataset.addValue(7, "", "數學");
lineDataset.addValue(6, "", "英語");
lineDataset.addValue(4, "", "物理");
lineDataset.addValue(3, "", "化學");
lineDataset.addValue(2, "", "生物");
//柱狀圖數據
DefaultCategoryDataset dataset = new DefaultCategoryDataset();
//添加數據
dataset.addValue(4, "", "語文");
dataset.addValue(7, "", "數學");
dataset.addValue(6, "", "英語");
dataset.addValue(5, "", "物理");
dataset.addValue(3, "", "化學");
dataset.addValue(9, "", "生物");
//生成的柱狀圖
JFreeChart chart = ChartFactory.createBarChart3D(
"科目成績",
"科目",//X軸的標籤
"分數",//Y軸的標籤
dataset, //圖標顯示的數據集合
PlotOrientation.VERTICAL, //圖像的顯示形式(水平或者垂直)
false,//是否顯示子標題
false,//是否生成提示的標籤
false); //是否生成URL鏈接
/*
* 處理圖形上的亂碼
*/
//處理主標題的亂碼
chart.getTitle().setFont(new Font("黑體",Font.BOLD,18));
//獲取圖表區域對象
CategoryPlot categoryPlot = (CategoryPlot)chart.getPlot();
//獲取X軸的對象
CategoryAxis3D categoryAxis3D = (CategoryAxis3D)categoryPlot.getDomainAxis();
//獲取Y軸的對象
NumberAxis3D numberAxis3D = (NumberAxis3D)categoryPlot.getRangeAxis();
//處理X軸上的亂碼
categoryAxis3D.setTickLabelFont(new Font("黑體",Font.BOLD,10));
//處理X軸外的亂碼
categoryAxis3D.setLabelFont(new Font("黑體",Font.BOLD,10));
//處理Y軸上的亂碼
numberAxis3D.setTickLabelFont(new Font("黑體",Font.BOLD,10));
//處理Y軸外的亂碼
numberAxis3D.setLabelFont(new Font("黑體",Font.BOLD,10));
//自定義Y軸上顯示的刻度,以10作爲1格
numberAxis3D.setAutoTickUnitSelection(false);
NumberTickUnit unit = new NumberTickUnit(1);
numberAxis3D.setTickUnit(unit);
//獲取繪圖區域對象
BarRenderer3D barRenderer3D = (BarRenderer3D)categoryPlot.getRenderer();
//設置柱形圖的寬度
barRenderer3D.setMaximumBarWidth(0.07);
//在圖形上顯示數字
barRenderer3D.setBaseItemLabelGenerator(new StandardCategoryItemLabelGenerator());
barRenderer3D.setBaseItemLabelsVisible(true);
barRenderer3D.setBaseItemLabelFont(new Font("宋體",Font.BOLD,10));
/*
* 放折線圖數據
*/
categoryPlot.setDataset(1, lineDataset);
//設置折線
LineAndShapeRenderer lineandshaperenderer = new LineAndShapeRenderer();
lineandshaperenderer.setToolTipGenerator(new StandardCategoryToolTipGenerator());
categoryPlot.setRenderer(1, lineandshaperenderer);
// 柱狀圖和縱軸緊靠
categoryAxis3D.setLowerMargin(0.0);
categoryAxis3D.setCategoryLabelPositions(CategoryLabelPositions.DOWN_45);
//折線在柱面前面顯示
categoryPlot.setDatasetRenderingOrder(DatasetRenderingOrder.FORWARD);
/*
* 在E盤目錄下生成圖片
*/
File file = new File("e:\\a.png");
try {
ChartUtilities.saveChartAsJPEG(file, chart, 800, 600);
} catch (IOException e) {
e.printStackTrace();
}
}
}