本来想在同一个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();
/*
*
*/
}
以上内容有部分参考和自己思考。希望对大家有所帮助哦~~