- Code: Select all
public static JFreeChart createTimeSeriesChart(String title,
String timeAxisLabel,
String valueAxisLabel,
XYDataset data,
boolean legend,
boolean tooltips,
boolean urls) {
ValueAxis timeAxis = new HorizontalDateAxis(timeAxisLabel);
timeAxis.setLowerMargin(0.02); // reduce the default margins on the time axis
timeAxis.setUpperMargin(0.02);
NumberAxis valueAxis = new VerticalNumberAxis(valueAxisLabel);
valueAxis.setAutoRangeIncludesZero(false); // override default
XYPlot plot = new XYPlot(data, timeAxis, valueAxis);
XYToolTipGenerator tooltipGenerator = null;
if (tooltips) {
tooltipGenerator = new TimeSeriesToolTipGenerator();
}
XYURLGenerator urlGenerator = null;
if (urls) {
urlGenerator = new StandardXYURLGenerator();
}
plot.setRenderer(new StandardXYItemRenderer(StandardXYItemRenderer.LINES,
tooltipGenerator, urlGenerator));
JFreeChart chart = new JFreeChart(title, JFreeChart.DEFAULT_TITLE_FONT, plot, legend);
return chart;
}
I thing that order of
valueAxis.setAutoRangeIncludesZero(false); // override default
XYPlot plot = new XYPlot(data, timeAxis, valueAxis);
should be reversed, because since plot variable of valueAxis is not initialized, a call to valueAxis.setAutoRangeIncludesZero(false) will always return because of code of method autoAdjustRange() in class VerticalNumberAxis :
- Code: Select all
protected void autoAdjustRange() {
Plot plot = getPlot();
// PLOT IS NOT INITIALIZED YET !!!
if (plot == null) {
return; // no plot, no data
}
if (plot instanceof VerticalValuePlot) {
VerticalValuePlot vvp = (VerticalValuePlot) plot;
Range r = vvp.getVerticalDataRange(this);
if (r == null) {
r = new Range(DEFAULT_LOWER_BOUND, DEFAULT_UPPER_BOUND);
}
double lower = r.getLowerBound();
double upper = r.getUpperBound();
double range = upper - lower;
// ensure the autorange is at least <minRange> in size...
double minRange = getAutoRangeMinimumSize();
if (range < minRange) {
double expand = (minRange - range) / 2;
upper = upper + expand;
lower = lower - expand;
}
if (autoRangeIncludesZero()) {
if (autoRangeStickyZero()) {
if (upper <= 0.0) {
upper = 0.0;
}
else {
upper = upper + getUpperMargin() * (upper - Math.min(lower, 0.0));
}
if (lower >= 0.0) {
lower = 0.0;
}
else {
lower = lower - getLowerMargin() * (upper - lower);
}
}
else {
range = Math.max(0.0, upper) - Math.min(0.0, lower);
upper = Math.max(0.0, upper + getUpperMargin() * range);
lower = Math.min(0.0, lower - getLowerMargin() * range);
}
}
else {
if (autoRangeStickyZero()) {
if (upper <= 0.0) {
upper = Math.min(0.0, upper + getUpperMargin() * range);
}
else {
upper = upper + getUpperMargin() * range;
}
if (lower >= 0.0) {
lower = Math.max(0.0, lower - getLowerMargin() * range);
}
else {
lower = lower - getLowerMargin() * range;
}
}
else {
upper = upper + getUpperMargin() * range;
lower = lower - getLowerMargin() * range;
}
}
setRangeAttribute(new Range(lower, upper));
}
}
Regards
Morpheus
