Different color for item label with fallback position

A discussion forum for JFreeChart (a 2D chart library for the Java platform).
Locked
michbeck100
Posts: 1
Joined: Wed Sep 06, 2017 8:15 am
antibot: No, of course not.

Different color for item label with fallback position

Post by michbeck100 » Wed Sep 06, 2017 8:25 am

I got a bar chart with a white background. The item labels are positioned inside the bars and are also white colored. The bar itself is green. If the bar isn't big enough to display the item label inside, it falls back to a position outside of the bar.
The problem is, that the item label is white and the backround is white, too. So you cannot read the label text.

Is there an easy way to calculate if the item label will be drawn at the fallback position? Or maybe some fallback item label color? I tried to extend the BarRenderer but there are some private Methods that i can't call to calculate the "real" position.

Any ideas?

sonali
Posts: 14
Joined: Sat Sep 02, 2017 5:58 am
antibot: No, of course not.
Location: india

Re: Different color for item label with fallback position

Post by sonali » Wed Sep 06, 2017 10:47 am

may be this demo will help you:

Code: Select all


import java.awt.Color;
import java.text.DecimalFormat;
import java.text.NumberFormat;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.jfree.chart.ChartPanel;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.DateAxis;
import org.jfree.chart.axis.DateTickMarkPosition;
import org.jfree.chart.axis.NumberAxis;
import org.jfree.chart.labels.ItemLabelAnchor;
import org.jfree.chart.labels.ItemLabelPosition;
import org.jfree.chart.labels.XYItemLabelGenerator;
import org.jfree.chart.plot.XYPlot;
import org.jfree.chart.renderer.xy.StackedXYBarRenderer;
import org.jfree.data.time.Day;
import org.jfree.data.time.TimeTableXYDataset;
import org.jfree.data.xy.TableXYDataset;
import org.jfree.data.xy.XYDataset;
import org.jfree.ui.ApplicationFrame;
import org.jfree.ui.RefineryUtilities;
import org.jfree.ui.TextAnchor;


public class Labelposition extends ApplicationFrame {
   
	private static final long serialVersionUID = 1L;

	public Labelposition(final String title) {
        super(title);

        final JFreeChart chart = createChart(createDataset());
        final ChartPanel panel = new ChartPanel(chart);
        setContentPane(panel);
    }

    public static class MyXYItemLabelGenerator implements XYItemLabelGenerator {
        Map<Number,List<Double>> totals = new HashMap<Number,List<Double>>();
        NumberFormat df = DecimalFormat.getNumberInstance();
        protected void init(XYDataset dataset) {
            if (!totals.isEmpty()) return;

            int seriesCnt = dataset.getSeriesCount();
            for (int series=0; series<seriesCnt; series++) {
                for (int item=0; item<dataset.getItemCount(series); item++) {
                    Number key = dataset.getX(series, item);
                    List<Double> vals = totals.get(key);
                    if (!totals.containsKey(key)) {
                        vals = new ArrayList<Double>(seriesCnt);
                        for (int i=0;i<seriesCnt;i++) vals.add(0d);
                        totals.put(key, vals);
                    }
                    double val = dataset.getYValue(series, item);
                    for (int i=series-1; i>=0; i--) {
                        val += Double.isNaN(vals.get(i)) ? 0d : vals.get(i);
                    }
                    vals.set(series, val);
                }
            }
        }

        public String generateLabel(XYDataset dataset, int series, int item) {
            init(dataset);
            Number key = dataset.getX(series, item);
            return df.format(totals.get(key).get(series));
        }
    }

    private JFreeChart createChart(TableXYDataset tablexydataset) {
        DateAxis dateaxis = new DateAxis("Date");
        dateaxis.setTickMarkPosition(DateTickMarkPosition.MIDDLE);
        NumberAxis numberaxis = new NumberAxis("Y");
        StackedXYBarRenderer stackedxybarrenderer = new StackedXYBarRenderer(0.10000000000000001D);


        stackedxybarrenderer.setBaseItemLabelGenerator(new MyXYItemLabelGenerator());
        stackedxybarrenderer.setBasePositiveItemLabelPosition(new ItemLabelPosition(
                ItemLabelAnchor.OUTSIDE12, TextAnchor.BOTTOM_CENTER));
        stackedxybarrenderer.setBaseItemLabelPaint(Color.red);
        stackedxybarrenderer.setBaseItemLabelsVisible(true);
        stackedxybarrenderer.setDrawBarOutline(false);
        XYPlot xyplot = new XYPlot(tablexydataset, dateaxis, numberaxis, stackedxybarrenderer);
        JFreeChart jfreechart = new JFreeChart("Stacked XY Bar Chart demo 2", xyplot);
        return jfreechart;
    }

    private TableXYDataset createDataset() {
        TimeTableXYDataset timetablexydataset = new TimeTableXYDataset();
        Day day = new Day(1, 3, 2005);
        Day day1 = new Day(2, 3, 2005);
        Day day2 = new Day(3, 3, 2005);
        Day day3 = new Day(4, 3, 2005);
        Day day4 = new Day(5, 3, 2005);
        timetablexydataset.add(day, 1.0D, "Series 1");
        timetablexydataset.add(day1, 1.7D, "Series 1");
//        timetablexydataset.add(day2, 2.2999999999999998D, "Series 1");
        timetablexydataset.add(day3, 3.7000000000000002D, "Series 1");
        timetablexydataset.add(day4, 2.6000000000000001D, "Series 1");
        timetablexydataset.add(day, 3.2000000000000002D, "Series 2");
        timetablexydataset.add(day1, 1.1000000000000001D, "Series 2");
        timetablexydataset.add(day2, 1.3999999999999999D, "Series 2");
        timetablexydataset.add(day3, 2.8999999999999999D, "Series 2");
        timetablexydataset.add(day4, 0.59999999999999998D, "Series 2");
        return timetablexydataset;
    }

    public static void main(String[] args) {
        Labelposition demo = new Labelposition("11626934 example");
        demo.pack();
        RefineryUtilities.centerFrameOnScreen(demo);
        demo.setVisible(true);
    }
}

Locked