【问题标题】:JFreeChart x axis scaleJFreeChart x 轴刻度
【发布时间】:2012-12-12 19:24:32
【问题描述】:

我有一个始终从 x = 0 开始的 JFree XY 折线图。然后根据属性文件中的用户定义设置,应用程序会根据该数字递增(这表示以分钟为单位的时间)。

例如,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 的增量,然后保持它?

【问题讨论】:

    标签: java graph jfreechart


    【解决方案1】:

    您应该使用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 添加到轴刻度上的所有值?
    【解决方案2】:

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

    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://stackoverflow.com/a/14167983/230513 */
    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);
                }
            });
    
        }
    }
    

    【讨论】:

    • 如果这不是您所追求的,它可能有助于澄清您的问题。
    猜你喜欢
    • 2012-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-19
    • 2021-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多