Example usage for org.jfree.data.statistics HistogramDataset addSeries

List of usage examples for org.jfree.data.statistics HistogramDataset addSeries

Introduction

In this page you can find the example usage for org.jfree.data.statistics HistogramDataset addSeries.

Prototype

public void addSeries(Comparable key, double[] values, int bins, double minimum, double maximum) 

Source Link

Document

Adds a series to the dataset.

Usage

From source file:org.jfree.data.statistics.HistogramDatasetTest.java

/**
 * Some checks for bug 1553088.  An IndexOutOfBoundsException is thrown
 * when a data value is *very* close to the upper limit of the last bin.
 *///  ww w . j  a  v a2s.  co  m
@Test
public void test1553088() {
    double[] values = { -1.0, 0.0, -Double.MIN_VALUE, 3.0 };
    HistogramDataset d = new HistogramDataset();
    d.addSeries("S1", values, 2, -1.0, 0.0);
    assertEquals(-1.0, d.getStartXValue(0, 0), EPSILON);
    assertEquals(-0.5, d.getEndXValue(0, 0), EPSILON);
    assertEquals(1.0, d.getYValue(0, 0), EPSILON);

    assertEquals(-0.5, d.getStartXValue(0, 1), EPSILON);
    assertEquals(0.0, d.getEndXValue(0, 1), EPSILON);
    assertEquals(3.0, d.getYValue(0, 1), EPSILON);
}

From source file:org.jfree.data.statistics.HistogramDatasetTest.java

/**
 * This test is derived from a reported bug.
 *///from  ww w.  j a v a  2 s  .  c  om
@Test
public void testBinBoundaries() {
    double[] values = { -5.000000000000286E-5 };
    int bins = 1260;
    double minimum = -0.06307522528160199;
    double maximum = 0.06297522528160199;
    HistogramDataset d = new HistogramDataset();
    d.addSeries("S1", values, bins, minimum, maximum);
    assertEquals(0.0, d.getYValue(0, 629), EPSILON);
    assertEquals(1.0, d.getYValue(0, 630), EPSILON);
    assertEquals(0.0, d.getYValue(0, 631), EPSILON);
    assertTrue(values[0] > d.getStartXValue(0, 630));
    assertTrue(values[0] < d.getEndXValue(0, 630));
}

From source file:edu.ku.brc.specify.plugins.sgr.HistogramChart.java

private void update() {
    UIRegistry.loadAndPushResourceBundle("specify_plugins");

    HistogramDataset dataSet = new HistogramDataset();
    double max = resultSet.getMax();

    dataSet.addSeries(getResourceString("SGR_HISTO_DATASERIES"), resultSet.getValues(1.0), 40, 0.0, max);

    JFreeChart chart = ChartFactory.createHistogram(getResourceString("SGR_HISTO_TITLE"),
            getResourceString("SGR_HISTO_X_AXIS"), getResourceString("SGR_HISTO_Y_AXIS"), dataSet,
            PlotOrientation.VERTICAL, false, // include legend
            true, // tooltips?
            false // URLs?
    );/*from   ww w .j  ava2s  . co  m*/

    UIRegistry.popResourceBundle();

    XYPlot plot = chart.getXYPlot();
    CustomRenderer.setDefaultBarPainter(new StandardXYBarPainter());
    CustomRenderer renderer = new CustomRenderer(dataSet);
    plot.setRenderer(renderer);
    renderer.setMargin(0.1);

    ChartPanel chartPanel = new ChartPanel(chart, true, true, true, true, true);
    removeAll();
    add(chartPanel);
    validate();
}

From source file:gda.gui.dv.panels.vispanels.ColourSelector.java

/**
 * The function that performs the histogram Drawing
 * /* www  .  j  a v a  2 s. com*/
 * @param raw
 *            the raw data
 * @return the new data in the appropriate form
 */
@Override
public ImageData cast(DoubleDataset raw) {

    dataLink = raw;

    if (max == null) {
        max = raw.max().doubleValue();
    }
    if (min == null) {
        min = raw.min().doubleValue();
    }

    ImageData result = colourCast(raw, max, min);

    // if old stuff exists then remove it.
    if (chart != null) {
        chart.removeAll();
    }

    // now plot the histogram

    HistogramDataset histData = new HistogramDataset();
    histData.addSeries("h1", raw.getData(), 100, min, max);
    histogram = ChartFactory.createHistogram("Histogram", "Value", "Counts", histData, PlotOrientation.VERTICAL,
            false, false, false);

    if (unconfigured == false) {
        this.remove(chart);
    }
    unconfigured = false;

    chart = new DrawChart(histogram);

    chart.setMouseZoomable(false);

    chart.setPreferredSize(new Dimension(300, 300));
    chart.setMinimumSize(new Dimension(200, 200));

    c.gridx = 0;
    c.gridy = 4;
    c.gridwidth = 2;

    this.add(chart, c);

    chart.addMouseListener(new MouseListener() {
        Double tmin = min;
        Double tmax = max;

        @Override
        public void mouseClicked(MouseEvent e) {

        }

        @Override
        public void mouseEntered(MouseEvent e) {

        }

        @Override
        public void mouseExited(MouseEvent e) {

        }

        @Override
        public void mousePressed(MouseEvent e) {
            SimpleDataCoordinate coordinates = convertMouseEvent(e);
            if (chart.getScreenDataArea().contains(e.getX(), e.getY())) {
                tmin = coordinates.getX();
            } else {
                if (chart.getScreenDataArea().outcode(e.getX(), e.getY()) != Rectangle2D.OUT_RIGHT) {
                    //                  System.out.println("out of bounds");
                    //                  System.out.printf("Mouse: %d\n", e.getX());
                } else {
                    tmin = max;
                }
            }

        }

        @Override
        public void mouseReleased(MouseEvent e) {
            boolean update = false;
            SimpleDataCoordinate coordinates = convertMouseEvent(e);

            if (chart.getScreenDataArea().contains(e.getX(), e.getY())) {
                tmax = coordinates.getX();
                update = true;
            } else {
                if (chart.getScreenDataArea().outcode(e.getX(), e.getY()) != Rectangle2D.OUT_LEFT) {
                    //                  System.out.println("out of bounds");
                    //                  System.out.printf("Mouse: %d\n", e.getX());
                } else {
                    tmax = min;
                    update = true;
                }
            }
            if (update && tmin != tmax) {
                if (tmin > tmax) { // check and correct limits
                    Double t = tmin;
                    tmin = tmax;
                    tmax = t;
                }
                min = tmin;
                max = tmax;

                owner.getDataSetImage().applyColorCast();
                owner.getDataSetPlot3D().applyColorCast();
                owner.getDataSetImage().repaint();
            }
        }

        public SimpleDataCoordinate convertMouseEvent(MouseEvent me) {
            return new SimpleDataCoordinate(

                    histogram.getXYPlot().getDomainAxis().java2DToValue(me.getX(), chart.getScreenDataArea(),
                            histogram.getXYPlot().getDomainAxisEdge()),

                    histogram.getXYPlot().getRangeAxis().java2DToValue(me.getY(), chart.getScreenDataArea(),
                            histogram.getXYPlot().getRangeAxisEdge()));

        }

    });

    lblchart.invalidate();
    lblchart.validate();

    this.invalidate();
    this.validate();

    return result;

}

From source file:fr.ens.transcriptome.corsen.gui.qt.ResultGraphs.java

public QImage createDistanceDistributionImage(final double[] data, final int classes, final String unit) {

    if (data == null || data.length < 2)
        return null;

    HistogramDataset histogramdataset = new HistogramDataset();

    histogramdataset.addSeries("Min distances", data, classes, getMin(data), getMax(data));

    // createHistoDataSet(results.getMaxDistances(), "Max distances",
    // histogramdataset);

    JFreeChart chart = ChartFactory.createHistogram("Distribution of minimal distances",
            // title
            "Distance" + unitLegend(unit), // domain axis label
            "Cell number", // range axis label
            histogramdataset, // data

            PlotOrientation.VERTICAL, // orientation
            false, // include legend
            true, // tooltips?
            false // URLs?
    );//from  ww w  .j  a  v  a 2s.  c o m

    addTransparency(chart);

    final BufferedImage image = chart.createBufferedImage(this.width, this.height, BufferedImage.TYPE_INT_ARGB,
            null);

    return new QImage(toByte(image.getData().getDataBuffer()), this.width, this.height,
            QImage.Format.Format_ARGB32);
}

From source file:at.tuwien.ifs.feature.evaluation.SimilarityRetrievalGUI.java

private void initButtonStart() {
    btnStart = new JButton("Start");
    btnStart.setEnabled(false);// ww w.  j  a  va 2  s  . com
    btnStart.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            Enumeration<AbstractButton> elements = bgInputData.getElements();
            while (elements.hasMoreElements()) {
                InputDataRadioButton rb = (InputDataRadioButton) elements.nextElement();
                if (rb.isSelected()) {
                    AbstractSOMLibSparseInputData inputData = rb.inputData;
                    try {
                        @SuppressWarnings("unchecked")
                        Class<? extends DistanceMetric> selectedClass = ((ClassComboBoxModel<DistanceMetric>) boxMetric
                                .getModel()).getSelectedClass();
                        int inputDatumIndex = inputData
                                .getInputDatumIndex((String) comboQueryVector.getSelectedItem());
                        DistanceMetric metric = AbstractMetric.instantiateNice(selectedClass.getName());
                        ArrayList<InputDistance> distances = inputData.getDistances(inputDatumIndex, metric);
                        Collections.sort(distances);

                        // prepare the data for the table
                        double maxDistance = distances.get(distances.size() - 1).getDistance();

                        int neighbours = modelNumberNeighbours.getNumber().intValue();
                        String actionCommand = bgDistanceDisplay.getSelection().getActionCommand();
                        boolean isAbsolute = !actionCommand.equals("relative");

                        Object[][] data = new Object[neighbours][3];
                        if (isAbsolute) {
                            for (int i = 0; i < data.length; i++) {
                                data[i] = new Object[] { i + 1, distances.get(i).getInput().getLabel(),
                                        NumberUtils.setScale(4, distances.get(i).getDistance()) };
                            }
                        } else {
                            for (int i = 0; i < data.length; i++) {
                                data[i] = new Object[] { i + 1, distances.get(i).getInput().getLabel(),
                                        StringUtils.formatAsPercent(distances.get(i).getDistance(), maxDistance,
                                                3) };
                            }
                        }
                        resultsTable.setModel(new DefaultTableModel(data, resultColumnNames));
                        resizeResultTableColumns();

                        // prepare the data for the chart
                        double[] values = InputDistance.getDistanceValuesOnly(distances);
                        if (!isAbsolute) { // convert values to percent
                            for (int i = 0; i < values.length; i++) {
                                values[i] = values[i] * 100.0 / maxDistance;
                            }
                        }

                        HistogramDataset ds = new HistogramDataset();
                        ds.addSeries("Distance", values, 100, 0, isAbsolute ? maxDistance : 100);
                        JFreeChart chart = ChartFactory.createHistogram(null,
                                isAbsolute ? "absolute distance" : "distance in percent", "# of objects", ds,
                                PlotOrientation.VERTICAL, false, true, true);
                        chartPanel.setChart(chart);

                    } catch (SOMToolboxException e1) {
                        // TODO Auto-generated catch block
                        e1.printStackTrace();
                    }
                }
            }
            // enable the saveAs button
            btnSaveResults.setEnabled(true);
        }

    });
}

From source file:org.locationtech.udig.processingtoolbox.tools.HistogramDialog.java

private void updateChart(SimpleFeatureCollection features, String field) {
    int bin = spinner.getSelection();

    double[] values = getValues(features, field);
    HistogramDataset dataset = new HistogramDataset();
    dataset.addSeries(field, values, bin, minMaxVisitor.getMinX(), minMaxVisitor.getMaxX());
    dataset.setType(histogramType);//from  w w w . j  a  va  2s .c  o  m

    JFreeChart chart = ChartFactory.createHistogram(EMPTY, null, null, dataset, PlotOrientation.VERTICAL, false,
            false, false);

    // 1. Create a single plot containing both the scatter and line
    chart.setBackgroundPaint(java.awt.Color.WHITE);
    chart.setBorderVisible(false);

    XYPlot plot = (XYPlot) chart.getPlot();
    plot.setForegroundAlpha(0.85F);
    plot.setBackgroundPaint(java.awt.Color.WHITE);
    plot.setOrientation(PlotOrientation.VERTICAL);

    plot.setDomainGridlinePaint(java.awt.Color.LIGHT_GRAY);
    plot.setRangeGridlinePaint(java.awt.Color.LIGHT_GRAY);

    int fontStyle = java.awt.Font.BOLD;
    FontData fontData = getShell().getDisplay().getSystemFont().getFontData()[0];

    NumberAxis valueAxis = new NumberAxis(cboField.getText());
    valueAxis.setLabelFont(new Font(fontData.getName(), fontStyle, 12));
    valueAxis.setTickLabelFont(new Font(fontData.getName(), fontStyle, 10));

    valueAxis.setAutoRange(false);
    valueAxis.setRange(minMaxVisitor.getMinX(), minMaxVisitor.getMaxX());

    String rangeAxisLabel = histogramType == HistogramType.FREQUENCY ? "Frequency" : "Ratio"; //$NON-NLS-1$ //$NON-NLS-2$
    NumberAxis rangeAxis = new NumberAxis(rangeAxisLabel);
    rangeAxis.setLabelFont(new Font(fontData.getName(), fontStyle, 12));
    rangeAxis.setTickLabelFont(new Font(fontData.getName(), fontStyle, 10));
    if (histogramType == HistogramType.FREQUENCY) {
        rangeAxis.setStandardTickUnits(NumberAxis.createIntegerTickUnits());
    }

    XYBarRenderer renderer = (XYBarRenderer) plot.getRenderer();
    renderer.setShadowVisible(false);
    CustomXYBarPainter.selectedColumn = -1; // init
    renderer.setBarPainter(new CustomXYBarPainter());
    renderer.setAutoPopulateSeriesFillPaint(true);
    renderer.setAutoPopulateSeriesPaint(true);
    renderer.setShadowXOffset(3);
    renderer.setMargin(0.01);
    renderer.setBaseItemLabelsVisible(true);

    ItemLabelPosition pos = new ItemLabelPosition(ItemLabelAnchor.CENTER, TextAnchor.TOP_CENTER);
    renderer.setBasePositiveItemLabelPosition(pos);

    XYToolTipGenerator plotToolTip = new StandardXYToolTipGenerator();
    renderer.setBaseToolTipGenerator(plotToolTip);

    // color
    GradientPaint gp0 = new GradientPaint(0.0f, 0.0f, java.awt.Color.GRAY, 0.0f, 0.0f,
            java.awt.Color.LIGHT_GRAY);
    renderer.setSeriesPaint(0, gp0);

    plot.setDomainAxis(0, valueAxis);
    plot.setRangeAxis(0, rangeAxis);

    // 3. Setup line
    // Create the line data, renderer, and axis
    XYItemRenderer lineRenderer = new XYLineAndShapeRenderer(true, false); // Lines only
    lineRenderer.setSeriesPaint(0, java.awt.Color.RED);
    lineRenderer.setSeriesStroke(0, new BasicStroke(2f));

    // Set the line data, renderer, and axis into plot
    NumberAxis xLineAxis = new NumberAxis(EMPTY);
    xLineAxis.setTickMarksVisible(false);
    xLineAxis.setTickLabelsVisible(false);
    xLineAxis.setAutoRange(false);

    NumberAxis yLineAxis = new NumberAxis(EMPTY);
    yLineAxis.setTickMarksVisible(false);
    yLineAxis.setTickLabelsVisible(false);
    yLineAxis.setAutoRange(false);

    double maxYValue = Double.MIN_VALUE;
    for (int i = 0; i < dataset.getItemCount(0); i++) {
        maxYValue = Math.max(maxYValue, dataset.getYValue(0, i));
    }

    XYSeriesCollection lineDatset = new XYSeriesCollection();

    // Vertical Average
    XYSeries vertical = new XYSeries("Average"); //$NON-NLS-1$
    vertical.add(minMaxVisitor.getAverageX(), 0);
    vertical.add(minMaxVisitor.getAverageX(), maxYValue);
    lineDatset.addSeries(vertical);

    plot.setDataset(1, lineDatset);
    plot.setRenderer(1, lineRenderer);
    plot.setDomainAxis(1, xLineAxis);
    plot.setRangeAxis(1, yLineAxis);

    // Map the line to the second Domain and second Range
    plot.mapDatasetToDomainAxis(1, 0);
    plot.mapDatasetToRangeAxis(1, 0);

    chartComposite.setChart(chart);
    chartComposite.forceRedraw();
}

From source file:visualizer.projection.distance.view.DistanceHistogram.java

private IntervalXYDataset createDataset(DistanceMatrix dmat) {
    HistogramDataset histogramdataset = new HistogramDataset();
    int nrDistances = ((dmat.getElementCount() * dmat.getElementCount()) - dmat.getElementCount()) / 2;

    double[] ad = new double[nrDistances];
    int index = 0;

    for (int i = 0; i < dmat.getElementCount() - 1; i++) {
        for (int j = dmat.getElementCount() - 1; j > i; j--) {
            ad[index] = (dmat.getDistance(i, j) - dmat.getMinDistance())
                    / (dmat.getMaxDistance() - dmat.getMinDistance());
            index++;/* w w w. jav a2 s . c o m*/
        }
    }

    histogramdataset.addSeries("", ad, 200, 0, 1);

    return histogramdataset;
}

From source file:ws.moor.bt.gui.charts.RemotePeerCompletion.java

private HistogramDataset getDataSet() {
    HistogramDataset dataset = new HistogramDataset();
    dataset.setType(HistogramType.FREQUENCY);

    List<Double> values = CollectionUtils.mapNullRemoves(download.getAllValidConnections(),
            new CollectionUtils.Function<BitTorrentConnection, Double>() {
                public Double evaluate(BitTorrentConnection connection) {
                    BitField bitField = connection.getRemoteBitField();
                    if (bitField == null || !connection.isOpen()) {
                        return null;
                    }//from w  w w. java2s.com
                    return 100.0 * bitField.getAvailablePieceCount() / bitField.getPieceCount();
                }
            });

    dataset.addSeries("Completion", CollectionUtils.toArray(values), 50, 0.0, 100.0);
    return dataset;
}

From source file:se.sics.kompics.p2p.monitor.cyclon.server.CyclonMonitorServer.java

private void printAlivePeers(StringBuilder sb, boolean showPeers) {

    long t0 = System.currentTimeMillis();
    GraphUtil g = new GraphUtil(alivePeers);
    long t1 = System.currentTimeMillis();

    double id, od, cc, pl, istd;
    int diameter;

    id = g.getMeanInDegree();//w  ww.ja va  2 s .  c  o  m
    istd = g.getInDegreeStdDev();
    od = g.getMeanOutDegree();
    cc = g.getMeanClusteringCoefficient();
    pl = g.getMeanPathLength();
    diameter = g.getDiameter();
    int netSize = g.getNetworkSize();

    sb.append("<h2 align=\"center\" class=\"style2\">");
    sb.append("View of Cyclon Random Overlay:</h2>");
    sb.append("<table width=\"400\" border=\"1\" align=\"center\"><tr>");
    sb.append("<th class=\"style2\" width=\"250\" scope=\"col\">Metric");
    sb.append("</th><th class=\"style2\"");
    sb.append(" width=\"150\" scope=\"col\">Value</th></tr><tr>");

    sb.append("<td>Network size</td><td><div align=\"center\">");
    sb.append(netSize).append("</div></td></tr>");
    sb.append("<td>Disconnected node pairs</td><td><div align=\"center\">");
    sb.append(g.getInfinitePathCount()).append("/");
    sb.append(netSize * (netSize - 1)).append("</div></td></tr>");
    sb.append("<td>Diameter</td><td><div align=\"center\">");
    sb.append(diameter).append("</div></td></tr>");
    sb.append("<td>Average path length</td><td><div align=\"center\">");
    sb.append(String.format("%.4f", pl)).append("</div></td></tr>");
    sb.append("<td>Clustering-coefficient</td><td><div align=\"center\">");
    sb.append(String.format("%.4f", cc)).append("</div></td></tr>");
    sb.append("<td>Average in-degree</td><td><div align=\"center\">");
    sb.append(String.format("%.4f", id)).append("</div></td></tr>");
    sb.append("<td>In-degree standard deviation</td><td><div align=\"center\">");
    sb.append(String.format("%.4f", istd)).append("</div></td></tr>");
    sb.append("<td>Average out-degree</td><td><div align=\"center\">");
    sb.append(String.format("%.4f", od)).append("</div></td></tr>");
    sb.append("</table>");

    // print in-degree distribution
    HistogramDataset dataset = new HistogramDataset();
    double[] values = g.getInDegrees();
    int min = (int) g.getMinInDegree(), max = (int) g.getMaxInDegree();
    int bins = max - min;
    bins = bins < 1 ? 1 : bins;
    dataset.addSeries("In-degree distribution", values, bins, min, max);
    JFreeChart chart = ChartFactory.createHistogram(null, null, null, dataset, PlotOrientation.VERTICAL, true,
            false, false);
    // chart.getXYPlot().setForegroundAlpha(0.95f);
    BufferedImage image = chart.createBufferedImage(800, 300);

    String imageString = "";
    try {
        ByteArrayOutputStream out = new ByteArrayOutputStream();
        ImageIO.write(image, "png", out);
        out.close();
        Base64 bencoder = new Base64();
        imageString = new String(bencoder.encode(out.toByteArray()));
        imageString = "data:image/png;base64," + imageString;
    } catch (IOException e) {
        sb.append(e);
    }

    sb.append("<br><div align=\"center\"><img src=\"").append(imageString);
    sb.append("\" alt=\"In-degree distribution " + "\" /></div><br>");

    sb.append("<div align=\"center\">It took ").append(t1 - t0);
    sb.append("ms to compute these statistics.<br>");

    // refresh form
    sb.append("<form method=\"get\" name=\"rfrshFrm\" id=\"rfrshFrm\">");
    sb.append("<label>Show peers ");
    sb.append("<input name=\"peers\" type=\"checkbox\" id=\"peers\" />");
    // sb.append("checked=\"").append("false").append("\" />");
    sb.append("<input type=\"submit\" value=\"Refresh\" />");
    sb.append("</form></div>");

    if (!showPeers) {
        return;
    }

    sb.append("<h2 align=\"center\" class=\"style2\">");
    sb.append("Individual peers:</h2>");
    sb.append("<table width=\"1300\" border=\"1\" align=\"center\"><tr>");
    sb.append("<th class=\"style2\" width=\"50\" scope=\"col\">Count</th>");
    sb.append("<th class=\"style2\" width=\"50\" scope=\"col\">Peer</th>");
    sb.append("<th class=\"style2\" width=\"800\" scope=\"col\">Neighbors</th>");
    sb.append("<th class=\"style2\" width=\"50\" scope=\"col\">In Degree</th>");
    sb.append("<th class=\"style2\" width=\"50\" scope=\"col\">Out Degree</th>");
    sb.append("<th class=\"style2\" width=\"100\" scope=\"col\">Cluestering Coefficient</th>");
    sb.append("<th class=\"style2\" width=\"50\" scope=\"col\">Age</th>");
    sb.append("<th class=\"style2\" width=\"100\" scope=\"col\">Freshness</th></tr>");

    int count = 1;

    for (OverlayAddress address : alivePeers.keySet()) {
        CyclonNeighbors neighbors = alivePeers.get(address);

        List<CyclonNodeDescriptor> descriptors = neighbors.getDescriptors();
        Collections.sort(descriptors);

        sb.append("<tr>");
        sb.append("<td><div align=\"center\">").append(count++);
        // sb.append("(").append(g.map.get(address)).append(")");
        sb.append("</div></td>");

        // print peer address
        sb.append("</div></td><td bgcolor=\"#99CCFF\"><div align=\"center\">");
        appendPeerLink(sb, address);
        sb.append("</div></td>");

        // print neighbors
        if (descriptors != null) {
            sb.append("<td><div align=\"left\">");
            sb.append("[");
            Iterator<CyclonNodeDescriptor> iter = descriptors.iterator();
            while (iter.hasNext()) {
                appendPeerLink(sb, iter.next().getCyclonAddress());
                if (iter.hasNext()) {
                    sb.append(", ");
                }
            }
            sb.append("]");
        } else {
            sb.append("<td bgcolor=\"#FFCCFF\"><div align=\"left\">");
            sb.append("[empty]");
        }
        sb.append("</div></td>");

        int v = g.getNodeIndexByAddress(address);

        // print in-degree
        sb.append("<td><div align=\"center\">").append(g.getInDegree(v));
        sb.append("</div></td>");
        // print out-degree
        sb.append("<td><div align=\"center\">").append(g.getOutDegree(v));
        sb.append("</div></td>");
        // print clustering coefficient

        // directedGraph

        sb.append("<td><div align=\"center\">").append(String.format("%.4f", g.getClustering(v)));
        sb.append("</div></td>");

        long now = System.currentTimeMillis();
        OverlayViewEntry viewEntry = view.get(address);

        // print age
        sb.append("<td><div align=\"right\">");
        sb.append(durationToString(now - viewEntry.getAddedAt()));
        sb.append("</div></td>");

        // print freshness
        sb.append("<td><div align=\"right\">");
        sb.append(durationToString(now - viewEntry.getRefreshedAt()));
        sb.append("</div></td>");

        sb.append("</tr>");
    }
    sb.append("</table>");
}