private static void configureXYBarRenderer(
      XYBarRenderer renderer, ValueSource valueSource, PlotInstance plotInstance) {
    StandardXYBarPainter barPainter = new StandardXYBarPainter();
    renderer.setBarPainter(barPainter);
    renderer.setGradientPaintTransformer(null);
    SeriesFormat seriesFormat = valueSource.getSeriesFormat();
    DimensionConfig domainConfig = valueSource.getDomainConfig();
    ValueSourceData valueSourceData = plotInstance.getPlotData().getValueSourceData(valueSource);
    int seriesCount;
    if (valueSourceData != null) {
      seriesCount = valueSourceData.getSeriesCount();
    } else {
      seriesCount = 0;
    }
    DimensionConfig colorDimensionConfig =
        plotInstance.getCurrentPlotConfigurationClone().getDimensionConfig(PlotDimension.COLOR);
    // don't need shapeDimensionConfig, since the shape can't be represented for bars.

    // Loop all series and set series format.
    // Format based on dimension configs will be set later on in initFormatDelegate().
    for (int seriesIdx = 0; seriesIdx < seriesCount; ++seriesIdx) {
      // configure series paint if necessary
      if (!SeriesFormat.calculateIndividualFormatForEachItem(domainConfig, colorDimensionConfig)) {
        renderer.setSeriesPaint(seriesIdx, seriesFormat.getAreaFillPaint());
      }

      // configure general style of the bars
      renderer.setShadowVisible(false);
      renderer.setSeriesOutlinePaint(seriesIdx, PlotConfiguration.DEFAULT_SERIES_OUTLINE_PAINT);
    }
    renderer.setDrawBarOutline(true);
  }
  /**
   * Creates the histogram chart.
   *
   * @param exampleSet
   * @return
   */
  private JFreeChart createHistogramChart(final ExampleSet exampleSet) {
    JFreeChart chart =
        ChartFactory.createHistogram(
            null,
            null,
            null,
            createHistogramDataset(exampleSet),
            PlotOrientation.VERTICAL,
            false,
            false,
            false);
    AbstractAttributeStatisticsModel.setDefaultChartFonts(chart);
    chart.setBackgroundPaint(null);
    chart.setBackgroundImageAlpha(0.0f);

    XYPlot plot = (XYPlot) chart.getPlot();
    plot.setRangeGridlinesVisible(false);
    plot.setDomainGridlinesVisible(false);
    plot.setOutlineVisible(false);
    plot.setRangeZeroBaselineVisible(false);
    plot.setDomainZeroBaselineVisible(false);
    plot.getDomainAxis().setTickLabelsVisible(false);
    plot.setBackgroundPaint(COLOR_INVISIBLE);
    plot.setBackgroundImageAlpha(0.0f);

    XYBarRenderer renderer = (XYBarRenderer) plot.getRenderer();
    renderer.setSeriesPaint(0, AttributeGuiTools.getColorForValueType(Ontology.DATE_TIME));
    renderer.setBarPainter(new StandardXYBarPainter());
    renderer.setDrawBarOutline(true);
    renderer.setShadowVisible(false);

    return chart;
  }
Beispiel #3
0
 private ChartPanel updateHistPanel(double[] data, double minVal, double maxVal, int numPockets) {
   HistogramDataset datasetHist = new HistogramDataset();
   if (numPockets < 1) {
     numPockets = 20;
   }
   datasetHist.addSeries("seria1", data, numPockets, minVal, maxVal);
   JFreeChart charthist =
       ChartFactory.createHistogram(
           null, null, null, datasetHist, PlotOrientation.VERTICAL, false, true, false);
   charthist.setBackgroundPaint(JFreeChart.DEFAULT_BACKGROUND_PAINT);
   XYPlot plot = (XYPlot) charthist.getPlot();
   plot.setForegroundAlpha(0.85f);
   XYBarRenderer renderer = (XYBarRenderer) plot.getRenderer();
   renderer.setDrawBarOutline(false);
   return new GraphPanel(charthist);
 }
  private static JFreeChart createDistributionViewChart() {
    XYPlot plot = new XYPlot();

    XYLineAndShapeRenderer dRenderer = new XYSplineRenderer();
    dRenderer.setBaseShapesVisible(false);
    dRenderer.setAutoPopulateSeriesPaint(false);
    dRenderer.setAutoPopulateSeriesStroke(false);
    dRenderer.setBaseStroke(TsCharts.getStrongStroke(LinesThickness.Thin));
    dRenderer.setDrawSeriesLineAsPath(true); // not sure if useful
    plot.setDataset(DISTRIBUTION_INDEX, Charts.emptyXYDataset());
    plot.setRenderer(DISTRIBUTION_INDEX, dRenderer);

    XYBarRenderer hRenderer = new XYBarRenderer();
    hRenderer.setShadowVisible(false);
    hRenderer.setDrawBarOutline(true);
    hRenderer.setAutoPopulateSeriesPaint(false);
    hRenderer.setAutoPopulateSeriesOutlinePaint(false);
    hRenderer.setBaseSeriesVisibleInLegend(false);
    plot.setDataset(HISTOGRAM_INDEX, Charts.emptyXYDataset());
    plot.setRenderer(HISTOGRAM_INDEX, hRenderer);

    NumberAxis domainAxis = new NumberAxis();
    domainAxis.setTickLabelPaint(TsCharts.CHART_TICK_LABEL_COLOR);
    plot.setDomainAxis(domainAxis);
    plot.setDomainGridlinesVisible(false);

    NumberAxis rangeAxis = new NumberAxis();
    rangeAxis.setTickLabelPaint(TsCharts.CHART_TICK_LABEL_COLOR);
    rangeAxis.setTickUnit(new NumberTickUnit(0.05));
    rangeAxis.setNumberFormatOverride(new DecimalFormat("0.###"));
    plot.setRangeAxis(rangeAxis);

    plot.mapDatasetToDomainAxis(0, 0);
    plot.mapDatasetToRangeAxis(0, 0);
    plot.mapDatasetToDomainAxis(1, 0);
    plot.mapDatasetToRangeAxis(1, 0);

    JFreeChart result = new JFreeChart("", JFreeChart.DEFAULT_TITLE_FONT, plot, true);
    result.setPadding(TsCharts.CHART_PADDING);
    result.getTitle().setFont(TsCharts.CHART_TITLE_FONT);
    result.getLegend().setFrame(BlockBorder.NONE);
    result.getLegend().setBackgroundPaint(null);
    return result;
  }
Beispiel #5
0
  private JFreeChart createChart(IntervalXYDataset intervalxydataset) {
    String templayerName = layerName;
    if (map.valueSlider.isVisible())
      templayerName = layerName.replace("*", String.valueOf(map.valueSlider.getValue() + 1));

    JFreeChart jfreechart =
        ChartFactory.createHistogram(
            templayerName,
            null,
            null,
            intervalxydataset,
            PlotOrientation.VERTICAL,
            true,
            true,
            false);
    XYPlot xyplot = (XYPlot) jfreechart.getPlot();
    xyplot.setForegroundAlpha(0.85F);
    XYBarRenderer xybarrenderer = (XYBarRenderer) xyplot.getRenderer();
    xybarrenderer.setDrawBarOutline(true);
    return jfreechart;
  }
  private void createUI() {
    dataset = new XIntervalSeriesCollection();
    chart =
        ChartFactory.createHistogram(
            CHART_TITLE,
            "Values",
            "Frequency in #pixels",
            dataset,
            PlotOrientation.VERTICAL,
            false, // Legend?
            true, // tooltips
            false // url
            );
    final XYPlot xyPlot = chart.getXYPlot();
    xyPlot.setDomainZeroBaselineStroke(new BasicStroke(0.2f));

    final XYBarRenderer renderer = (XYBarRenderer) xyPlot.getRenderer();
    renderer.setDrawBarOutline(false);
    renderer.setShadowVisible(false);
    renderer.setShadowYOffset(-4.0);
    renderer.setBaseToolTipGenerator(new XYPlotToolTipGenerator());
    renderer.setBarPainter(new StandardXYBarPainter());
    renderer.setSeriesPaint(0, new Color(0, 0, 200));

    createUI(createChartPanel(chart), createOptionsPanel(), bindingContext);

    isInitialized = true;

    final Binding minBinding = xAxisRangeControl.getBindingContext().getBinding("min");
    final double min = (Double) minBinding.getPropertyValue();
    final Binding maxBinding = xAxisRangeControl.getBindingContext().getBinding("max");
    final double max = (Double) maxBinding.getPropertyValue();
    if (!histogramComputing && min > max) {
      minBinding.setPropertyValue(max);
      maxBinding.setPropertyValue(min);
    }
    updateXAxis();
  }
  public static JFreeChart createChartZhu(IntervalXYDataset dataset) {

    JFreeChart chart =
        ChartFactory.createXYBarChart(
            "时间段内车辆出入统计柱形图", // title
            "数据日期从" + min + "到" + max,
            true, // x-axis label
            "车辆出入数量", // y-axis label
            dataset,
            PlotOrientation.VERTICAL, // data
            true, // create legend?
            true, // generate tooltips?
            false // generate URLs?
            );
    chart.setBackgroundPaint(Color.white);
    chart.getTitle().setFont(new Font("宋体", Font.BOLD, 15));
    // chart.getCategoryPlot().getDomainAxis().setCategoryLabelPositions(CategoryLabelPositions.UP_45);

    XYPlot plot2 = (XYPlot) chart.getPlot();
    plot2.setBackgroundPaint(Color.lightGray);
    plot2.setDomainGridlinePaint(Color.white);
    plot2.setRangeGridlinePaint(Color.white);
    plot2.setAxisOffset(new RectangleInsets(5.0, 5.0, 5.0, 5.0)); // 设定坐标轴与图表数据显示部分距离
    plot2.setDomainCrosshairVisible(true);
    plot2.setRangeCrosshairVisible(true);
    plot2.getRangeAxis().setLabelFont(new Font("宋体", Font.BOLD, 15));
    // 横轴框里的标题字体
    chart.getLegend().setItemFont(new Font("宋体", Font.ITALIC, 10));
    // 横轴列表字体
    plot2.getDomainAxis().setTickLabelFont(new Font("新宋体", 1, 10));
    // 横轴小标题字体
    plot2.getDomainAxis().setLabelFont(new Font("新宋体", 1, 10));
    plot2.setNoDataMessage("没有数据");
    plot2.setBackgroundAlpha(0.5f);

    XYBarRenderer xyBarRender = new XYBarRenderer();
    xyBarRender.setMargin(0.5); // 设置柱形图之间的间隔

    GradientPaint gradientpaint1 =
        new GradientPaint(0.0F, 0.0F, Color.black, 0.0F, 0.0F, new Color(0, 0, 64));
    GradientPaint gradientpaint3 =
        new GradientPaint(0.0F, 0.0F, Color.red, 0.0F, 0.0F, new Color(64, 0, 0));

    xyBarRender.setSeriesPaint(0, gradientpaint1);
    xyBarRender.setSeriesPaint(1, gradientpaint3);
    xyBarRender.setSeriesVisibleInLegend(1, true, true);
    xyBarRender.setBarAlignmentFactor(0.5);
    xyBarRender.setDrawBarOutline(false);

    xyBarRender.setSeriesStroke(
        0,
        new BasicStroke(
            2.0f,
            BasicStroke.CAP_ROUND,
            BasicStroke.JOIN_ROUND,
            1.0f,
            new float[] {10.0f, 6.0f},
            0.0f));
    xyBarRender.setSeriesStroke(
        1,
        new BasicStroke(
            5.0f,
            BasicStroke.CAP_SQUARE,
            BasicStroke.JOIN_ROUND,
            5.0f,
            new float[] {15.0f, 10.0f},
            10.0f));

    plot2.setRenderer(xyBarRender);
    ClusteredXYBarRenderer clusteredxybarrenderer = new ClusteredXYBarRenderer(0.001D, false);
    plot2.setRenderer(clusteredxybarrenderer);

    // CategoryAxis横抽,通过getDomainAxis取得,NumberAxis纵轴,通过getRangeAxis取得。
    DateAxis axis = (DateAxis) plot2.getDomainAxis();
    // axis.setDateFormatOverride(new SimpleDateFormat("yyyy-MM-dd"));
    if (type == 0) // type = 0则以1天为横轴最小坐标,为1则以1月为横轴最小坐标
    {
      axis.setDateFormatOverride(new SimpleDateFormat("dd")); // 设置时间格式
      axis.setTickUnit(new DateTickUnit(DateTickUnit.DAY, 1));
    } else {
      axis.setDateFormatOverride(new SimpleDateFormat("yyyy-MM"));
      axis.setTickUnit(new DateTickUnit(DateTickUnit.MONTH, 1));
    }
    axis.setLabelFont(new Font("黑体", Font.TRUETYPE_FONT, 12));
    // axis.setLabelAngle(0.85);
    axis.setAutoTickUnitSelection(false); // 时间轴的数据标签是否自动确
    // ItemLabelPosition itemlabelposition = new
    // ItemLabelPosition(ItemLabelAnchor.INSIDE12,TextAnchor.CENTER_RIGHT,TextAnchor.CENTER_RIGHT,
    // -1.57D);

    // 下面这一块是用来设置轴的时间间隔的,可能会出现,出错时可以简单设处日期就行了
    // 设置X轴间隔的另一种方法更好不出错
    int a = 1;
    a = (int) (daycount / 10) + 1;
    // axis.setTickUnit(new DateTickUnit(DateTickUnit.DAY,a));
    // axis.setLabelAngle(0.45);
    // axis.setLabelInsets(, true);

    NumberAxis numberaxis = (NumberAxis) plot2.getRangeAxis();
    numberaxis.setAxisLineVisible(false); // 是否显示纵坐标
    numberaxis.setTickMarksVisible(false); // 是否显示坐标标尺
    numberaxis.setAutoRangeIncludesZero(false); // 是否自动包含0起点? 默认为true
    numberaxis.setAutoTickUnitSelection(false); // 数据轴的数据标签是否自动确定
    int space_y = (int) ((highValue_Y * 1.1 - minValue_Y * 0.9) / 10);
    if (space_y == 0) space_y = 1;
    System.out.println("spacespace sapce space" + space_y);
    numberaxis.setTickUnit(new NumberTickUnit(space_y)); // 设置刻度显示的密度
    numberaxis.setAutoRangeMinimumSize(2D);
    return chart;
  }
  /**
   * Creates an overlaid chart.
   *
   * @return The chart.
   */
  private static JFreeChart createCombinedChart() {

    // create plot ...
    IntervalXYDataset data1 = createDataset1();
    XYItemRenderer renderer1 = new XYLineAndShapeRenderer(true, false);
    renderer1.setBaseToolTipGenerator(
        new StandardXYToolTipGenerator(
            StandardXYToolTipGenerator.DEFAULT_TOOL_TIP_FORMAT,
            new SimpleDateFormat("d-MMM-yyyy"),
            new DecimalFormat("0.00")));
    renderer1.setSeriesStroke(
        0, new BasicStroke(4.0f, BasicStroke.CAP_ROUND, BasicStroke.JOIN_BEVEL));
    renderer1.setSeriesPaint(0, Color.blue);

    DateAxis domainAxis = new DateAxis("Year");
    domainAxis.setLowerMargin(0.0);
    domainAxis.setUpperMargin(0.02);
    ValueAxis rangeAxis = new NumberAxis("$billion");
    XYPlot plot1 = new XYPlot(data1, null, rangeAxis, renderer1);
    plot1.setBackgroundPaint(Color.lightGray);
    plot1.setDomainGridlinePaint(Color.white);
    plot1.setRangeGridlinePaint(Color.white);

    // add a second dataset and renderer...
    IntervalXYDataset data2 = createDataset2();
    XYBarRenderer renderer2 =
        new XYBarRenderer() {
          public Paint getItemPaint(int series, int item) {
            XYDataset dataset = getPlot().getDataset();
            if (dataset.getYValue(series, item) >= 0.0) {
              return Color.red;
            } else {
              return Color.green;
            }
          }
        };
    renderer2.setSeriesPaint(0, Color.red);
    renderer2.setDrawBarOutline(false);
    renderer2.setBaseToolTipGenerator(
        new StandardXYToolTipGenerator(
            StandardXYToolTipGenerator.DEFAULT_TOOL_TIP_FORMAT,
            new SimpleDateFormat("d-MMM-yyyy"),
            new DecimalFormat("0.00")));

    XYPlot plot2 = new XYPlot(data2, null, new NumberAxis("$billion"), renderer2);
    plot2.setBackgroundPaint(Color.lightGray);
    plot2.setDomainGridlinePaint(Color.white);
    plot2.setRangeGridlinePaint(Color.white);

    CombinedDomainXYPlot cplot = new CombinedDomainXYPlot(domainAxis);
    cplot.add(plot1, 3);
    cplot.add(plot2, 2);
    cplot.setGap(8.0);
    cplot.setDomainGridlinePaint(Color.white);
    cplot.setDomainGridlinesVisible(true);
    cplot.setDomainPannable(true);

    // return a new chart containing the overlaid plot...
    JFreeChart chart =
        new JFreeChart("United States Public Debt", JFreeChart.DEFAULT_TITLE_FONT, cplot, false);
    TextTitle source =
        new TextTitle(
            "Source: http://www.publicdebt.treas.gov/opd/opdhisms.htm",
            new Font("Dialog", Font.PLAIN, 10));
    source.setPosition(RectangleEdge.BOTTOM);
    source.setHorizontalAlignment(HorizontalAlignment.RIGHT);
    chart.addSubtitle(source);
    LegendTitle legend = new LegendTitle(cplot);
    chart.addSubtitle(legend);
    ChartUtilities.applyCurrentTheme(chart);
    renderer2.setBarPainter(new StandardXYBarPainter());
    renderer2.setShadowVisible(false);
    return chart;
  }
  public void testHistogram1DAdapter() {

    IHistogram1D histogram = histogramFactory.createHistogram1D("h1d", 100, 0, 100);
    Random random = new Random();
    for (int i = 0; i < 100000; i++) {
      histogram.fill(random.nextInt(100));
    }

    Histogram1DAdapter adapter = new Histogram1DAdapter(histogram);

    // int getSeriesCount()
    int seriesCount = adapter.getSeriesCount();
    System.out.println("seriesCount: " + seriesCount);

    // int getItemCount(int series)
    int itemCount = adapter.getItemCount(VALUES);
    System.out.println("itemCount: " + itemCount);

    // Comparable getSeriesKey(int series)
    Comparable<?> seriesKey = adapter.getSeriesKey(VALUES);
    System.out.println("data series key: " + seriesKey);

    seriesKey = adapter.getSeriesKey(ERRORS);
    System.out.println("error series key: " + seriesKey);

    System.out.println();

    for (int item = 0; item < itemCount; item++) {

      System.out.println("item " + item);

      double x = adapter.getXValue(VALUES, item);
      double xLow = adapter.getStartXValue(VALUES, item);
      double xHigh = adapter.getEndXValue(VALUES, item);

      double y = adapter.getYValue(VALUES, item);
      double yLow = adapter.getStartYValue(VALUES, item);
      double yHigh = adapter.getEndYValue(VALUES, item);

      System.out.format(
          "  bin data (x,xLow,xHigh,y,yLow,yHigh) = %f,%f,%f,%f,%f,%f%n",
          x, xLow, xHigh, y, yLow, yHigh);

      x = adapter.getXValue(ERRORS, item);
      xLow = adapter.getStartXValue(ERRORS, item);
      xHigh = adapter.getEndXValue(ERRORS, item);

      y = adapter.getYValue(ERRORS, item);
      yLow = adapter.getStartYValue(ERRORS, item);
      yHigh = adapter.getEndYValue(ERRORS, item);

      System.out.format(
          "  error data (x,xLow,xHigh,y,yLow,yHigh) = %f,%f,%f,%f,%f,%f%n",
          x, xLow, xHigh, y, yLow, yHigh);

      x = adapter.getXValue(POINTS, item);
      y = adapter.getYValue(POINTS, item);
      System.out.format("  point data (x,y) = %f,%f%n", x, y);
    }
    System.out.println();
    System.out.println();

    System.out.println("printing step data ...");
    itemCount = adapter.getItemCount(STEPS);
    System.out.println("step itemCount: " + itemCount);
    for (int item = 0; item < itemCount; item++) {
      System.out.println("item " + item);
      double x = adapter.getXValue(STEPS, item);
      double y = adapter.getYValue(STEPS, item);
      // double y = adapter.getYValue(STEPS, item);
      System.out.format("  step data (x,y) = %f,%f%n", x, y);
    }

    // Set the axis labels.
    String[] labels = ConverterUtil.getAxisLabels(histogram);
    NumberAxis xAxis = new NumberAxis(labels[0]);
    NumberAxis yAxis = new NumberAxis(labels[1]);

    // Create the plot without any data.
    XYPlot plot = new XYPlot(null, xAxis, yAxis, null);

    // Bar chart
    XYDataset barData = new Histogram1DAdapter(histogram);
    XYBarRenderer barRenderer = new XYBarRenderer();
    barRenderer.setSeriesVisible(ERRORS, false);
    barRenderer.setSeriesVisible(POINTS, false);
    barRenderer.setSeriesVisible(STEPS, false);
    // barRenderer.setSeriesVisible(VALUES, false); // DEBUG
    barRenderer.setDrawBarOutline(true);
    plot.setDataset(VALUES, barData);
    plot.setRenderer(VALUES, barRenderer);

    // Errors
    XYDataset errors = new Histogram1DAdapter(histogram);
    XYErrorRenderer errorRenderer = new XYErrorRenderer();
    errorRenderer.setSeriesVisible(VALUES, false);
    errorRenderer.setSeriesVisible(POINTS, false);
    errorRenderer.setSeriesVisible(STEPS, false);
    // errorRenderer.setSeriesVisible(ERRORS, false); // DEBUG
    errorRenderer.setBaseShapesVisible(false);
    errorRenderer.setSeriesPaint(0, Color.black);
    plot.setDataset(ERRORS, errors);
    plot.setRenderer(ERRORS, errorRenderer);

    // Points
    XYDataset points = new Histogram1DAdapter(histogram);
    XYItemRenderer pointRenderer = new XYLineAndShapeRenderer();
    pointRenderer.setSeriesVisible(VALUES, false);
    pointRenderer.setSeriesVisible(ERRORS, false);
    pointRenderer.setSeriesVisible(STEPS, false);
    // pointRenderer.setSeriesVisible(POINTS, false); // DEBUG
    plot.setDataset(POINTS, points);
    plot.setRenderer(POINTS, pointRenderer);

    // Steps
    XYDataset steps = new Histogram1DAdapter(histogram);
    XYItemRenderer stepRenderer = new XYStepRenderer();
    stepRenderer.setSeriesVisible(VALUES, false);
    stepRenderer.setSeriesVisible(ERRORS, false);
    stepRenderer.setSeriesVisible(POINTS, false);
    // stepRenderer.setSeriesVisible(STEPS, false);
    plot.setDataset(STEPS, steps);
    plot.setRenderer(STEPS, stepRenderer);

    // Set proper rendering order.
    plot.setDatasetRenderingOrder(DatasetRenderingOrder.FORWARD);

    // Set style.
    ChartFactory.setChartTheme(new DefaultChartTheme());
    XYBarRenderer.setDefaultShadowsVisible(false);

    // Create the chart.
    JFreeChart chart =
        new JFreeChart(histogram.title(), JFreeChart.DEFAULT_TITLE_FONT, plot, false);

    // Show the chart in an application frame.
    ChartPanel panel = new ChartPanel(chart);
    ApplicationFrame frame = new ApplicationFrame("Histogram1DAdapterTest");
    frame.setContentPane(panel);
    frame.pack();
    RefineryUtilities.centerFrameOnScreen(frame);
    frame.setVisible(true);
  }
Beispiel #10
0
  public SensorWidget(
      final Composite parent,
      final int style,
      final Measurements<T> totals,
      final Measurements<T>... parts) {
    super(parent, style);

    this.totals = totals;

    setLayout(new GridLayout(1, false));
    setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));

    TimeTableXYDataset dataset = new TimeTableXYDataset();
    XYBarRenderer renderer = new StackedXYBarRenderer(0.0);
    renderer.setBarPainter(new StandardXYBarPainter());
    renderer.setDrawBarOutline(false);
    renderer.setShadowVisible(false);

    if (parts == null || parts.length == 0) {
      renderer.setSeriesPaint(0, Color.green);
    }

    XYPlot plot = new XYPlot(dataset, new DateAxis("Time"), new NumberAxis("Count"), renderer);

    plot.getDomainAxis().setLowerMargin(0.0);
    plot.getDomainAxis().setUpperMargin(0.0);
    plot.getRangeAxis().setLabel(null);
    plot.getDomainAxis().setLabel(null);

    JFreeChart realChart = new JFreeChart(plot);
    realChart.setTitle((String) null);

    chart = new ChartComposite(this, SWT.NONE, realChart, true);
    chart.setLayoutData(new GridData(300, 180));

    final Composite labels = new Composite(this, SWT.NONE);
    labels.setLayout(new GridLayout(5, false));

    final Label totalLabel = new Label(labels, SWT.NONE);
    totalLabel.setText(totals.getName());

    total = new Label(labels, SWT.BOLD);
    final FontData[] fd = total.getFont().getFontData();
    fd[0].setStyle(SWT.BOLD);
    total.setFont(new Font(getDisplay(), fd));
    totalMin = new Label(labels, SWT.NONE);
    totalMax = new Label(labels, SWT.NONE);
    totalAvg = new Label(labels, SWT.NONE);

    if (parts != null && parts.length > 0) {
      for (Measurements<T> part : parts) {
        final Label label = new Label(labels, SWT.NONE);
        label.setText(part.getName());
        final Label valueLabel = new Label(labels, SWT.BOLD);
        valueLabel.setFont(new Font(getDisplay(), fd));
        this.parts.put(
            part.getName(),
            new MeasurementsDisplay<T>(
                part,
                valueLabel,
                new Label(labels, SWT.NONE),
                new Label(labels, SWT.NONE),
                new Label(labels, SWT.NONE)));
      }
    }
  }