While trying get around with not able to set the data area on category plot i am stuck with the following problems using XYPlot.
I have tried out few steps from my end, i have the following requirement:
1. I want the vertical grid line of the plot to pass throught the mid point of the Bar rendered by XYBarRenderer
2. I have customised the Symbol axis in a form such that i can have the labels rotated by 90 degress. But the problem is i am not able to get the label just below the tick - it is getting offset to left by some value.
Can anyone shed some light as to how i can get point 1 and point 2 achieved.
Code: Select all
import java.awt.Graphics2D;
import java.awt.geom.Rectangle2D;
import java.util.ArrayList;
import java.util.List;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.AxisState;
import org.jfree.chart.axis.NumberAxis;
import org.jfree.chart.axis.SymbolAxis;
import org.jfree.chart.axis.ValueTick;
import org.jfree.chart.axis.ValueAxis;
//import org.jfree.chart.labels.StandardXYItemLabelGenerator;
import org.jfree.chart.plot.DatasetRenderingOrder;
import org.jfree.chart.plot.XYPlot;
import org.jfree.chart.renderer.xy.XYBarRenderer;
import org.jfree.chart.renderer.xy.XYItemRenderer;
import org.jfree.chart.renderer.xy.XYLineAndShapeRenderer;
import org.jfree.data.xy.IntervalXYDataset;
import org.jfree.data.xy.XYSeries;
import org.jfree.data.xy.XYSeriesCollection;
import org.jfree.ui.ApplicationFrame;
import org.jfree.ui.RectangleEdge;
import org.jfree.ui.RefineryUtilities;
import org.jfree.ui.TextAnchor;
public class OverlaidXYChartDemo extends ApplicationFrame
{
OverlaidXYChartDemo()
{
super("test");
JFreeChart chart = new JFreeChart(
"Overlaid Plot Example",
JFreeChart.DEFAULT_TITLE_FONT,
getXYPlot(),
true);
ChartPanel panel = new ChartPanel(chart, true, true, true, true, true);
panel.setPreferredSize(new java.awt.Dimension(500, 270));
setContentPane(panel);
}
XYPlot getXYPlot()
{
IntervalXYDataset dso = getDataset(getBarSeries());
IntervalXYDataset ds1 = getDataset(getXYLineSeries1());
IntervalXYDataset ds2 = getDataset(getXYLineSeries2());
XYItemRenderer renderero = new XYBarRenderer(0.2);
SymbolAxis domainAxis = new CustomSymbolAxis(getCategories());
domainAxis.setStandardTickUnits(NumberAxis.createIntegerTickUnits());
domainAxis.setAutoRange(false);
domainAxis.setRange(0,7);
domainAxis.setLowerMargin(0.2);
domainAxis.setUpperMargin(0.2);
ValueAxis rangeAxis = new NumberAxis();
rangeAxis.setStandardTickUnits(NumberAxis.createIntegerTickUnits());
rangeAxis.setAutoRange(false);
rangeAxis.setRange(0,7);
XYItemRenderer renderer1 = new XYLineAndShapeRenderer();
XYItemRenderer renderer2 = new XYLineAndShapeRenderer();
XYPlot plot = new XYPlot();
plot.setDomainAxis(0, domainAxis);
plot.setRangeAxis(0, rangeAxis);
plot.setDataset(0, dso);
plot.setDataset(1, ds1);
plot.setDataset(2, ds2);
plot.setRenderer(0, renderero);
plot.setRenderer(1, renderer1);
plot.setRenderer(2, renderer2);
plot.setDatasetRenderingOrder(DatasetRenderingOrder.FORWARD);
return plot;
}
XYSeriesCollection getDataset(XYSeries theSeries)
{
XYSeriesCollection seriesCollection = new XYSeriesCollection();
seriesCollection.addSeries(theSeries);
return seriesCollection;
}
XYSeries getBarSeries()
{
XYSeries barSeries = new XYSeries("bar");
barSeries.add(0.5, 2.0);
barSeries.add(1.5, 2.0);
barSeries.add(2.5, 0.0);
barSeries.add(3.5, 2.0);
barSeries.add(4.5, 2.0);
barSeries.add(5.5, 1.0);
barSeries.add(6.5, 2.0);
barSeries.add(7.5, 0.0);
barSeries.add(8.5, 0.0);
barSeries.add(9.5, 0.0);
return barSeries;
}
XYSeries getXYLineSeries1()
{
XYSeries xySeries1 = new XYSeries("x1");
xySeries1.add(0.5, 4.02);
xySeries1.add(1.5, 4.02);
xySeries1.add(2.5, 4.24);
xySeries1.add(3.5, 4.04);
xySeries1.add(4.5, 5.02);
xySeries1.add(5.5, 4.24);
xySeries1.add(6.5, 3.34);
xySeries1.add(7.5, 3.71);
xySeries1.add(8.5, 4.89);
xySeries1.add(9.5, 5.00);
return xySeries1;
}
XYSeries getXYLineSeries2()
{
XYSeries xySeries2 = new XYSeries("x1");
xySeries2.add(0.5, 2.28);
xySeries2.add(1.5, 2.0);
xySeries2.add(2.5, 2.75);
xySeries2.add(3.5, 2.22);
xySeries2.add(4.5, 3.28);
xySeries2.add(5.5, 2.39);
xySeries2.add(6.5, 1.5);
xySeries2.add(7.5, 2.0);
xySeries2.add(8.5, 2.5);
xySeries2.add(9.5, 2.58);
return xySeries2;
}
String[] getCategories()
{
String[] cats
= new String[]{
"Values",
"Achiever",
"Exactness",
"Resourceful",
"WorkIntensity",
"Positivity",
"Relationship",
"R-E",
"Persuation",
"Command",
};
return cats;
}
public static void main(String args[])
{
OverlaidXYChartDemo demo
= new OverlaidXYChartDemo();
demo.pack();
RefineryUtilities.centerFrameOnScreen(demo);
demo.setVisible(true);
}
}
class CustomSymbolAxis extends SymbolAxis
{
CustomSymbolAxis(String[] categories)
{
super("", categories);
setGridBandsVisible(false);
setStandardTickUnits(NumberAxis.createIntegerTickUnits());
setVerticalTickLabels(false);
}
/**
* Converts a value to a string, using the list of symbols.
*
* @param value value to convert.
*
* @return The symbol.
*/
public String valueToString(double value)
{
int intValue = (int) value;
return getSymbols()[intValue];
}
public List refreshTicks(
Graphics2D g2,
AxisState state,
Rectangle2D dataArea,
RectangleEdge edge)
{
List ticks = super.refreshTicks(g2, state, dataArea, edge);
List customAngleTicks = new ArrayList(ticks.size());
for (int i = 0; i < ticks.size(); i++)
{
Object oTick = ticks.get(i);
ValueTick tick = (ValueTick)oTick;
customAngleTicks.add(new CustomAngleTick(tick, Math.PI/2));
}
return customAngleTicks;
}
}
class CustomAngleTick extends ValueTick
{
CustomAngleTick(
ValueTick theActualTick,
double theAngle)
{
super( theActualTick.getValue(),
theActualTick.getText(),
//theActualTick.getTextAnchor(),
TextAnchor.TOP_LEFT,
//theActualTick.getRotationAnchor(),
TextAnchor.TOP_LEFT,
theAngle);
}
}
In the example OverlaidXYPlotDemo1 and OverlaidXYPlotDemo2
I see that the grid line intersects the centre of the bar - This is what i want to achieve (Point 1)
When using category plot demos - if i set
Code: Select all
categoryplot.getDomainAxis().setCategoryLabelPositions(CategoryLabelPositions.DOWN_90);
Can some body let me know or give some inputs please?
EDIT : Working with rc3 and using JDK 1.5
Thanks,
Vijay Venkataraman