The range of an axis can be extended by setting lower/upper margins or just decrease/increase the min/max range values. However this is always a percentage of the range values. For charts that can have a wide variety of possible values, a percentage setting is unusable as for some charts, 5% is just right for one charts and wrong for other charts. So we need the possibility to set an absolute margin.
I thought of getting the width/height of a plot and calculate the absolute length of an axis and then calculate the percentage margin of this length. But JFreeChart doesn't have these values. Only when you save a chart or display it in a frame, you can set width/height of the chart.
How to set absolute axis margin?
How to set absolute axis margin?
Java 11, JFreeChart 1.0.15, JFreeSVG 4.0
-
- JFreeChart Project Leader
- Posts: 11734
- Joined: Fri Mar 14, 2003 10:29 am
- antibot: No, of course not.
- Contact:
Do you mean a margin specified as a fixed number of Java2D units? That could be done, but I think it would not be a very general solution in the face of changing the chart drawing dimensions (which is why the percentage margins are used). But maybe I misunderstand what you mean...
David Gilbert
JFreeChart Project Leader
Read my blog
Support JFree via the Github sponsorship program
JFreeChart Project Leader
![Idea :idea:](./images/smilies/icon_idea.gif)
![Idea :idea:](./images/smilies/icon_idea.gif)
Well, I thought I found a workaround:
I have a (custom) logarithmic axis. So far, I adjusted the range to subtract/add a 5% of the range to the minRange/maxRange. This works good for linear axes, but for logarithmic axis, the bottom range can get very big, if the upper range is very big. So I have to decouple the margins from the range "distance" (maxRange - minRange). Instead I search for the minimum and maximum value and compute the minimumMargin only dependend on the minimumValue and the maximumMargin only dependend on the maximumValue. This works also for non-linear axes as it doesn't matter what the value between min/max value/range is (as this is wrong either way).
However, this is not a real solution as the margin is still a relative percentage factor. This solved the problem of one of my charts, but suddenly my other charts got broken up as the percentage solely rely on the min/max values is awfully wrong if you have a small range but high values (e.g. 99,74 - 101,34). For such cases, the range should be taken into account - which breaks my new case ...
Either way, the only solution would be a margin that doesn't depend on the dataset values / range. It should just be a percentage of the axis length or a fixed length in pixels/Java2D dimension.
I have a (custom) logarithmic axis. So far, I adjusted the range to subtract/add a 5% of the range to the minRange/maxRange. This works good for linear axes, but for logarithmic axis, the bottom range can get very big, if the upper range is very big. So I have to decouple the margins from the range "distance" (maxRange - minRange). Instead I search for the minimum and maximum value and compute the minimumMargin only dependend on the minimumValue and the maximumMargin only dependend on the maximumValue. This works also for non-linear axes as it doesn't matter what the value between min/max value/range is (as this is wrong either way).
Code: Select all
final ValueAxis va = (ValueAxis) axis;
double minValue = 0.0;
double maxValue = 0.0;
Number n = getMinMaxValue(chart, axisType, indexAxis, false);
if (n != null) minValue = n.doubleValue();
n = getMinMaxValue(chart, axisType, indexAxis, true);
if (n != null) maxValue = n.doubleValue();
final double deltaBottom = minValue * marginBottom;
final double deltaTop = maxValue * marginTop;
double minRange = minValue - deltaBottom;
double maxRange = maxValue + deltaTop;
va.setRange(minRange, maxRange);
Either way, the only solution would be a margin that doesn't depend on the dataset values / range. It should just be a percentage of the axis length or a fixed length in pixels/Java2D dimension.
Java 11, JFreeChart 1.0.15, JFreeSVG 4.0
Re: How to set absolute axis margin?
I know this topic is very old but I faced the exact same issue and I thought it could be interesting to share my solution.
If there is a better way to do it now, please let me know, I'm new to JFreeChart.
So my issue is exactly what mhilpert described, I want to generically add the same margin every time to my Y axis but I can't use percentage because I can have linear or logarithmic axis, depending on my chart instance.
I didn't want to manipulate Java2D objects or do complex math to add a margin so I did this in two steps:
- first, I set my new range to my Y axis without margins
- then, I use JFreeChart#zoomRangeAxes() to zoom out a little on the Y axis from the center of the chart, it will add top and bottom margins to my Y range.
Thus, I don't have to know what are my values on Y and JFreeChart will do all the math for me.
If there is a better way to do it now, please let me know, I'm new to JFreeChart.
So my issue is exactly what mhilpert described, I want to generically add the same margin every time to my Y axis but I can't use percentage because I can have linear or logarithmic axis, depending on my chart instance.
I didn't want to manipulate Java2D objects or do complex math to add a margin so I did this in two steps:
- first, I set my new range to my Y axis without margins
- then, I use JFreeChart#zoomRangeAxes() to zoom out a little on the Y axis from the center of the chart, it will add top and bottom margins to my Y range.
Thus, I don't have to know what are my values on Y and JFreeChart will do all the math for me.