JFreeChart 建造折線+長條圖


// 長條圖資料群 
final DefaultCategoryDataset dataset = new DefaultCategoryDataset( );
// 折線圖資料群
 final DefaultCategoryDataset dataset2 = new DefaultCategoryDataset( );

dataset.addValue(0.0110, "a","Dinotefuran" );
dataset.addValue(0.0051, "a","Tolfenpyrad" );
dataset.addValue(0.0313, "a","Bifenthrin" );
dataset.addValue(0.0638, "a","Fenpropathrin" );
   
dataset2.addValue(0.003, "a","Dinotefuran" );
dataset2.addValue(0.003, "a","Tolfenpyrad" );
dataset2.addValue(0.020, "a","Bifenthrin" );
dataset2.addValue(0.003, "a","Fenpropathrin" );

// 使用長條圖資料群來建造長條圖
 JFreeChart barChart = ChartFactory.createBarChart( "",  "農藥名稱", "檢出量/容許量",
 dataset,PlotOrientation.VERTICAL, false, true, false);
// ("chart的標題","類別列的標題","數據列的標題","是否需要圖例","tooltips(?)","url(?)")

 CategoryPlot categoryplot = barChart.getCategoryPlot();
 BarRenderer renderer = (BarRenderer) categoryplot.getRenderer();
 CategoryAxis xaxis = categoryplot.getDomainAxis();
 ValueAxis rAxis = categoryplot.getRangeAxis();
 NumberAxis vn = (NumberAxis) categoryplot.getRangeAxis();
// 將數據列顯示為百分比
 DecimalFormat df = new DecimalFormat("0%");    
 vn.setNumberFormatOverride(df);
// 設定數據Range (預設->會根據你的數據去變動range)
 rAxis.setRange(0,1.41);
// 設定數據、類別列標題的文字格式,個人偏好"標楷體"💖
 rAxis.setLabelFont(new Font("標楷體",Font.BOLD,15));
 xaxis.setLabelFont(new Font("細明體",Font.BOLD,15));

// 設定index 0 (因為這次資料只有一種種類) 的資料群的長條為藍色
 renderer.setSeriesPaint(0, new Color(72,118,255));

// 設定每個長條上顯示該長條數據,數據格式為百分比(取到小數第二位)
NumberFormat dformat = new DecimalFormat("0.00%");
renderer.setSeriesItemLabelGenerator(0,new StandardCategoryItemLabelGenerator("{2}",dformat));
renderer.setBaseItemLabelGenerator(new StandardCategoryItemLabelGenerator());
renderer.setBaseItemLabelsVisible(true);
renderer.setBaseItemLabelPaint(Color.BLACK);

// 設定每個長條最大寬度為chart寬度的0.10倍
renderer.setMaximumBarWidth(.10);

// 將長條圖放入chart中
categoryplot.setRenderer(0,renderer);

// 設定自訂範圍,並給予自訂範圍的標題和背景顏色
 categoryplot.addRangeMarker(createIntervalMarker(0, 1, new Color(202, 218, 171), "安全容許量範圍"), Layer.BACKGROUND);
categoryplot.addRangeMarker(createIntervalMarker(1, 1.41, new Color(206, 171, 175), "超標區域"), Layer.BACKGROUND);
 categoryplot.addRangeMarker(createIntervalMarker(0.995, 1.005, new Color(4,174,77), ""), Layer.BACKGROUND);

// 將折線圖數據放入index 1裡
categoryplot.setDataset(1, dataset2);

// 將該索引映射到axis,因為與長條圖使用同樣的數據標準,所以為0
categoryplot.mapDatasetToRangeAxis(1, 0);
// 第一個参數指數據集的索引,第二個参數为坐標軸的索引 
LineAndShapeRenderer lineAndShapeRenderer = new LineAndShapeRenderer();
// 折線圖的數據點隱藏,會使折線圖剩一條線 
lineAndShapeRenderer.setShapesVisible(false);

// 數據點間連線可見 
lineAndShapeRenderer.setLinesVisible(true);
lineAndShapeRenderer.setSeriesPaint(0, red);
// 將折線圖的連線加粗
lineAndShapeRenderer.setStroke(new BasicStroke(2.3f));

// 將折線圖放入chart中
categoryplot.setRenderer(1, lineAndShapeRenderer);

// 兩張圖顯示的先後順序 (先顯示的會被後面蓋掉)
categoryplot.setDatasetRenderingOrder(DatasetRenderingOrder.FORWARD);
// 所以顯示順序為index小的先,折線圖的線會覆蓋在長條圖上面

// 最後輸出成圖片即可

留言

這個網誌中的熱門文章

fancybox 初體驗

Popular man's analysis