Java 数字轴设置为包含指定数字的单位

Java 数字轴设置为包含指定数字的单位,java,jfreechart,Java,Jfreechart,我使用JFreeChart显示正态分布,并将刻度数更改为标准偏差;但我也希望在滴答声出现的时候,总是有“平均”的价值。交叉张贴 因此,标准偏差=2;平均值=1 -3 -1 1 3 5 标准差=5;平均值=15 0 5 10 15 20 25 30 JFreeChart.java public class JFreeChartPanel extends JPanel { private final XYPlot plot; double mean = 0.0, sd = 1.

我使用JFreeChart显示正态分布,并将刻度数更改为标准偏差;但我也希望在滴答声出现的时候,总是有“平均”的价值。交叉张贴

因此,标准偏差=2;平均值=1

-3 -1  1 3 5
标准差=5;平均值=15

0 5 10 15 20 25 30
JFreeChart.java

public class JFreeChartPanel extends JPanel {
    private final XYPlot plot;
    double mean = 0.0, sd = 1.0;
    XYDataset dataset = initDataset();
    NumberAxis domain = new NumberAxis("Y") {
    @Override
    protected double calculateLowestVisibleTickValue() {
        double lowTickValue = super.calculateLowestVisibleTickValue();
        if (mean % 2 == 1) {
            return lowTickValue + 1;
        } else {
            return lowTickValue;
        }
    }
};
    public JFreeChartPanel(){
        JFreeChart chart = ChartFactory.createXYLineChart(
            "Normal Distribution",
            "X", 
            "PDF", 
            dataset,
            PlotOrientation.VERTICAL,
            false,
            false,
            false
        );
        plot=chart.getXYPlot();
        domain.setAutoRangeStickyZero(false);
        domain.setTickUnit(new NumberTickUnit(sd));
        plot.setDomainAxis(domain);
        final ChartPanel chartPanel = new ChartPanel(chart);
        setLayout(new BorderLayout());
        add(chartPanel);
    }

    private XYDataset initDataset() {
        double minX=mean-(4*sd),maxX=mean+(4*sd);
        Function2D normal = new NormalDistributionFunction2D(mean, sd);
        XYDataset dataset = DatasetUtilities.sampleFunction2D(normal, minX, maxX, 100, "Normal");
        return dataset;
    }

    public double getMean() {
        return mean;
    }

    public void setMean(double mean) {
       this.mean = mean;
       plot.setDataset(initDataset());
    }

    public double getSd() {
        return sd;
    }

    public void setSd(double sd) {
        this.sd = sd;
        domain.setTickUnit(new NumberTickUnit(sd));
        plot.setDataset(initDataset());
    }
}
UI.java

public class UI extends javax.swing.JFrame {

    public UI() {
        initComponents();
    }

    @SuppressWarnings("unchecked")
    private void initComponents() {
      Auto-generated Netbeans GUI COde
    }                     

    public void updateMean()
    {
        try{
            double m = Double.parseDouble(mean.getText());
            jFreeChartPanel.setMean(m);
        }catch(Exception e){
        }
    }
    public void updateSd()
    {
        try{
            double sd = Double.parseDouble(standardDeviation.getText());
            jFreeChartPanel.setSd(sd);
        }catch(Exception e){
        }
    }

    public static void main(String args[]) {
        try {
            for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
                if ("Windows".equals(info.getName())) {
                    javax.swing.UIManager.setLookAndFeel(info.getClassName());
                    break;
                }
            }
        } catch (ClassNotFoundException ex) {

        }
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new UI().setVisible(true);
            }
        });
    }

    private javax.swing.JPanel inputPanel;
    private main.JFreeChartPanel jFreeChartPanel;
    private javax.swing.JPanel jPanel1;
    private javax.swing.JToggleButton jToggleButton1;
    private javax.swing.JTextField mean;
    private javax.swing.JLabel meanLabel;
    private javax.swing.JTextField standardDeviation;
    private javax.swing.JLabel standardDeviationLabel;
}
从这一点开始,我做了以下修改(根据您的修改),以获得如下所示的µ=15和σ=5的结果:

import org.jfree.chart.axis.NumberAxis;
import org.jfree.chart.axis.NumberTickUnit;
…
private double mean = 15.0, sigma = 5.0;
…
private XYDataset initDataset() {
    double minX = mean - (3 * sigma), maxX = mean + (3 * sigma);
    Function2D normal = new NormalDistributionFunction2D(mean, sigma);
    XYDataset dataset = DatasetUtilities.sampleFunction2D(normal, minX, maxX, 100, "Normal");
    return dataset;
}
…
public JFreeChartPanel() {
    …
    plot = chart.getXYPlot();
    NumberAxis domain = (NumberAxis) plot.getDomainAxis();
    domain.setTickUnit(new NumberTickUnit(sigma));
    …
}

另一种情况是µ=1和σ=2,需要重写
NumberAxis
方法
calculateLowestVisibleTickValue()
使刻度落在奇数值上

NumberAxis domain = new NumberAxis("Y") {
    @Override
    protected double calculateLowestVisibleTickValue() {
        double lowTickValue = super.calculateLowestVisibleTickValue();
        if (mean % 2 == 1) {
            return lowTickValue + 1;
        } else {
            return lowTickValue;
        }
    }
};
domain.setTickUnit(new NumberTickUnit(sigma));
plot = chart.getXYPlot();
plot.setDomainAxis(domain);

为什么[是]对于平均值3和sd 1,以及对于平均值6和sd 2,平均值9和sd 3,图形略微倾斜,依此类推;这是一个演示

如前所述,存在“当范围自动确定时,影响添加到轴范围的边距大小的标志。”

我添加了…代码

JFreeChartPanel
的实例添加到具有µ=1和σ=2的
JFrame
中会产生以下结果:

这发生在平均值较高的情况下

您可以从自动范围中排除零


你在使用DatasetUtilities.sampleFunction2D()像吗?@trashgood我已经编辑了这个问题,并添加了我现在使用的确切代码;我不得不猜测问题出在别处;也许是一个隐藏的变量?@trashgood你能看一看吗?这是一个类,它很短,我不想让这篇文章负担过重。我认为没有影子变量。为了避免碎片化,我更喜欢在网站上保留代码;我已将您的方法调整为以下内容。每次我将SD更改为更高的数字后,X轴上的刻度数都会增加。我想要实现的是,在中值上总是有一个平均值,下一个刻度应该是平均值+标准偏差。最后一件事我不知道为什么图在平均值3和SD 1上也有轻微的偏差,平均值为6 SD 2,平均9 SD 3等等。
domain.setAutoRangeStickyZero(false);
domain.setAutoRangeIncludesZero(false);