From: Yoav F. <yf...@us...> - 2008-09-09 20:43:29
|
Update of /cvsroot/jboost/jboost/src/jboost/visualization In directory sc8-pr-cvs17.sourceforge.net:/tmp/cvs-serv21955/src/jboost/visualization Modified Files: DataSet.java HistogramFrame.java Added Files: DataElement.java Log Message: VisualizeScores.py is working. Index: DataSet.java =================================================================== RCS file: /cvsroot/jboost/jboost/src/jboost/visualization/DataSet.java,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** DataSet.java 3 Sep 2008 18:09:54 -0000 1.2 --- DataSet.java 9 Sep 2008 20:43:24 -0000 1.3 *************** *** 1,6 **** package jboost.visualization; import java.util.Random; ! import java.util.TreeSet; import org.jfree.data.xy.XYDataset; --- 1,11 ---- package jboost.visualization; + import java.util.ArrayList; + import java.util.Arrays; + import java.util.Collections; + import java.util.List; import java.util.Random; ! import java.util.ArrayList; ! import java.util.Vector; import org.jfree.data.xy.XYDataset; *************** *** 14,134 **** public class DataSet { ! private TreeSet<DataElement> data; ! public DataSet(int size) { ! data = new TreeSet<DataElement>(); ! Random generator = new Random(12345678L); ! for (int i = 0; i < 2*size; i++) { ! DataElement element = new DataElement(); ! int label = (i<size)?-1:1; ! element.value = generator.nextGaussian() + label/2.0+5; ! element.index = i; ! element.label = label; ! data.add(element); ! } } ! public DataSet(int[] indexes, double[] values, int[] labels) { ! data = new TreeSet<DataElement>(); ! for (int i = 0; i < indexes.length; i++) { ! DataElement element = new DataElement(); ! element.value = values[i]; ! element.index = indexes[i]; ! element.label = labels[i]; ! data.add(element); ! } } public double getMin() { ! return data.first().value; } public double getMax() { ! return data.last().value; ! } ! ! public double[] getFPTP(double v) { ! DataElement e = data.tailSet(new DataElement(v)).first(); ! double[] answer = {e.FPR,e.TPR}; ! return answer; } ! public double[] getSet(int label) { ! Object[] a = (Object[]) data.toArray(); ! int count=0; ! for (int i=0; i<a.length; i++) { ! DataElement e = ((DataElement) a[i]); ! if(e.label == label) { ! count++; } } ! if(count==0) {return new double[] {0.0};} ! double[] answer = new double[count]; ! count=0; ! for (int i=0; i<a.length; i++) { ! DataElement e = ((DataElement) a[i]); ! if(e.label == label) { ! answer[count] = e.value; ! count++; } } ! return answer; } ! public XYDataset generateRoC(int neg_label, int pos_label) { XYSeries roc = new XYSeries("ROC"); - Object[] a = (Object[]) data.toArray(); - - int neg_count=0; - int pos_count=0; - for(int i=0; i<a.length; i++) { - DataElement e = ((DataElement) a[i]); - if(e.label == neg_label) neg_count++; - else if(e.label == pos_label) pos_count++; - } - double total_neg=neg_count; - double total_pos=pos_count; - neg_count=0; - pos_count=0; for(int i=a.length-1; i >= 0; i--) { DataElement e = ((DataElement) a[i]); ! if(e.label == neg_label) neg_count++; ! else if(e.label == pos_label) pos_count++; ! e.TPR=pos_count/total_pos; ! e.FPR=neg_count/total_neg; ! ! // System.out.printf("%f: %f,%f%n",e.value,e.FPR,e.TPR); ! roc.add(e.FPR, e.TPR); } ! XYSeriesCollection dataset = new XYSeriesCollection(); ! dataset.addSeries(roc); ! return dataset; } public static void main(String[] args) { ! DataSet test = new DataSet(50); test.generateRoC(-1,1); double[] a = test.getFPTP(5.0); ! System.out.printf("%f; %f%n",a[0],a[1]); ! System.out.println("yoav was here!"); ! } ! } ! class DataElement implements Comparable{ ! protected double value; ! protected int label; ! protected int index; ! protected double FPR,TPR; ! ! public DataElement(double v) { ! value=v; ! } ! public DataElement() {} ! ! public int compareTo(Object that) { ! return (int) Math.signum(this.value-((DataElement) that).value); ! } ! } --- 19,232 ---- public class DataSet { ! private String[] iterList; ! ! private int iteration=0; ! /** ! * data is a list of ArrayLists, each list element corresponds to a (boosting) iteration, ! * Each List entry consists of a sorted list of DataElements, sorted according to their score. ! */ ! private ArrayList<ArrayList<DataElement>> data; ! private double minScore,maxScore; ! private int total_pos,total_neg; ! private int neg_label=-1,pos_label=+1; ! ! public DataSet(String[] iterList) { ! this.iterList = iterList; ! data = new ArrayList<ArrayList<DataElement>>(); ! for(int i=0; i<iterList.length; i++) { ! data.add(new ArrayList<DataElement>()); ! } } ! public DataSet(int size,int iterations) { ! data = new ArrayList<ArrayList<DataElement>>(); ! iterList = new String[iterations]; ! Random generator = new Random(12345678L); ! ! for (int iter = 0; iter<iterations; iter++) { ! iterList[iter] = "iteration "+iter; ! data.add(new ArrayList<DataElement>()); ! for (int i = 0; i < 2*size; i++) { ! int label = (i<size)?-1:1; ! double value = Math.floor(generator.nextGaussian() + (iter*label)/4.0+5); ! this.addDataElement(new DataElement(value,i,label),iter); ! } ! } ! this.preProcessDataset(); } + + public void addDataElement(DataElement e,int iteration) { + ArrayList<DataElement> d=data.get(iteration); + d.add(e); + } + + public void preProcessDataset() { + int size = data.size(); + //System.out.printf("data.size = %d%n", size); + for(int i=0; i<size; i++) { + addScoresList(data.get(i),i); + //System.out.printf("finished pre-processing %d%n",i); + } + } + + /** + * addScoresList processes a list of scores, + * computes the true-positive-rate (TPR) and false-positive-rate (FPR) for each element in the list + * and adds the list to the data + * + * @param scores + * void + */ + public void addScoresList(ArrayList<DataElement> scores,int index) { + Collections.sort(scores); + Object[] a = (Object[]) scores.toArray(); + System.out.printf("index=%d, a.length=%d%n",index,a.length); + + int neg_count=0; + int pos_count=0; + if(index==0) { + minScore = scores.get(0).value; + maxScore = scores.get(scores.size()-1).value; + + for(int i=0; i<a.length; i++) { + DataElement e = ((DataElement) a[i]); + if(e.label == neg_label) neg_count++; + else if(e.label == pos_label) pos_count++; + } + total_neg=neg_count; + total_pos=pos_count; + //System.out.printf("total_neg=%d, total_pos=%d%n",total_neg,total_pos); + + } else { + minScore = Math.min(minScore,scores.get(0).value); + maxScore = Math.max(maxScore,scores.get(scores.size()-1).value); + } + + neg_count=0; + pos_count=0; + for(int i=a.length-1; i >= 0; i--) { + DataElement e = ((DataElement) a[i]); + if(e.label == neg_label) neg_count++; + else if(e.label == pos_label) pos_count++; + e.truePositives=pos_count; + e.falsePositives=neg_count; + //System.out.println(e); + } + } + public double getMin() { ! return minScore; } public double getMax() { ! return maxScore; } ! public double[] computeHistogram(int label,int bins) { ! ! double[] h = new double[bins]; ! double step = (maxScore-minScore)/bins; ! double s=minScore+step; ! double prev = total_pos; ! if(label != pos_label) prev = total_neg; ! ArrayList<DataElement> iterData = data.get(iteration); ! for(int i=0; i<bins; i++) { ! DataElement e = binarySearch(iterData, s); ! //System.out.printf("label=%d, i= %d, s=%f, prev=%f, e=",label,i,s,prev); ! //System.out.println(e); ! if(label==pos_label) { ! h[i]=prev-e.truePositives; ! prev=e.truePositives; ! } else { ! h[i]=prev-e.falsePositives; ! prev=e.falsePositives; } + s=s+step; + //System.out.println(prev); } ! return h; ! } ! ! private DataElement binarySearch(ArrayList<DataElement> list, double s) { ! int l=list.size(); ! if(s<list.get(0).value) return list.get(0); ! if(s>list.get(l-1).value) return list.get(list.size()-1); ! double l2=Math.floor(Math.log((double) l)/Math.log(2.0)); ! int index= 0; ! int step= (int) Math.pow(2, l2); ! DataElement e=list.get(index); ! while(e.value != s && step>0) { ! if(index+step<l) { ! if(list.get(index+step).value<=s) {index=index+step;} } + e=list.get(index); + //System.out.printf("s=%f,e.value=%f,index=%d,step=%d%n",s,e.value,index,step); + step=step/2; } ! return e; } ! public XYSeries generateRoC(int neg_label, int pos_label) { XYSeries roc = new XYSeries("ROC"); + + Object[] a = (Object[]) data.get(iteration).toArray(); for(int i=a.length-1; i >= 0; i--) { DataElement e = ((DataElement) a[i]); ! roc.add(e.falsePositives/total_neg, e.truePositives/total_pos); } ! return roc; ! } ! ! public double[] getFPTP(double v) { ! DataElement e = binarySearch(data.get(iteration),v); ! double[] answer = {e.falsePositives/total_neg,e.truePositives/total_pos}; ! return answer; } + /** + * @return the iteration + */ + public int getIteration() { + return iteration; + } + + /** + * @param iteration the iteration to set + */ + public void setIteration(int iteration) { + this.iteration = iteration; + } + + /** + * @return the iterList + */ + public String[] getIterList() { + return iterList; + } + public static void main(String[] args) { ! DataSet test = new DataSet(1000,3); ! ! System.out.printf("range of scores = [%f,%f]%n",test.minScore,test.maxScore); ! test.generateRoC(-1,1); double[] a = test.getFPTP(5.0); ! System.out.printf("%d: %f; %f%n",test.getIteration(),a[0],a[1]); ! test.setIteration(2); ! test.generateRoC(-1,1); ! a = test.getFPTP(5.0); ! System.out.printf("%d: %f; %f%n",test.getIteration(),a[0],a[1]); ! ! double[] hist = test.computeHistogram(1, 30); ! for(int i=0; i<hist.length; i++) System.out.printf("%f, ",hist[i]); ! System.out.println(); ! hist = test.computeHistogram(-1, 30); ! for(int i=0; i<hist.length; i++) System.out.printf("%f, ",hist[i]); ! System.out.println(); ! } } --- NEW FILE: DataElement.java --- /** * */ package jboost.visualization; /** * @author yoavfreund * */ public class DataElement implements Comparable{ protected double value; protected int label; protected int index; protected double falsePositives,truePositives; public DataElement() {} public DataElement(double value) { this.value=value; } public DataElement(double value, int index, int label) { this.value = value; this.index = index; this.label = label; } public String toString() { String s = "[index="+Integer.toString(index) +",value="+Double.toString(value) +",label="+Integer.toString(label) +",TP="+Double.toString(truePositives) +",FP="+Double.toString(falsePositives) +"]"; return s; } public int compareTo(Object that) { return (int) Math.signum(this.value-((DataElement) that).value); } } Index: HistogramFrame.java =================================================================== RCS file: /cvsroot/jboost/jboost/src/jboost/visualization/HistogramFrame.java,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** HistogramFrame.java 3 Sep 2008 18:09:54 -0000 1.2 --- HistogramFrame.java 9 Sep 2008 20:43:24 -0000 1.3 *************** *** 1,14 **** --- 1,23 ---- package jboost.visualization; import java.awt.Color; + import java.awt.GradientPaint; + import java.awt.event.ComponentAdapter; + import javax.swing.BorderFactory; import javax.swing.BoxLayout; + import javax.swing.DefaultComboBoxModel; import javax.swing.JComponent; + import javax.swing.JList; import javax.swing.JPanel; import javax.swing.JSlider; import javax.swing.JSplitPane; + import javax.swing.ListModel; import javax.swing.SwingUtilities; import javax.swing.WindowConstants; + import javax.swing.border.BevelBorder; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; + import javax.swing.event.ListSelectionEvent; + import javax.swing.event.ListSelectionListener; import org.jdesktop.layout.GroupLayout; *************** *** 17,31 **** --- 26,69 ---- import org.jfree.chart.ChartPanel; import org.jfree.chart.JFreeChart; + import org.jfree.chart.axis.DateAxis; + import org.jfree.chart.axis.NumberAxis; + import org.jfree.chart.axis.SymbolAxis; + import org.jfree.chart.event.MarkerChangeListener; + import org.jfree.chart.event.PlotChangeEvent; + import org.jfree.chart.event.PlotChangeListener; import org.jfree.chart.plot.IntervalMarker; + import org.jfree.chart.plot.Plot; import org.jfree.chart.plot.PlotOrientation; import org.jfree.chart.plot.ValueMarker; import org.jfree.chart.plot.XYPlot; + import org.jfree.chart.renderer.category.BarRenderer; + import org.jfree.chart.renderer.xy.ClusteredXYBarRenderer; import org.jfree.chart.renderer.xy.XYBarRenderer; + import org.jfree.chart.renderer.xy.XYItemRenderer; import org.jfree.data.Range; + import org.jfree.data.general.SeriesChangeEvent; import org.jfree.data.statistics.HistogramDataset; + import org.jfree.data.xy.DefaultIntervalXYDataset; import org.jfree.data.xy.IntervalXYDataset; import org.jfree.data.xy.XYDataset; + import org.jfree.data.xy.XYIntervalSeries; + import org.jfree.data.xy.XYIntervalSeriesCollection; + import org.jfree.data.xy.XYSeries; + import org.jfree.data.xy.XYSeriesCollection; import org.jfree.ui.Layer; + + /** + * This code was edited or generated using CloudGarden's Jigloo + * SWT/Swing GUI Builder, which is free for non-commercial + * use. If Jigloo is being used commercially (ie, by a corporation, + * company or business for any purpose whatever) then you + * should purchase a license for each developer using Jigloo. + * Please visit www.cloudgarden.com for details. + * Use of Jigloo implies acceptance of these licensing terms. + * A COMMERCIAL LICENSE HAS NOT BEEN PURCHASED FOR + * THIS MACHINE, SO JIGLOO OR THIS CODE CANNOT BE USED + * LEGALLY FOR ANY CORPORATE OR COMMERCIAL PURPOSE. + */ /** * @author yoavfreund *************** *** 42,50 **** private JPanel jPanel2; private JFreeChart histogramChart; private ChartPanel histogramPanel; private JFreeChart rocChart; private ChartPanel rocPanel; ! private static double upper_limit; private static double lower_limit; --- 80,99 ---- private JPanel jPanel2; + private int negLabel=-1; + private int posLabel=+1; + private double[] negClassScores,posClassScores; + + private XYIntervalSeriesCollection[] histogramDataset; + private int noOfBins=100; private JFreeChart histogramChart; private ChartPanel histogramPanel; + private XYSeriesCollection rocDataset; private JFreeChart rocChart; private ChartPanel rocPanel; ! ! private JList jList1; ! private JSplitPane jSplitPane2; ! private String[] iterNoList; ! private static double upper_limit; private static double lower_limit; *************** *** 61,65 **** */ public static void main(String[] args) { ! final DataSet dataset = new DataSet(SampleSize); SwingUtilities.invokeLater(new Runnable() { public void run() { --- 110,114 ---- */ public static void main(String[] args) { ! final DataSet dataset = new DataSet(SampleSize,10); SwingUtilities.invokeLater(new Runnable() { public void run() { *************** *** 71,77 **** --- 120,130 ---- } + public HistogramFrame(DataSet dataset) { super(); rawData = dataset; + lower_limit=dataset.getMin(); + upper_limit=dataset.getMax(); + this.iterNoList = dataset.getIterList(); initGUI(); } *************** *** 81,92 **** GroupLayout thisLayout = new GroupLayout((JComponent)getContentPane()); getContentPane().setLayout(thisLayout); thisLayout.setVerticalGroup(thisLayout.createSequentialGroup() ! .add(getJSplitPane1(), 0, 407, Short.MAX_VALUE) ! .addPreferredGap(LayoutStyle.RELATED)); thisLayout.setHorizontalGroup(thisLayout.createSequentialGroup() ! .add(getJSplitPane1(), 0, 632, Short.MAX_VALUE)); ! setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE); pack(); ! this.setSize(632, 434); } catch (Exception e) { e.printStackTrace(); --- 134,178 ---- GroupLayout thisLayout = new GroupLayout((JComponent)getContentPane()); getContentPane().setLayout(thisLayout); + setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE); + { + jSplitPane2 = new JSplitPane(); + jSplitPane2.setBorder(BorderFactory.createEtchedBorder(BevelBorder.LOWERED)); + jSplitPane2.setDividerLocation(800); + { + ListModel jList1Model = + new DefaultComboBoxModel(iterNoList); + jList1 = new JList(); + jSplitPane2.add(getJSplitPane1(), JSplitPane.LEFT); + jSplitPane2.add(jList1, JSplitPane.RIGHT); + jList1.setModel(jList1Model); + jList1.setPreferredSize(new java.awt.Dimension(85, 408)); + jList1.addListSelectionListener(new ListSelectionListener() { + public void valueChanged(ListSelectionEvent evt) { + + if(!evt.getValueIsAdjusting()) { + JList list = (JList) evt.getSource(); + int iter = list.getSelectedIndex(); + System.out.printf("jList1.valueChanged, item index=%d, id=%s%n",iter,list.getSelectedValue()); + rawData.setIteration(iter); //update the rawDataSet according to the new iteration. + updateHistogramDataset(); + //System.out.printf("histogramDataset has %d series%n",histogramDataset.getSeriesCount()); + //histogramDataset.seriesChanged(null); + + XYSeries rocSeries = rawData.generateRoC(negLabel,posLabel); + rocDataset.removeSeries(0); + rocDataset.addSeries(rocSeries); + updateUpperMarker(); + updateLowerMarker(); + } + } + }); + } + } thisLayout.setVerticalGroup(thisLayout.createSequentialGroup() ! .add(jSplitPane2, 0, 412, Short.MAX_VALUE)); thisLayout.setHorizontalGroup(thisLayout.createSequentialGroup() ! .add(jSplitPane2, 0, 886, Short.MAX_VALUE)); pack(); ! this.setSize(886, 434); } catch (Exception e) { e.printStackTrace(); *************** *** 97,113 **** if(jSplitPane1 == null) { jSplitPane1 = new JSplitPane(); { jPanel1 = new JPanel(); jSplitPane1.add(jPanel1, JSplitPane.RIGHT); ! jPanel1.setPreferredSize(new java.awt.Dimension(263, 393)); BoxLayout jPanel1Layout = new BoxLayout(jPanel1, javax.swing.BoxLayout.Y_AXIS); jPanel1.setLayout(jPanel1Layout); { ! IntervalXYDataset dataset = createHistogramDataset(); ! histogramChart = createHistChart(dataset); histogramPanel = new ChartPanel(histogramChart); jPanel1.add(histogramPanel); histogramPanel.setPopupMenu(null); } } --- 183,212 ---- if(jSplitPane1 == null) { jSplitPane1 = new JSplitPane(); + jSplitPane1.setPreferredSize(new java.awt.Dimension(546, 408)); + jSplitPane1.setDividerLocation(400); + jSplitPane1.setDoubleBuffered(true); { jPanel1 = new JPanel(); jSplitPane1.add(jPanel1, JSplitPane.RIGHT); ! jPanel1.setPreferredSize(new java.awt.Dimension(10, 406)); BoxLayout jPanel1Layout = new BoxLayout(jPanel1, javax.swing.BoxLayout.Y_AXIS); jPanel1.setLayout(jPanel1Layout); { ! histogramDataset = new XYIntervalSeriesCollection[2]; ! histogramDataset[0] = new XYIntervalSeriesCollection(); ! histogramDataset[1] = new XYIntervalSeriesCollection(); ! updateHistogramDataset(); ! histogramChart = createHistogramChart(histogramDataset); ! ! double initialLocation = (upper_limit+lower_limit)/2.0; ! histMarker = new IntervalMarker(initialLocation,initialLocation); ! XYPlot plot = (XYPlot) histogramChart.getPlot(); ! plot.addDomainMarker(histMarker, Layer.BACKGROUND); ! histogramPanel = new ChartPanel(histogramChart); jPanel1.add(histogramPanel); histogramPanel.setPopupMenu(null); + histogramPanel.setPreferredSize(new java.awt.Dimension(10, 374)); } } *************** *** 115,127 **** jPanel2 = new JPanel(); jSplitPane1.add(jPanel2, JSplitPane.LEFT); ! jPanel2.setPreferredSize(new java.awt.Dimension(291, 393)); BoxLayout jPanel2Layout = new BoxLayout(jPanel2, javax.swing.BoxLayout.Y_AXIS); jPanel2.setLayout(jPanel2Layout); { ! rocChart = createRocChart(rawData.generateRoC(-1, 1)); rocPanel = new ChartPanel(rocChart); jPanel2.add(rocPanel); rocPanel.setPopupMenu(null); } } --- 214,231 ---- jPanel2 = new JPanel(); jSplitPane1.add(jPanel2, JSplitPane.LEFT); ! jPanel2.setPreferredSize(new java.awt.Dimension(10, 393)); BoxLayout jPanel2Layout = new BoxLayout(jPanel2, javax.swing.BoxLayout.Y_AXIS); jPanel2.setLayout(jPanel2Layout); + jPanel2.setOpaque(false); { ! rocDataset = new XYSeriesCollection(); ! XYSeries rocSeries = rawData.generateRoC(negLabel,posLabel); ! rocDataset.addSeries(rocSeries); ! rocChart = createRocChart(rocDataset); rocPanel = new ChartPanel(rocChart); jPanel2.add(rocPanel); rocPanel.setPopupMenu(null); + rocPanel.setPreferredSize(new java.awt.Dimension(10, 406)); } } *************** *** 130,144 **** jPanel1.add(jSlider1); jSlider1.setLayout(null); jSlider1.addChangeListener(new ChangeListener() { public void stateChanged(ChangeEvent evt) { ! ! int pos = (int)jSlider1.getValue(); ! double v=lower_limit+pos*(upper_limit-lower_limit)/100.0; ! histMarker.setEndValue(v); ! if (!jSlider1.getValueIsAdjusting()) { ! double[] FPTP = rawData.getFPTP(v); ! upper_fprMarker.setValue(FPTP[0]); ! upper_tprMarker.setValue(FPTP[1]); ! } } }); --- 234,241 ---- jPanel1.add(jSlider1); jSlider1.setLayout(null); + jSlider1.setPreferredSize(new java.awt.Dimension(10, 16)); jSlider1.addChangeListener(new ChangeListener() { public void stateChanged(ChangeEvent evt) { ! updateUpperMarker(); } }); *************** *** 148,161 **** jPanel1.add(jSlider2); jSlider2.setLayout(null); jSlider2.addChangeListener(new ChangeListener() { public void stateChanged(ChangeEvent evt) { ! int pos = (int)jSlider2.getValue(); ! double v=lower_limit+pos*(upper_limit-lower_limit)/100.0; ! histMarker.setStartValue(v); ! if (!jSlider2.getValueIsAdjusting()) { ! double[] FPTP = rawData.getFPTP(v); ! lower_fprMarker.setValue(FPTP[0]); ! lower_tprMarker.setValue(FPTP[1]); ! } } }); --- 245,252 ---- jPanel1.add(jSlider2); jSlider2.setLayout(null); + jSlider2.setPreferredSize(new java.awt.Dimension(10, 16)); jSlider2.addChangeListener(new ChangeListener() { public void stateChanged(ChangeEvent evt) { ! updateLowerMarker(); } }); *************** *** 166,218 **** } ! /** ! * Creates a sample ! * ! * @return the dataset. ! */ ! private static IntervalXYDataset createHistogramDataset() { ! HistogramDataset dataset = new HistogramDataset(); ! double[] negSet = rawData.getSet(-1); ! double[] posSet = rawData.getSet(1); ! System.out.printf("negSet:%d,posSet:%d%n",negSet.length,posSet.length); ! dataset.addSeries("H1", negSet, 100, rawData.getMin(), rawData.getMax()); ! dataset.addSeries("H2", posSet, 100, rawData.getMin(), rawData.getMax()); ! return dataset; } ! /** ! * Creates a chart. ! * ! * @param dataset a dataset. ! * ! * @return The chart. ! */ ! private static JFreeChart createHistChart(IntervalXYDataset dataset) { ! JFreeChart chart = ChartFactory.createHistogram( ! "Histogram", ! null, ! null, ! dataset, ! PlotOrientation.VERTICAL, ! false, /* No Legend */ ! true, ! false ! ); ! XYPlot plot = (XYPlot) chart.getPlot(); ! Range range = plot.getDataRange(plot.getDomainAxis()); ! System.out.println(range); ! upper_limit = range.getUpperBound(); ! lower_limit = range.getLowerBound(); ! plot.setForegroundAlpha(0.85f); ! XYBarRenderer renderer = (XYBarRenderer) plot.getRenderer(); ! renderer.setDrawBarOutline(false); ! ! histMarker = new IntervalMarker((lower_limit+upper_limit)/2.0,(lower_limit+upper_limit)/2.0); ! ! plot.addDomainMarker(histMarker, Layer.BACKGROUND); ! return chart; } private static JFreeChart createRocChart(XYDataset dataset) { JFreeChart chart = ChartFactory.createXYLineChart( --- 257,346 ---- } ! private void updateUpperMarker() { ! int pos = (int)jSlider1.getValue(); ! double v=lower_limit+pos*(upper_limit-lower_limit)/100.0; ! histMarker.setEndValue(v); ! if (!jSlider1.getValueIsAdjusting()) { ! double[] FPTP = rawData.getFPTP(v); ! upper_fprMarker.setValue(FPTP[0]); ! upper_tprMarker.setValue(FPTP[1]); ! } ! } ! ! private void updateLowerMarker() { ! int pos = (int)jSlider2.getValue(); ! double v=lower_limit+pos*(upper_limit-lower_limit)/100.0; ! histMarker.setStartValue(v); ! if (!jSlider2.getValueIsAdjusting()) { ! double[] FPTP = rawData.getFPTP(v); ! lower_fprMarker.setValue(FPTP[0]); ! lower_tprMarker.setValue(FPTP[1]); ! } ! } ! ! /** ! * @param listener ! * @see org.jfree.chart.plot.Marker#addChangeListener(org.jfree.chart.event.MarkerChangeListener) ! */ ! public void addChangeListener(MarkerChangeListener listener) { ! histMarker.addChangeListener(listener); ! } ! ! ! private void updateHistogramDataset() { ! ! if(histogramDataset[0].getSeriesCount()>0) { ! histogramDataset[0].removeAllSeries(); ! histogramDataset[1].removeAllSeries(); ! } ! ! XYIntervalSeries posSeries = new XYIntervalSeries("positive"); ! XYIntervalSeries negSeries = new XYIntervalSeries("negative"); ! double[] posHist = rawData.computeHistogram(1, noOfBins); ! double[] negHist = rawData.computeHistogram(-1,noOfBins); ! ! double min=rawData.getMin(); ! double max=rawData.getMax(); ! ! double x=min; ! double step=(max-min)/noOfBins; ! for(int i=0; i<noOfBins; i++){ ! posSeries.add(x, x, x+(step/2), posHist[i], 0, posHist[i]); ! negSeries.add(x+(step/2),x+(step/2),x+step, negHist[i], 0, negHist[i]); ! x=x+step; ! } ! histogramDataset[0].addSeries(posSeries); ! histogramDataset[1].addSeries(negSeries); } ! private static JFreeChart createHistogramChart(IntervalXYDataset[] dataset) { ! ! XYBarRenderer posRenderer = new XYBarRenderer(); ! posRenderer.setSeriesPaint(0,Color.blue); ! XYBarRenderer negRenderer = new XYBarRenderer(); ! negRenderer.setSeriesPaint(0,Color.red); ! XYPlot plot = new XYPlot(dataset[0], ! new NumberAxis("score"), ! new NumberAxis("count"), ! posRenderer); ! plot.setDataset(1, dataset[1]); ! plot.setRenderer(1, negRenderer); ! ! //plot.setBackgroundPaint(Color.lightGray); ! //plot.setDomainGridlinePaint(Color.white); ! //plot.setRangeGridlinePaint(Color.white); ! ! JFreeChart chart = new JFreeChart( ! "Histogram", ! JFreeChart.DEFAULT_TITLE_FONT, ! plot, ! false // legend ! ); ! return chart; } + + private static JFreeChart createRocChart(XYDataset dataset) { JFreeChart chart = ChartFactory.createXYLineChart( |