I am displaying normal distribution using JFreeChart, and I change the tick number to standard deviation; but I would also want there to always be 'mean' value in the middle from which ticks emerge. Cross-posted here.
So standard deviation = 2 ; mean = 1
-3 -1 1 3 5
Standard deviation = 5 ; mean = 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;
}