in JFreeChart У меня есть несколько рядов на линейной диаграмме, и я хотел бы иметь легенду ниже центра области, выровненной по центру .
Сейчас это выглядит такэто:
Но я хочу расположить его в центре между этими красными линиями:
Ярлыки оси 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);
но это ничего не изменило.