使用JFreeChart畫多種圖
示例一﹕
混合圖(柱狀圖+折線圖)
混合圖中﹐數據集自修改﹗如是練習﹐可先查看后面單獨的柱狀圖和折線圖后﹐再回頭練習。
與單獨創建單獨的圖形區別重點在映射折線數據集(紅色部分)。在最后示例四中﹐將會附上可以單獨直接制圖的方法(直接帶數據集)。
public void getpic3(HttpServletResponse response,List<BadListVo> badlist,Integer sumCountErrorNum){
//創建柱狀圖數據集
DefaultCategoryDataset dataset2 = new DefaultCategoryDataset();
for(int i=0;i<badlist.size();i++){
BadListVo badlistvo = new BadListVo();
badlistvo = badlist.get(i); dataset2.addValue(Double.valueOf(badlistvo.getCountErrorNum()),"",badlistvo.getProId());
}
Font labelFont = new Font("宋体", Font.BOLD, 12);
JFreeChart chart = ChartFactory.createBarChart3D("不良柏拉圖","", "不合格批數", dataset2, PlotOrientation.VERTICAL,true,true,true);
CategoryPlot plot = chart.getCategoryPlot();//獲得圖表區域對象
org.jfree.chart.renderer.category.BarRenderer3D renderer;
renderer = new org.jfree.chart.renderer.category.BarRenderer3D();
renderer.setItemLabelsVisible(true);
// y軸設置
ValueAxis rangeAxis = plot.getRangeAxis();
rangeAxis.setLabelFont(labelFont);
rangeAxis.setTickLabelFont(labelFont);
rangeAxis.setUpperBound(sumCountErrorNum);//設置Y軸數值 最大 sumCountErrorNum
rangeAxis.setLowerMargin(0.05); // 設置最低的一個Item與圖片底端的距離
rangeAxis.setUpperMargin(0.05);
plot.setRangeAxis(rangeAxis);
renderer.setMaxBarWidth(0.1);//設置柱體寬度
//顯示柱體的數值
renderer.setItemLabelGenerator( new StandardCategoryItemLabelGenerator());
renderer.setItemLabelsVisible( true );
//renderer.setMinimumBarLength(0.5);//設置柱體高度
plot.setRenderer(renderer);
//設置圖表的縱軸和橫軸org.jfree.chart.axis.CategoryAxis
org.jfree.chart.axis.CategoryAxis domainAxis = plot.getDomainAxis();
domainAxis.setTickLabelFont(labelFont);//
domainAxis.setCategoryMargin(0.1);//橫軸標簽之間的距離10%
domainAxis.setMaximumCategoryLabelWidthRatio(4f);// 橫軸上的 Lable 是否完整顯示
domainAxis.setUpperMargin(0.05);
domainAxis.setLowerMargin(0.05);
// Lable(Math.PI/3.0)度傾斜
domainAxis.setCategoryLabelPositions(CategoryLabelPositions.createUpRotationLabelPositions(Math.PI / 7.0));
chart.setAntiAlias(true);
chart.setBackgroundPaint(Color.WHITE);
chart.setBorderPaint(Color.BLACK);
chart.setBorderVisible(true);
//創建折線圖數據集
DefaultCategoryDataset dataset = new DefaultCategoryDataset();
Double errorR = 0.0;
String proId = null;
for(int i=0;i<badlist.size();i++){
BadListVo badlistvo = new BadListVo();
badlistvo = badlist.get(i);
errorR = errorR+Double.valueOf(badlistvo.getErrorRate());
proId = badlistvo.getProId();
dataset.addValue(errorR, "", proId);
}
//映射折線數據集----
plot.setDataset(1, dataset);
plot.mapDatasetToRangeAxis(1, 1);
//CategoryAxis categoryaxis = plot.getDomainAxis();
// categoryaxis.setCategoryLabelPositions(CategoryLabelPositions.DOWN_45);
NumberAxis numberaxis = new NumberAxis("不合格比率");//折線Y軸名稱(右邊)
numberaxis.setLabelFont(labelFont);
plot.setRangeAxis(1, numberaxis);
//定義折線顯示樣式
LineAndShapeRenderer lineandshaperenderer = new LineAndShapeRenderer();
lineandshaperenderer.setToolTipGenerator(new StandardCategoryToolTipGenerator());
//設置數據點數據顯示
lineandshaperenderer.setBaseItemLabelGenerator(new StandardCategoryItemLabelGenerator());
lineandshaperenderer.setBaseItemLabelsVisible(true);
plot.setRenderer(1, lineandshaperenderer);
plot.setDatasetRenderingOrder(DatasetRenderingOrder.FORWARD);
LegendTitle legendtitle = new LegendTitle(plot.getRenderer(0));
legendtitle.setMargin(new RectangleInsets(2D, 2D, 2D, 2D));
legendtitle.setBorder(new BlockBorder());
LegendTitle legendtitle1 = new LegendTitle(plot.getRenderer(1));
legendtitle1.setMargin(new RectangleInsets(2D, 2D, 2D, 2D));
legendtitle1.setBorder(new BlockBorder());
BlockContainer blockcontainer = new BlockContainer(new BorderArrangement());
blockcontainer.add(legendtitle, RectangleEdge.LEFT);
blockcontainer.add(legendtitle1, RectangleEdge.RIGHT);
blockcontainer.add(new EmptyBlock(2000D, 0.0D));
CompositeTitle compositetitle = new CompositeTitle(blockcontainer);
compositetitle.setPosition(RectangleEdge.BOTTOM);
chart.addSubtitle(compositetitle);
try{
// 保存圖片到指定文件夾
java.util.Date d = new java.util.Date();
String filename = String.valueOf(d.getTime());//368 278
ChartUtilities.saveChartAsJPEG(new File("C://tomcat6/webapps/****/images/monthQualityPic/BarChart3.jpg"), chart, 468, 378);
} catch (Exception e){
System.err.println("Problem occurred creating chart!"+e.getMessage());
}
}
示例二﹕
柱狀圖﹕
關于數據集部分﹐請參看其他文章。在這就不做詳細解釋。主要是為了與混合圖中的數據集相對應。
public void getpic(HttpServletResponse response,List<BadListVo> badlist,Integer sumCountErrorNum){
//創建一個柱狀圖
DefaultCategoryDataset dataset2 = new DefaultCategoryDataset();
for(int i=0;i<badlist.size();i++){
BadListVo badlistvo = new BadListVo();
badlistvo = badlist.get(i);
dataset2.addValue(Double.valueOf(badlistvo.getErrorRate()),"",badlistvo.getProId());
}
Font labelFont = new Font("宋体", Font.BOLD, 12);
JFreeChart chart = ChartFactory.createBarChart3D("不良比例圖","料號", "不合格比率", dataset2, PlotOrientation.VERTICAL,true,true,true);
CategoryPlot plot = chart.getCategoryPlot();//獲得圖表區域對象
org.jfree.chart.renderer.category.BarRenderer3D renderer;
renderer = new org.jfree.chart.renderer.category.BarRenderer3D();
renderer.setItemLabelsVisible(true);
// y軸設置
ValueAxis rangeAxis = plot.getRangeAxis();
rangeAxis.setLabelFont(labelFont);
rangeAxis.setTickLabelFont(labelFont);
rangeAxis.setUpperBound(100);//設置Y軸數值 最大100 sumCountErrorNum
rangeAxis.setLowerMargin(0.15); // 設置最低的一個Item與圖片底端的距離
plot.setRangeAxis(rangeAxis);
renderer.setMaxBarWidth(0.1);//設置柱體寬度
plot.setRenderer(renderer);
org.jfree.chart.axis.CategoryAxis domainAxis = plot.getDomainAxis();
domainAxis.setTickLabelFont(labelFont);//
domainAxis.setCategoryMargin(0.1);//橫軸標簽之間的距離10%
domainAxis.setMaximumCategoryLabelWidthRatio(4f);// 橫軸上的 Lable 是否完整顯示
// Lable(Math.PI/3.0)度傾斜
domainAxis.setCategoryLabelPositions(CategoryLabelPositions.createUpRotationLabelPositions(Math.PI / 7.0));
chart.setAntiAlias(true);
chart.setBackgroundPaint(Color.WHITE);
chart.setBorderPaint(Color.BLACK);
chart.setBorderVisible(true);
try{
// 保存圖片到指定文件夾
java.util.Date d = new java.util.Date();
String filename = String.valueOf(d.getTime());
ChartUtilities.saveChartAsJPEG(new File("C://tomcat-6.0.16/webapps/****/images/monthQualityPic/BarChart.jpg"), chart, 368, 278);
} catch (Exception e){
System.err.println("Problem occurred creating chart!"+e.getMessage());
}
}
示例三﹕
折線圖
public void getpic2(HttpServletResponse response,List<BadListVo> badlist){
//曲線圖/
String title = "不良柏拉圖";//曲線圖標題
String domain = "料號";//X軸
String range = "不合格比率";//Y軸
String subtitleStr = "月品質分析";//曲線圖自標題
DefaultCategoryDataset dataset = new DefaultCategoryDataset();
Double errorR = 0.0;
String proId = null;
for(int i=0;i<badlist.size();i++){
BadListVo badlistvo = new BadListVo();
badlistvo = badlist.get(i);
errorR = errorR+Double.valueOf(badlistvo.getErrorRate());
proId = badlistvo.getProId();
dataset.addValue(errorR, "", proId);
}
JFreeChart chart2 = ChartFactory.createLineChart(
title, // title
domain, // x-axis label
range, // y-axis label
dataset, // data
PlotOrientation.VERTICAL,
true, // create legend?
true, // generate tooltips?
false // generate URLs?
);
CategoryPlot plot = chart2.getCategoryPlot();//獲得圖表區域對象
Font labelFont = new Font("宋体", Font.BOLD, 12);
//x軸 // 分類X軸網絡是否可見
plot.setDomainGridlinesVisible(true);
//y軸設置
ValueAxis rangeAxis = plot.getRangeAxis();
rangeAxis.setLabelFont(labelFont);
rangeAxis.setTickLabelFont(labelFont);
// 分類Y軸網絡是否可見
plot.setRangeGridlinesVisible(true);
plot.setRangeAxis(rangeAxis);
//設置圖表的縱軸和橫軸org.jfree.chart.axis.CategoryAxis
org.jfree.chart.axis.CategoryAxis domainAxis = plot.getDomainAxis();
domainAxis.setTickLabelFont(labelFont);//
domainAxis.setCategoryMargin(0.1);//橫軸標簽之間的距離10%
domainAxis.setMaximumCategoryLabelWidthRatio(4f);// 橫軸上的 Lable 是否完整顯示
// Lable(Math.PI/3.0)度傾斜
domainAxis.setCategoryLabelPositions(CategoryLabelPositions.createUpRotationLabelPositions(Math.PI / 7.0));
NumberAxis numberaxis = (NumberAxis)plot.getRangeAxis();
numberaxis.setStandardTickUnits(NumberAxis.createIntegerTickUnits());
numberaxis.setAutoRangeIncludesZero(true);
LineAndShapeRenderer lineandshaperenderer = (LineAndShapeRenderer)plot.getRenderer();
lineandshaperenderer.setBaseItemLabelsVisible(true);
lineandshaperenderer.setBaseCreateEntities(true);
lineandshaperenderer.setLinesVisible(true);//設置數據點聯線
lineandshaperenderer.setShapesVisible(true);//設置顯示數據點
//設置數據點數據顯示
lineandshaperenderer.setBaseItemLabelGenerator(new StandardCategoryItemLabelGenerator());
lineandshaperenderer.setBaseItemLabelsVisible(true);
chart2.setAntiAlias(true);
chart2.setBackgroundPaint(Color.WHITE);
chart2.setBorderPaint(Color.BLACK);
chart2.setBorderVisible(true);
XYLineAndShapeRenderer renderer = new XYLineAndShapeRenderer();
try{
// 保存圖片到指定文件夾
java.util.Date d = new java.util.Date();
String filename = String.valueOf(d.getTime());
ChartUtilities.saveChartAsJPEG(new File("C://tomcat-6.0.16/webapps/****/images/monthQualityPic/BarChart2.jpg"), chart2, 368, 278);
}catch(Exception e){
System.err.println("Problem occurred creating chart.");
}
}
示例四﹕
混合圖(帶數據集)可以直接使用看圖片效果
public void getpic4(HttpServletResponse response,List<BadListVo> badlist,Integer sumCountErrorNum){
String s = "S1";
String s1 = "S2";
String s2 = "S3";
String s3 = "Cate 1";
String s4 = "Cate 2";
String s5 = "Cate 3";
String s6 = "Cate 4";
String s7 = "Cate 5";
String s8 = "Cate 6";
String s9 = "Cate 7";
String s10 = "Cate 8";
DefaultCategoryDataset defaultcategorydataset = new DefaultCategoryDataset();
defaultcategorydataset.addValue(1.0D, s, s3);
defaultcategorydataset.addValue(4D, s, s4);
defaultcategorydataset.addValue(3D, s, s5);
defaultcategorydataset.addValue(5D, s, s6);
defaultcategorydataset.addValue(5D, s, s7);
defaultcategorydataset.addValue(7D, s, s8);
defaultcategorydataset.addValue(7D, s, s9);
defaultcategorydataset.addValue(8D, s, s10);
defaultcategorydataset.addValue(5D, s1, s3);
defaultcategorydataset.addValue(7D, s1, s4);
defaultcategorydataset.addValue(6D, s1, s5);
defaultcategorydataset.addValue(8D, s1, s6);
defaultcategorydataset.addValue(4D, s1, s7);
defaultcategorydataset.addValue(4D, s1, s8);
defaultcategorydataset.addValue(2D, s1, s9);
defaultcategorydataset.addValue(1.0D, s1, s10);
defaultcategorydataset.addValue(4D, s2, s3);
defaultcategorydataset.addValue(3D, s2, s4);
defaultcategorydataset.addValue(2D, s2, s5);
defaultcategorydataset.addValue(3D, s2, s6);
defaultcategorydataset.addValue(6D, s2, s7);
defaultcategorydataset.addValue(3D, s2, s8);
defaultcategorydataset.addValue(4D, s2, s9);
defaultcategorydataset.addValue(3D, s2, s10);
//--chart--------------
JFreeChart jfreechart = ChartFactory.createBarChart("Dual Axis Chart", "Category", "Value", defaultcategorydataset , PlotOrientation.VERTICAL, false, true, false);
jfreechart.setBackgroundPaint(Color.white);
CategoryPlot categoryplot = (CategoryPlot)jfreechart.getPlot();
categoryplot.setBackgroundPaint(new Color(238, 238, 255));
categoryplot.setDomainAxisLocation(AxisLocation.BOTTOM_OR_RIGHT);
//---------------------------------------
DefaultCategoryDataset defaultcategorydataset2 = new DefaultCategoryDataset();
defaultcategorydataset2.addValue(15D, "S4", "Cate1");
defaultcategorydataset2.addValue(24D, "S4", "Cate2");
defaultcategorydataset2.addValue(31D, "S4", "Cate3");
defaultcategorydataset2.addValue(25D, "S4", "Cate4");
defaultcategorydataset2.addValue(56D, "S4", "Cate5");
defaultcategorydataset2.addValue(37D, "S4", "Cate6");
defaultcategorydataset2.addValue(77D, "S4", "Cate7");
defaultcategorydataset2.addValue(18D, "S4", "Cate8");
categoryplot.setDataset(1, defaultcategorydataset2);
categoryplot.mapDatasetToRangeAxis(1, 1);
CategoryAxis categoryaxis = categoryplot.getDomainAxis();
categoryaxis.setCategoryLabelPositions(CategoryLabelPositions.DOWN_45);
NumberAxis numberaxis = new NumberAxis("Secondary");
categoryplot.setRangeAxis(1, numberaxis);
LineAndShapeRenderer lineandshaperenderer = new LineAndShapeRenderer();
lineandshaperenderer.setToolTipGenerator(new StandardCategoryToolTipGenerator());
categoryplot.setRenderer(1, lineandshaperenderer);
categoryplot.setDatasetRenderingOrder(DatasetRenderingOrder.FORWARD);
LegendTitle legendtitle = new LegendTitle(categoryplot.getRenderer(0));
legendtitle.setMargin(new RectangleInsets(2D, 2D, 2D, 2D));
legendtitle.setBorder(new BlockBorder());
LegendTitle legendtitle1 = new LegendTitle(categoryplot.getRenderer(1));
legendtitle1.setMargin(new RectangleInsets(2D, 2D, 2D, 2D));
legendtitle1.setBorder(new BlockBorder());
BlockContainer blockcontainer = new BlockContainer(new BorderArrangement());
blockcontainer.add(legendtitle, RectangleEdge.LEFT);
blockcontainer.add(legendtitle1, RectangleEdge.RIGHT);
blockcontainer.add(new EmptyBlock(2000D, 0.0D));
CompositeTitle compositetitle = new CompositeTitle(blockcontainer);
compositetitle.setPosition(RectangleEdge.BOTTOM);
jfreechart.addSubtitle(compositetitle);
try{
// 保存圖片到指定文件夾
java.util.Date d = new java.util.Date();
String filename = String.valueOf(d.getTime());
ChartUtilities.saveChartAsJPEG(new File("C://tomcat-6.0.16/webapps/racherVDRS/images/monthQualityPic/BarChart4.jpg"), jfreechart, 368, 278);
//ChartUtilities.saveChartAsJPEG(new File("F://BarChart.jpg"), chart, 368, 278);
} catch (Exception e){
System.err.println("Problem occurred creating chart!"+e.getMessage());
}
}
这篇博客详细介绍了如何利用JFreeChart库在Java中绘制混合图表,包括柱状图和折线图的组合。通过示例代码展示了如何创建数据集、设置图表样式和标签,以及处理不同类型的图表数据,帮助开发者掌握JFreeChart的使用技巧。
1193

被折叠的 条评论
为什么被折叠?



