Java 数字轴设置为包含指定数字的单位
我使用JFreeChart显示正态分布,并将刻度数更改为标准偏差;但我也希望在滴答声出现的时候,总是有“平均”的价值。交叉张贴 因此,标准偏差=2;平均值=1Java 数字轴设置为包含指定数字的单位,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.
-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);