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小的先,折線圖的線會覆蓋在長條圖上面
// 最後輸出成圖片即可

留言
張貼留言