本來想在同一個freechart中畫出不同類型的圖表。比如說一個是XYAreaRender一個是XYLinerender.
本例參考例程http://www.java2s.com/Code/Java/Chart/JFreeChartOverlaidXYPlotDemo.htm
實現效果如圖:
代碼如下:
private JFreeChart createChart() {
// create plot 1
//創建XYarea數據,新建XYAreaRenderer實例,並添加至XYplot
final XYDataset data1 = createAreaDataset();
final XYItemRenderer AreaRenderer = new XYAreaRenderer();
AreaRenderer.setBaseToolTipGenerator(
new StandardXYToolTipGenerator(
StandardXYToolTipGenerator.DEFAULT_TOOL_TIP_FORMAT,
new DecimalFormat("##0"), new DecimalFormat("#,##0.00")
)
);
// areadomainAxis指的是橫座標,areaRangeAxis指的是縱座標。
final ValueAxis areaDomainAxis = new NumberAxis("same x axis");
final ValueAxis areaRangeAxis = new NumberAxis("axis 1");
areaDomainAxis.setLowerMargin(0.0);
areaDomainAxis.setUpperMargin(0.0);
final XYPlot plot = new XYPlot(data1, areaDomainAxis, areaRangeAxis, AreaRenderer);
// insert a text
final double x = new Day(9, SerialDate.MARCH, 2002).getMiddleMillisecond();
final XYTextAnnotation annotation = new XYTextAnnotation("Hello!", x, 10000.0);
annotation.setFont(new Font("SansSerif", Font.PLAIN, 9));
plot.addAnnotation(annotation);
// add a second XYlineRenderer...
// 創建XYline數據,設置座標,setAutoRange指的是,座標軸2自動調整範圍與座標軸一分開。
final XYDataset TransferKey = createTransferDataset();
// 將dataset指給xyplot,index編號爲1
plot.setDataset(1, TransferKey);
final ValueAxis TransferRangeAxis = new NumberAxis("axis 2");
TransferRangeAxis.setAutoRange(true);
//將新建的座標軸屬性指給index爲1的座標軸,即本例的右側座標軸,設置位置。
plot.setRangeAxis(1,TransferRangeAxis);
plot.setRangeAxisLocation(1, AxisLocation.BOTTOM_OR_RIGHT);
//新建XYRenderer,並一同加入同一個xyplot,注意SetRender時的座標軸編號。
final XYItemRenderer Linerenderer = new StandardXYItemRenderer();
Linerenderer.setBaseToolTipGenerator(
new StandardXYToolTipGenerator(
StandardXYToolTipGenerator.DEFAULT_TOOL_TIP_FORMAT,
new DecimalFormat("##0"), new DecimalFormat("0.00")
)
);
plot.setRenderer(1, Linerenderer);
//這句指的是將index爲1 的數據指定給index爲1的座標軸。如果沒有這句的話,第二個數據的座標將按第一個座標軸進行畫圖。
plot.mapDatasetToRangeAxis(1, 1);
plot.setDatasetRenderingOrder(DatasetRenderingOrder.FORWARD);
// return a new chart containing the overlaid plot...
return new JFreeChart("Transfer Func", JFreeChart.DEFAULT_TITLE_FONT, plot, false);
}
/**
* Creates a sample dataset.
*
* @return The dataset.
*/
private XYDataset createAreaDataset() {
// create dataset 1...
final XYSeries AreaSeries = new XYSeries("AreaData");
double value;
for(int i=0;i<256;i++){
value = 10*Math.random();
AreaSeries.add(i, value);
}
return new XYSeriesCollection(AreaSeries);
}
// ****************************************************************************
// * JFREECHART DEVELOPER GUIDE *
// * The JFreeChart Developer Guide, written by David Gilbert, is available *
// * to purchase from Object Refinery Limited: *
// * *
// * http://www.object-refinery.com/jfreechart/guide.html *
// * *
// * Sales are used to provide funding for the JFreeChart project - please *
// * support us so that we can continue developing free software. *
// ****************************************************************************
/**
* Creates a sample dataset.
*
* @return The dataset.
*/
private XYDataset createTransferDataset() {
// create createTransferDataset...
final XYSeries TransferSeries = new XYSeries("AreaData");
// double value;
TransferSeries.add(0,0);
TransferSeries.add(255,1);
return new XYSeriesCollection(TransferSeries);
}
private void moveBtnActionPerformed(ActionEvent evt) {
// TODO add your handling code here:
/*
*
*/
// super(title);
final JFreeChart chart = createChart();
//以下是將jfreechart指給特定JPanel空間進行顯示。注意最後三句必不可少。一定要設置JPanel的Layout爲BorderLayout()
final ChartPanel chartPanel = new ChartPanel(chart);
FreeChartpanel.setLayout(new java.awt.BorderLayout());
FreeChartpanel.add(chartPanel,BorderLayout.CENTER);
FreeChartpanel.validate();
/*
*
*/
}
以上內容有部分參考和自己思考。希望對大家有所幫助哦~~