JFreeChart x轴刻度

14

我有一个JFree XY线图,它总是从x=0开始。然后根据用户定义的属性文件设置,应用程序会根据该数字进行增量(表示分钟数)。

例如,如果x=0开始,用户定义的设置为5,则刻度为0、5、10、15、20...,或者用户设置为3,则为0、3、6、9、12...非常简单。

我遇到的问题是图表的起始方式。如果我从0开始,那么0就在图表的中间,而不是在左下角的-0.0000005、-0.000004、-0.000003...... 0.000000、0.000001、0.000002...... 0.000005处。

我如何手动添加底部的刻度,即定义应增加2的刻度,并保持不变呢?

2个回答

18
你应该使用NumberAxis,它包含许多方法来定义图表的比例尺。
示例:
// Create an XY Line chart
XYSeries series = new XYSeries("Random Data");
series.add(1.0, 500.2);
series.add(10.0, 694.1);
XYSeriesCollection data = new XYSeriesCollection(series);
JFreeChart chart = ChartFactory.createXYLineChart("XY Series Demo", "X", "Y", data,
                                                  PlotOrientation.VERTICAL, 
                                                  true, true, false);

// Create an NumberAxis
NumberAxis xAxis = new NumberAxis();
xAxis.setTickUnit(new NumberTickUnit(2));

// Assign it to the chart
XYPlot plot = (XYPlot) chart.getPlot();
plot.setDomainAxis(xAxis);

@obourgain 是否可以通过一个常数因子来偏移图表中所有刻度单位标签的位置?或者在轴尺度上的所有值上加上+500? - simgineer

6
基于这个例子,这里有一个使用setTickUnit()动态调整域轴刻度单位的sscce,从值5开始。

image

import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.util.Random;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JSpinner;
import javax.swing.SpinnerNumberModel;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.NumberAxis;
import org.jfree.chart.axis.NumberTickUnit;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.plot.XYPlot;
import org.jfree.data.xy.XYSeries;
import org.jfree.data.xy.XYSeriesCollection;

/** @see https://dev59.com/VmYq5IYBdhLWcg3w-FTQ#14167983 */
public class SSCCE {

    private static final int COUNT = 100;
    private static final int UNITS = 5;
    private static final Random r = new Random();

    public static void main(String[] args) {
        XYSeries series = new XYSeries("Data");
        for (int i = 0; i < COUNT; i++) {
            series.add(i, r.nextGaussian());
        }
        XYSeriesCollection data = new XYSeriesCollection(series);
        final JFreeChart chart = ChartFactory.createXYLineChart("TickUnits",
            "X", "Y", data, PlotOrientation.VERTICAL, true, true, false);
        XYPlot plot = (XYPlot) chart.getPlot();
        final NumberAxis xAxis = (NumberAxis) plot.getDomainAxis();
        xAxis.setTickUnit(new NumberTickUnit(UNITS));
        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                JFrame f = new JFrame("TickUnitDemo");
                f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                f.add(new ChartPanel(chart));
                final JSpinner spinner = new JSpinner(
                    new SpinnerNumberModel(UNITS, 1, COUNT, 1));
                spinner.addChangeListener(new ChangeListener() {

                    @Override
                    public void stateChanged(ChangeEvent e) {
                        JSpinner s = (JSpinner) e.getSource();
                        Number n = (Number) s.getValue();
                        xAxis.setTickUnit(new NumberTickUnit(n.intValue()));
                    }
                });
                JPanel p = new JPanel();
                p.add(new JLabel(chart.getTitle().getText()));
                p.add(spinner);
                f.add(p, BorderLayout.SOUTH);
                f.pack();
                f.setLocationRelativeTo(null);
                f.setVisible(true);
            }
        });

    }
}

如果这不是你想要的,它可能会帮助澄清你的问题。 - trashgod

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接