Grains
Grains

Reputation: 950

Margin plot and chart in JFreeChart

Is it possible to make all bartitles located outside the bars in a barchart visible when the max-value is a fixed value?

Example of how it looks and how I would like it to look. It should not be any values over 750 (check USA, the last row):

JFreechart with and without margins

Any tips or ideas if it´s maybe possible to make a margin between the plot and the graph to make all labels visible(or any other solution)?

Upvotes: 1

Views: 2868

Answers (1)

kiwiwings
kiwiwings

Reputation: 3446

Update: blank margin (no values on range axis)

Ok, so I'll keep the setUpperBound(), but mess around with the NumberAxis.

And here is the complete code:

import java.awt.Graphics2D;
import java.awt.geom.Rectangle2D;

import org.jfree.chart.*;
import org.jfree.chart.axis.*;
import org.jfree.chart.labels.StandardCategoryItemLabelGenerator;
import org.jfree.chart.plot.*;
import org.jfree.chart.renderer.category.CategoryItemRenderer;
import org.jfree.data.category.*;
import org.jfree.ui.*;

@SuppressWarnings("serial")
public class BarWithMargin extends ApplicationFrame {
    public BarWithMargin(final String title) {
        super(title);
        final JFreeChart chart = constructChart();
        final ChartPanel panel = new ChartPanel(chart);
        setContentPane(panel);
    }


    JFreeChart constructChart() {
        JFreeChart chart = ChartFactory.createBarChart(
            "","","",getDataSet(),PlotOrientation.HORIZONTAL,false,false,false
        );

        CategoryPlot cp = chart.getCategoryPlot();

        CategoryItemRenderer cir = cp.getRenderer(); 
        cir.setBaseItemLabelGenerator(new StandardCategoryItemLabelGenerator());
        cir.setBaseItemLabelsVisible(true);

        final double upperMargin = 80;
        final double maxOfDataset = 750;
        final double upperLimit = maxOfDataset+upperMargin;

        ValueAxis va = new NumberAxis(){
            protected void drawAxisLine(Graphics2D g2, double cursor, Rectangle2D dataArea, RectangleEdge edge) {
                int margin = (int)(dataArea.getWidth() * upperMargin / upperLimit);

                Rectangle2D newArea = new Rectangle2D.Double(
                    dataArea.getX(), dataArea.getY(), dataArea.getWidth()-margin, dataArea.getHeight());
                super.drawAxisLine(g2, cursor, newArea, edge);
            }

            protected int calculateVisibleTickCount() {
                return (int)Math.ceil(super.calculateVisibleTickCount() * maxOfDataset / upperLimit);
            }
        };

        va.setLabel(cp.getRangeAxis().getLabel());
        va.setUpperBound(upperLimit);
        cir.getPlot().setRangeAxis(va);

        return chart;
    }

    private CategoryDataset getDataSet() {
        DefaultCategoryDataset ds = new DefaultCategoryDataset();
        ds.addValue(59, "Country", "Norway");
        ds.addValue(69, "Country", "Switzerland");
        ds.addValue(85, "Country", "France");
        ds.addValue(93, "Country", "Syria");
        ds.addValue(96, "Country", "Germany");
        ds.addValue(111, "Country", "China");
        ds.addValue(116, "Country", "Australia");
        ds.addValue(121, "Country", "Egypt");
        ds.addValue(129, "Country", "England & Wales");
        ds.addValue(157, "Country", "New Zealand");
        ds.addValue(205, "Country", "Chile");
        ds.addValue(229, "Country", "Iran");
        ds.addValue(359, "Country", "Singapore");
        ds.addValue(404, "Country", "South Africa");
        ds.addValue(405, "Country", "Ukraine");
        ds.addValue(750, "Country", "USA");
        return ds;
    }    


    public static void main(String[] args) {
        BarWithMargin demo = new BarWithMargin("Bar with margin");
        demo.pack();
        RefineryUtilities.centerFrameOnScreen(demo);
        demo.setVisible(true);
    }
}

Upvotes: 1

Related Questions