First, I'm running 0.9.21, so if the problem described below is fixed, just
let me know.
I'm trying to extend DualAxisDemo5 to support four(4) series (0-based).
My example below almost works, but it overlays the two middle bars (numbers
1 and 2). I added null series as follows (referencing the 'real' series):
series 0: on the right;
series 1,2: on both sides;
series 3: on the left
[The axes placement and mappings work fine; I have axes 0,3 on the left, and 1,2 on the right.]
Here's the code:
Code: Select all
import org.jfree.ui.ApplicationFrame;
import org.jfree.ui.RefineryUtilities;
import org.jfree.data.xy.XYDataset;
import org.jfree.data.category.CategoryDataset;
import org.jfree.data.category.DefaultCategoryDataset;
import org.jfree.chart.*;
import org.jfree.chart.axis.*;
import org.jfree.chart.renderer.category.BarRenderer;
import org.jfree.chart.renderer.category.CategoryItemRenderer;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.plot.CategoryPlot;
import java.awt.*;
import java.io.File;
import java.io.IOException;
public class MultiAxisBars extends ApplicationFrame
{
//test:
public static void main(String[] args)
{
String title = "MultiAxisBar Test - 4bars";
Dimension initialSize = new Dimension(1000, 500);
CategoryDataset[] weeksData = createTestDatasets();
Color brown = new Color(0x8B, 0x45, 0x13);
Color[] barColorList = {Color.blue, Color.red, Color.magenta, brown };
String[] rangeLabels = { "Num starts", "Score", "Num Moves", "Seconds" };
MultiAxisBars multi1AxisBars
= new MultiAxisBars(weeksData, title, rangeLabels, initialSize, barColorList);
multi1AxisBars.pack();
RefineryUtilities.centerFrameOnScreen(multi1AxisBars);
multi1AxisBars.setVisible(true);
}
//test data:
private static CategoryDataset[] createTestDatasets()
{
String seriesdl = "LeftDummy";
String seriesdr = "RightDummy";
String seriesdr2 = "RightDummy2";
String[] seriesLabels = {"Starts", "Ave score/game", "Ave moves/game", "Ave time/game" };
String[] weekLabels = {"01-Sep-06", "25-Aug-06", "18-Aug-06", "11-Aug-06", "04-Aug-06",
"28-Jul-06", "21-Jul-06", "14-Jul-06", "07-Jul-06", "30-Jun-06", "23-Jun-06" };
double[][] seriesValues = {
{1.0, 2.0, 4.0, 3.0, 5.0, 5.0, 4.0, 6.0, 5.0, 4.0, 6.0},
{3.0, 4.0, 3.0, 5.0, 6.0, 5.0, 8.0, 9.0, 8.0, 12.0, 13.0},
{213.0, 197.0, 190.0, 190.0, 186.0, 180.0, 186.0, 188.0, 160.0, 167.0, 155.0},
{313.0, 297.0, 290.0, 290.0, 286.0, 280.0, 286.0, 288.0, 260.0, 267.0, 255.0}
};
DefaultCategoryDataset[] result = new DefaultCategoryDataset[4];
//---- dataset 0 ---
int seriesIndex = 0;
result[seriesIndex]= new DefaultCategoryDataset();
for (int i=0; i<=10; i++){
result[seriesIndex].addValue(seriesValues[seriesIndex][i], seriesLabels[seriesIndex], weekLabels[i]);
};
// rightside null series
for (int i=0; i<=10; i++){ result[seriesIndex].addValue(null, seriesdr, weekLabels[i]); };
//---- dataset 1 ---
seriesIndex++;
result[seriesIndex]= new DefaultCategoryDataset();
// leftside null series
for (int i=0; i<=10; i++){ result[seriesIndex].addValue(null, seriesdl, weekLabels[i]); };
for (int i=0; i<=10; i++){
result[seriesIndex].addValue(seriesValues[seriesIndex][i], seriesLabels[seriesIndex], weekLabels[i]);
};
// rightside null series
for (int i=0; i<=10; i++){ result[seriesIndex].addValue(null, seriesdr, weekLabels[i]); };
//---- dataset 2 ---
seriesIndex++;
result[seriesIndex]= new DefaultCategoryDataset();
// leftside null series
for (int i=0; i<=10; i++){ result[seriesIndex].addValue(null, seriesdl, weekLabels[i]); };
for (int i=0; i<=10; i++){
result[seriesIndex].addValue(seriesValues[seriesIndex][i], seriesLabels[seriesIndex], weekLabels[i]);
};
// rightside null series
for (int i=0; i<=10; i++){ result[seriesIndex].addValue(null, seriesdr, weekLabels[i]); };
//---- dataset 3 ---
seriesIndex++;
result[seriesIndex]= new DefaultCategoryDataset();
// leftside null series
for (int i=0; i<=10; i++){ result[seriesIndex].addValue(null, seriesdl, weekLabels[i]); };
for (int i=0; i<=10; i++){
result[seriesIndex].addValue(seriesValues[seriesIndex][i], seriesLabels[seriesIndex], weekLabels[i]);
};
return result;
}
public MultiAxisBars(final CategoryDataset[] weeksData,
String title,
String[] rangeLabels,
Dimension initialSize,
Color[] barColorList
)
{
super(title);
CategoryAxis domainAxis = new CategoryAxis("Week Ending");
domainAxis.setCategoryLabelPositions(CategoryLabelPositions.DOWN_45);
NumberAxis[] rangeAxes = new NumberAxis[weeksData.length];
BarRenderer[] renderers = new BarRenderer[weeksData.length];
for (int i=0; i<weeksData.length; i++){
rangeAxes[i] = new NumberAxis(rangeLabels[i]);
rangeAxes[i].setAxisLinePaint(barColorList[i]);
rangeAxes[i].setLabelPaint(barColorList[i]);
rangeAxes[i].setTickLabelPaint(barColorList[i]);
rangeAxes[i].setTickMarkPaint(barColorList[i]);
renderers[i] = new BarRenderer();
renderers[i].setPaint(barColorList[i]);
}
CategoryPlot plot =
new CategoryPlot(weeksData[0], domainAxis, rangeAxes[0], renderers[0])
{
/**
* Override the getLegendItems() method to handle special case.
* @return the legend items.
*/
public LegendItemCollection getLegendItems()
{
LegendItemCollection result = new LegendItemCollection();
for (int k=0; k < weeksData.length; k++)
{
CategoryDataset dataset_k = getDataset(k);
if (dataset_k != null)
{
CategoryItemRenderer renderer = getRenderer(k);
if (renderer != null)
{
LegendItem item = null;
if (k==0){
item = renderer.getLegendItem(k, 0);
} else {
item = renderer.getLegendItem(k, 1);
}
result.add(item);
}
}
}
return result;
}
};
JFreeChart chart = new JFreeChart(title, plot);
chart.setBackgroundPaint(Color.white);
chart.getLegend().setAnchor(Legend.SOUTH);
plot.setBackgroundPaint(new Color(0xEE, 0xEE, 0xFF));
plot.setDomainAxisLocation(AxisLocation.BOTTOM_OR_RIGHT);
// handle datasets/axes/rederers for i>0:
for (int i=1; i<weeksData.length; i++)
{
plot.setDataset(i, weeksData[i]);
plot.mapDatasetToRangeAxis(i, i);
plot.setRangeAxis(i, rangeAxes[i]);
plot.setRenderer(i, renderers[i]);
// place axis#3 on left:
if (i==3){
plot.setRangeAxisLocation(i, AxisLocation.TOP_OR_LEFT);
} else {
plot.setRangeAxisLocation(i, AxisLocation.BOTTOM_OR_RIGHT);
}
}
ChartPanel chartPanel = new ChartPanel(chart);
setContentPane(chartPanel);
chartPanel.setPreferredSize(initialSize);
}
}
Ken Bowen
[quote][/quote]