Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/352.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JFreeChart图例对齐_Java_Legend_Jfreechart - Fatal编程技术网

Java JFreeChart图例对齐

Java JFreeChart图例对齐,java,legend,jfreechart,Java,Legend,Jfreechart,在中,我在折线图上有多个系列,我希望在绘图区域下方有一个图例,并对齐中心 现在看起来是这样的: 但我想把它放在这些红线之间的中心位置: Y轴标签是动态生成的,因此设置固定的填充或边距现在对我来说不是正确的解决方案 下面是易于复制的代码: import java.awt.Color; import java.awt.EventQueue; import java.awt.image.BufferedImage; import java.text.SimpleDateFormat; impor

在中,我在折线图上有多个系列,我希望在绘图区域下方有一个图例,并对齐中心

现在看起来是这样的:

但我想把它放在这些红线之间的中心位置:

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);
            }
        });
    }
}

但它没有改变任何事情。

+1对于MVCE。但据我所知,这可能很困难:布局的相关部分(即y轴标签的宽度)是“动态”计算的,我认为没有合理的方法将此信息作为偏移量隐藏到图例中。我只找到了一个(粗略的)解决方法:执行
createBuffereImage
调用,然后获取
info.getPlotInfo().getDataArea().getX()
,将其设置为图例的填充,然后创建(实际的、最终的)缓冲图像。结果看起来不错,但方法看起来很奇怪…@Marco13,谢谢,我也考虑过这一点。你认为,让那些红色的边距消失,然后将图例对准中心会更容易吗?(在这种情况下,两行都需要对齐到中心,这样看起来也比实际情况好)您的读边距是什么意思?你在截图上画的线?然而,在任何情况下,实际图例似乎都具有可用区域的全宽,并且内容(即“温度”-字符串)似乎用a排列,类似于
FlowLayout
,它覆盖了全宽,直到它包装到下一行-因此我不确定您将在何处或如何更改此处的对齐方式…是的,我用手画的红边。对于中心对齐,请检查此图像,该图像与图表无关,但显示两行对齐:来自API文档:hAlign-水平对齐(当前忽略)。+1表示MVCE。但据我所知,这可能很困难:布局的相关部分(即y轴标签的宽度)是“动态”计算的,我认为没有合理的方法将此信息作为偏移量隐藏到图例中。我只找到了一个(粗略的)解决方法:执行
createBuffereImage
调用,然后获取
info.getPlotInfo().getDataArea().getX()
,将其设置为图例的填充,然后创建(实际的、最终的)缓冲图像。结果看起来不错,但方法看起来很奇怪…@Marco13,谢谢,我也考虑过这一点。你认为,让那些红色的边距消失,然后将图例对准中心会更容易吗?(在这种情况下,两行都需要对齐到中心,这样看起来也比实际情况好)您的读边距是什么意思?你在截图上画的线?然而,在任何情况下,实际图例似乎都具有可用区域的全宽,并且内容(即“温度”-字符串)似乎用a排列,类似于
FlowLayout
,它覆盖了全宽,直到它包装到下一行-因此我不确定您将在何处或如何更改此处的对齐方式…是的,我用手画的红边。对于中心对齐,请检查此图像,该图像与图表无关,但显示两行对齐:来自API文档:hAlign-水平对齐(当前已忽略)。
lineChart.getLegend().setHorizontalAlignment(HorizontalAlignment.CENTER);