Выравнивание легенды JFreeChart - PullRequest
       16

Выравнивание легенды JFreeChart

1 голос
/ 25 сентября 2019

in JFreeChart У меня есть несколько рядов на линейной диаграмме, и я хотел бы иметь легенду ниже центра области, выровненной по центру .

Сейчас это выглядит такэто: enter image description here

Но я хочу расположить его в центре между этими красными линиями: enter image description here

Ярлыки оси Y генерируются динамическипоэтому установка фиксированного отступа или поля не является для меня сейчас правильным решением.

Вот код для удобного воспроизведения:

import java.awt.Color;
import java.awt.EventQueue;
import java.awt.image.BufferedImage;
import java.text.SimpleDateFormat;

import javax.swing.ImageIcon;
import javax.swing.JLabel;

import org.jfree.chart.ChartRenderingInfo;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.DateAxis;
import org.jfree.chart.axis.NumberAxis;
import org.jfree.chart.plot.XYPlot;
import org.jfree.chart.renderer.xy.XYLineAndShapeRenderer;
import org.jfree.chart.ui.ApplicationFrame;
import org.jfree.data.time.Minute;
import org.jfree.data.time.TimeSeries;
import org.jfree.data.time.TimeSeriesCollection;


public class TimeChart extends ApplicationFrame {

    public TimeChart(String applicationTitle, String chartTitle) {
        super(applicationTitle);

        DateAxis timeAxis = new DateAxis("Timestamp");
        timeAxis.setAutoTickUnitSelection(true);
        timeAxis.setAutoRange(true);
        timeAxis.setUpperMargin(DateAxis.DEFAULT_UPPER_MARGIN);
        timeAxis.setLowerMargin(DateAxis.DEFAULT_LOWER_MARGIN);
        timeAxis.setDateFormatOverride(new SimpleDateFormat("YYYY-MM-dd HH:mm"));
        NumberAxis numberAxis = new NumberAxis("Number");


        numberAxis.setAutoTickUnitSelection(true);
        numberAxis.setAutoRangeIncludesZero(false);

        XYLineAndShapeRenderer renderer = new XYLineAndShapeRenderer(true, false);
        XYPlot plot = new XYPlot(createDataset(), timeAxis, numberAxis, renderer);
        JFreeChart lineChart = new JFreeChart(chartTitle, plot);
        lineChart.setBackgroundPaint(Color.white);

        plot.setBackgroundPaint(Color.lightGray);
        plot.setDomainGridlinePaint(Color.white);
        plot.setRangeGridlinePaint(Color.white);




        ChartRenderingInfo info = new ChartRenderingInfo();
        BufferedImage bi = lineChart.createBufferedImage(1529,
                538, BufferedImage.TRANSLUCENT, info);

        JLabel picLabel = new JLabel(new ImageIcon(bi));
        add(picLabel);        
    }

    private TimeSeriesCollection createDataset() {
        TimeSeriesCollection collection = new TimeSeriesCollection();

        for (int i=0; i<20; i++) {
            TimeSeries type = new TimeSeries("Temperatures" + i);
            type.add(Minute.parseMinute("2019-09-03 00:00"), 20.88);
            type.add(Minute.parseMinute("2019-09-03 01:00"), 20.24);
            type.add(Minute.parseMinute("2019-09-03 02:00"), 20.03);
            type.add(Minute.parseMinute("2019-09-03 03:00"), 19.87);
            type.add(Minute.parseMinute("2019-09-03 04:00"), 19.93);
            type.add(Minute.parseMinute("2019-09-03 05:00"), 20.08);
            type.add(Minute.parseMinute("2019-09-03 06:00"), 19.73);
            type.add(Minute.parseMinute("2019-09-03 07:00"), 21.49);
            type.add(Minute.parseMinute("2019-09-03 08:00"), 21.9);
            type.add(Minute.parseMinute("2019-09-03 09:00"), 22.12);
            type.add(Minute.parseMinute("2019-09-03 10:00"), 22.25);
            type.add(Minute.parseMinute("2019-09-03 11:00"), 22.51);
            type.add(Minute.parseMinute("2019-09-03 12:00"), 22.81);
            type.add(Minute.parseMinute("2019-09-03 13:00"), 23.18);
            type.add(Minute.parseMinute("2019-09-03 14:00"), 23.11);
            type.add(Minute.parseMinute("2019-09-03 15:00"), 22.72);
            type.add(Minute.parseMinute("2019-09-03 16:00"), 22.76);
            type.add(Minute.parseMinute("2019-09-03 17:00"), 22.77);
            type.add(Minute.parseMinute("2019-09-03 18:00"), 22.85);
            type.add(Minute.parseMinute("2019-09-03 19:00"), 22.73);
            type.add(Minute.parseMinute("2019-09-03 20:00"), 22.4);
            type.add(Minute.parseMinute("2019-09-03 21:00"), 22.51);
            type.add(Minute.parseMinute("2019-09-03 23:00"), 23.05);
            collection.addSeries(type);
        }

        return collection;
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                TimeChart chart = new TimeChart(
                    "Date axis demo",
                    "Date axis legend position is wrong");

                chart.pack();
                chart.setVisible(true);
            }
        });
    }
}

Я пробовал

lineChart.getLegend().setHorizontalAlignment(HorizontalAlignment.CENTER);

но это ничего не изменило.

...