Exemple #1
0
  /**
   * Draws a range marker.
   *
   * @param g2 the graphics device.
   * @param plot the plot.
   * @param axis the value axis.
   * @param marker the marker.
   * @param dataArea the area for plotting data (not including 3D effect).
   */
  @Override
  public void drawRangeMarker(
      Graphics2D g2, CategoryPlot plot, ValueAxis axis, Marker marker, Rectangle2D dataArea) {

    Rectangle2D adjusted =
        new Rectangle2D.Double(
            dataArea.getX(),
            dataArea.getY() + getYOffset(),
            dataArea.getWidth() - getXOffset(),
            dataArea.getHeight() - getYOffset());

    if (marker instanceof ValueMarker) {
      ValueMarker vm = (ValueMarker) marker;
      double value = vm.getValue();
      Range range = axis.getRange();
      if (!range.contains(value)) {
        return;
      }

      GeneralPath path = null;
      PlotOrientation orientation = plot.getOrientation();
      if (orientation == PlotOrientation.HORIZONTAL) {
        float x = (float) axis.valueToJava2D(value, adjusted, plot.getRangeAxisEdge());
        float y = (float) adjusted.getMaxY();
        path = new GeneralPath();
        path.moveTo(x, y);
        path.lineTo((float) (x + getXOffset()), y - (float) getYOffset());
        path.lineTo((float) (x + getXOffset()), (float) (adjusted.getMinY() - getYOffset()));
        path.lineTo(x, (float) adjusted.getMinY());
        path.closePath();
      } else if (orientation == PlotOrientation.VERTICAL) {
        float y = (float) axis.valueToJava2D(value, adjusted, plot.getRangeAxisEdge());
        float x = (float) dataArea.getX();
        path = new GeneralPath();
        path.moveTo(x, y);
        path.lineTo(x + (float) this.xOffset, y - (float) this.yOffset);
        path.lineTo((float) (adjusted.getMaxX() + this.xOffset), y - (float) this.yOffset);
        path.lineTo((float) (adjusted.getMaxX()), y);
        path.closePath();
      }
      g2.setPaint(marker.getPaint());
      g2.fill(path);
      g2.setPaint(marker.getOutlinePaint());
      g2.draw(path);
    } else {
      super.drawRangeMarker(g2, plot, axis, marker, adjusted);
      // TODO: draw the interval marker with a 3D effect
    }
  }
  /**
   * Draws a range marker.
   *
   * @param g2 the graphics device.
   * @param plot the plot.
   * @param axis the value axis.
   * @param marker the marker.
   * @param dataArea the area for plotting data (not including 3D effect).
   */
  public void drawRangeMarker(
      Graphics2D g2, CategoryPlot plot, ValueAxis axis, Marker marker, Rectangle2D dataArea) {

    Rectangle2D adjusted =
        new Rectangle2D.Double(
            dataArea.getX(),
            dataArea.getY() + getYOffset(),
            dataArea.getWidth() - getXOffset(),
            dataArea.getHeight() - getYOffset());
    if (marker instanceof ValueMarker) {
      ValueMarker vm = (ValueMarker) marker;
      double value = vm.getValue();
      Range range = axis.getRange();
      if (!range.contains(value)) {
        return;
      }

      GeneralPath path = null;
      PlotOrientation orientation = plot.getOrientation();
      if (orientation == PlotOrientation.HORIZONTAL) {
        float x = (float) axis.valueToJava2D(value, adjusted, plot.getRangeAxisEdge());
        float y = (float) adjusted.getMaxY();
        path = new GeneralPath();
        path.moveTo(x, y);
        path.lineTo((float) (x + getXOffset()), y - (float) getYOffset());
        path.lineTo((float) (x + getXOffset()), (float) (adjusted.getMinY() - getYOffset()));
        path.lineTo(x, (float) adjusted.getMinY());
        path.closePath();
      } else if (orientation == PlotOrientation.VERTICAL) {
        float y = (float) axis.valueToJava2D(value, adjusted, plot.getRangeAxisEdge());
        float x = (float) dataArea.getX();
        path = new GeneralPath();
        path.moveTo(x, y);
        path.lineTo(x + (float) this.xOffset, y - (float) this.yOffset);
        path.lineTo((float) (adjusted.getMaxX() + this.xOffset), y - (float) this.yOffset);
        path.lineTo((float) (adjusted.getMaxX()), y);
        path.closePath();
      }
      g2.setPaint(marker.getPaint());
      g2.fill(path);
      g2.setPaint(marker.getOutlinePaint());
      g2.draw(path);

      String label = marker.getLabel();
      RectangleAnchor anchor = marker.getLabelAnchor();
      if (label != null) {
        Font labelFont = marker.getLabelFont();
        g2.setFont(labelFont);
        g2.setPaint(marker.getLabelPaint());
        Point2D coordinates =
            calculateRangeMarkerTextAnchorPoint(
                g2,
                orientation,
                dataArea,
                path.getBounds2D(),
                marker.getLabelOffset(),
                LengthAdjustmentType.EXPAND,
                anchor);
        TextUtilities.drawAlignedString(
            label,
            g2,
            (float) coordinates.getX(),
            (float) coordinates.getY(),
            marker.getLabelTextAnchor());
      }

    } else {
      super.drawRangeMarker(g2, plot, axis, marker, adjusted);
      // TODO: draw the interval marker with a 3D effect
    }
  }
  public static void writeChart(
      PointTimeSeriesCollection pointTimeSeriesCollection,
      boolean showLegend,
      OutputStream out,
      int width,
      int height,
      long from,
      long to)
      throws IOException {
    // 创建主题样式
    StandardChartTheme standardChartTheme = new StandardChartTheme("CN");
    // 设置标题字体
    standardChartTheme.setExtraLargeFont(new Font("隶书", Font.BOLD, 18));
    // 设置图例的字体
    standardChartTheme.setRegularFont(new Font("宋书", Font.PLAIN, 14));
    // 设置轴向的字体
    standardChartTheme.setLargeFont(new Font("宋书", Font.PLAIN, 14));
    // 应用主题样式
    ChartFactory.setChartTheme(standardChartTheme);

    JFreeChart chart =
        ChartFactory.createTimeSeriesChart(null, null, null, null, showLegend, false, false);
    chart.setBackgroundPaint(
        SystemSettingsDao.getColour(SystemSettingsDao.CHART_BACKGROUND_COLOUR));

    XYPlot plot = chart.getXYPlot();
    ((DateAxis) plot.getDomainAxis()).setTimeZone(pointTimeSeriesCollection.getTimeZone());
    plot.setBackgroundPaint(SystemSettingsDao.getColour(SystemSettingsDao.PLOT_BACKGROUND_COLOUR));
    Color gridlines = SystemSettingsDao.getColour(SystemSettingsDao.PLOT_GRIDLINE_COLOUR);
    plot.setDomainGridlinePaint(gridlines);
    plot.setRangeGridlinePaint(gridlines);
    ((NumberAxis) plot.getRangeAxis()).setAutoRangeStickyZero(false);

    double numericMin = 0;
    double numericMax = 1;

    int numericSeriesCount = pointTimeSeriesCollection.getNumericSeriesCount();
    if (pointTimeSeriesCollection.hasNumericData()) {
      for (int i = 0; i < numericSeriesCount; i++) {
        NumericTimeSeries nts = pointTimeSeriesCollection.getNumericTimeSeries(i);
        AbstractXYItemRenderer renderer;
        if (nts.getPlotType() == DataPointVO.PlotTypes.STEP) renderer = new XYStepRenderer();
        else if (nts.getPlotType() == DataPointVO.PlotTypes.LINE)
          renderer = new XYLineAndShapeRenderer(true, false);
        else {
          XYSplineRenderer spline = new XYSplineRenderer();
          spline.setBaseShapesVisible(false);
          renderer = spline;
        }

        if (nts.getPaint() != null) renderer.setSeriesPaint(0, nts.getPaint(), false);
        if (nts.getStroke() != null) renderer.setSeriesStroke(0, nts.getStroke(), false);

        plot.setDataset(i, new TimeSeriesCollection(nts.getTimeSeries()));
        plot.setRenderer(i, renderer);
      }

      numericMin = plot.getRangeAxis().getLowerBound();
      numericMax = plot.getRangeAxis().getUpperBound();

      if (!pointTimeSeriesCollection.hasMultiplePoints()) {
        // If this chart displays a single point, check if there should be a range description.
        TimeSeries timeSeries = pointTimeSeriesCollection.getNumericTimeSeries(0).getTimeSeries();
        String desc = timeSeries.getRangeDescription();
        if (!StringUtils.isBlank(desc)) {
          // Replace any HTML entities with Java equivalents
          desc = StripEntities.stripHTMLEntities(desc, ' ');
          plot.getRangeAxis().setLabel(desc);
        }
      }
    } else plot.getRangeAxis().setVisible(false);

    if (pointTimeSeriesCollection.getRangeMarkers() != null) {
      boolean rangeAdjusted = false;
      for (Marker marker : pointTimeSeriesCollection.getRangeMarkers()) {
        plot.addRangeMarker(marker);
        if (marker instanceof ValueMarker) {
          ValueMarker vm = (ValueMarker) marker;
          if (numericMin > vm.getValue()) {
            numericMin = vm.getValue();
            rangeAdjusted = true;
          }
          if (numericMax < vm.getValue()) {
            numericMax = vm.getValue();
            rangeAdjusted = true;
          }
        }
      }

      if (rangeAdjusted) {
        double adj = (numericMax - numericMin);
        plot.getRangeAxis().setLowerBound(numericMin - adj * plot.getRangeAxis().getLowerMargin());
        plot.getRangeAxis().setUpperBound(numericMax + adj * plot.getRangeAxis().getUpperMargin());
      }
    }

    int discreteValueCount = pointTimeSeriesCollection.getDiscreteValueCount();
    double interval = (numericMax - numericMin) / (discreteValueCount + 1);
    int intervalIndex = 1;

    if (pointTimeSeriesCollection.hasDiscreteData()) {
      for (int i = 0; i < pointTimeSeriesCollection.getDiscreteSeriesCount(); i++) {
        DiscreteTimeSeries dts = pointTimeSeriesCollection.getDiscreteTimeSeries(i);
        XYStepRenderer renderer = new XYStepRenderer();

        TimeSeries ts = new TimeSeries(dts.getName(), null, null);
        for (IValueTime vt : dts.getValueTimes())
          addMillisecond(
              ts,
              vt.getTime(),
              numericMin + (interval * (dts.getValueIndex(vt.getValue()) + intervalIndex)));

        if (dts.getPaint() != null) renderer.setSeriesPaint(0, dts.getPaint(), false);
        if (dts.getStroke() != null) renderer.setSeriesStroke(0, dts.getStroke(), false);

        plot.setDataset(
            numericSeriesCount + i,
            new TimeSeriesCollection(ts, pointTimeSeriesCollection.getTimeZone()));
        plot.setRenderer(numericSeriesCount + i, renderer);

        intervalIndex += dts.getDiscreteValueCount();
      }
    }

    if (from > 0) plot.getDomainAxis().setLowerBound(from);
    if (to > 0) plot.getDomainAxis().setUpperBound(to);

    if (pointTimeSeriesCollection.hasDiscreteData()) {
      // Add the value annotations.
      double annoX = plot.getDomainAxis().getLowerBound();
      intervalIndex = 1;
      for (int i = 0; i < pointTimeSeriesCollection.getDiscreteSeriesCount(); i++) {
        DiscreteTimeSeries dts = pointTimeSeriesCollection.getDiscreteTimeSeries(i);

        for (int j = 0; j < dts.getDiscreteValueCount(); j++) {
          XYTextAnnotation anno =
              new XYTextAnnotation(
                  " " + dts.getValueText(j), annoX, numericMin + (interval * (j + intervalIndex)));
          if (!pointTimeSeriesCollection.hasNumericData()
              && intervalIndex + j == discreteValueCount)
            // This prevents the top label from getting cut off
            anno.setTextAnchor(TextAnchor.TOP_LEFT);
          else anno.setTextAnchor(TextAnchor.BOTTOM_LEFT);
          anno.setPaint(
              ((AbstractRenderer) plot.getRenderer(numericSeriesCount + i)).lookupSeriesPaint(0));
          plot.addAnnotation(anno);
        }

        intervalIndex += dts.getDiscreteValueCount();
      }
    }

    // Return the image.
    ChartUtilities.writeChartAsPNG(out, chart, width, height);
  }
  /**
   * Draws a marker for the range axis.
   *
   * @param g2 the graphics device (not <code>null</code>).
   * @param plot the plot (not <code>null</code>).
   * @param axis the range axis (not <code>null</code>).
   * @param marker the marker to be drawn (not <code>null</code>).
   * @param dataArea the area inside the axes (not <code>null</code>).
   */
  public void drawRangeMarker(
      Graphics2D g2, CategoryPlot plot, ValueAxis axis, Marker marker, Rectangle2D dataArea) {

    if (marker instanceof ValueMarker) {
      ValueMarker vm = (ValueMarker) marker;
      double value = vm.getValue();
      Range range = axis.getRange();

      if (!range.contains(value)) {
        return;
      }

      PlotOrientation orientation = plot.getOrientation();
      double v = axis.valueToJava2D(value, dataArea, plot.getRangeAxisEdge());
      Line2D line = null;
      if (orientation == PlotOrientation.HORIZONTAL) {
        line = new Line2D.Double(v, dataArea.getMinY(), v, dataArea.getMaxY());
      } else if (orientation == PlotOrientation.VERTICAL) {
        line = new Line2D.Double(dataArea.getMinX(), v, dataArea.getMaxX(), v);
      }

      g2.setPaint(marker.getPaint());
      g2.setStroke(marker.getStroke());
      g2.draw(line);

      String label = marker.getLabel();
      RectangleAnchor anchor = marker.getLabelAnchor();
      if (label != null) {
        Font labelFont = marker.getLabelFont();
        g2.setFont(labelFont);
        g2.setPaint(marker.getLabelPaint());
        Point2D coordinates =
            calculateRangeMarkerTextAnchorPoint(
                g2,
                orientation,
                dataArea,
                line.getBounds2D(),
                marker.getLabelOffset(),
                LengthAdjustmentType.EXPAND,
                anchor);
        TextUtilities.drawAlignedString(
            label,
            g2,
            (float) coordinates.getX(),
            (float) coordinates.getY(),
            marker.getLabelTextAnchor());
      }
    } else if (marker instanceof IntervalMarker) {

      IntervalMarker im = (IntervalMarker) marker;
      double start = im.getStartValue();
      double end = im.getEndValue();
      Range range = axis.getRange();
      if (!(range.intersects(start, end))) {
        return;
      }

      // don't draw beyond the axis range...
      start = range.constrain(start);
      end = range.constrain(end);

      double v0 = axis.valueToJava2D(start, dataArea, plot.getRangeAxisEdge());
      double v1 = axis.valueToJava2D(end, dataArea, plot.getRangeAxisEdge());

      PlotOrientation orientation = plot.getOrientation();
      Rectangle2D rect = null;
      if (orientation == PlotOrientation.HORIZONTAL) {
        rect = new Rectangle2D.Double(v0, dataArea.getMinY(), v1 - v0, dataArea.getHeight());
      } else if (orientation == PlotOrientation.VERTICAL) {
        rect =
            new Rectangle2D.Double(
                dataArea.getMinX(), Math.min(v0, v1),
                dataArea.getWidth(), Math.abs(v1 - v0));
      }
      Paint p = marker.getPaint();
      if (p instanceof GradientPaint) {
        GradientPaint gp = (GradientPaint) p;
        GradientPaintTransformer t = im.getGradientPaintTransformer();
        if (t != null) {
          gp = t.transform(gp, rect);
        }
        g2.setPaint(gp);
      } else {
        g2.setPaint(p);
      }
      g2.fill(rect);

      String label = marker.getLabel();
      RectangleAnchor anchor = marker.getLabelAnchor();
      if (label != null) {
        Font labelFont = marker.getLabelFont();
        g2.setFont(labelFont);
        g2.setPaint(marker.getLabelPaint());
        Point2D coordinates =
            calculateRangeMarkerTextAnchorPoint(
                g2,
                orientation,
                dataArea,
                rect,
                marker.getLabelOffset(),
                marker.getLabelOffsetType(),
                anchor);
        TextUtilities.drawAlignedString(
            label,
            g2,
            (float) coordinates.getX(),
            (float) coordinates.getY(),
            marker.getLabelTextAnchor());
      }
    }
  }