1

ボックス プロット ( BoxAndWhiskerRenderer`. 一連のビンがカテゴリを形成します。あるカテゴリから別のカテゴリへの遷移CategoryPlot) with a customを垂直線でマークしたいと考えています。

たとえば、次の図では、線は 6 番目のカテゴリを示していますが、5 番目と 6 番目のカテゴリの間に表示する必要があります。

ここに画像の説明を入力

  val mark = new CategoryMarker(splitBin)
  mark.setDrawAsLine(true)
  plot.addDomainMarker(mark, Layer.BACKGROUND)

これを達成するための最良/最も簡単な方法は何ですか?

4

1 に答える 1

1

カスタム レンダラーが既にあるので、メソッドにフックして、次drawDomainMarkerのカスタム サブタイプの存在を確認しCategoryMarkerます。

class LeftCategoryMarker(key: Comparable[_], paint: Paint, stroke: Stroke) 
  extends CategoryMarker(key, paint, stroke) {

  def this(key: Comparable[_]) = this(key, Color.gray, new BasicStroke(1.0f))
}

次に、 draw メソッドは次のように分岐します。

override def drawDomainMarker(g2: Graphics2D, plot: CategoryPlot, axis: CategoryAxis,
                                marker: CategoryMarker, dataArea: Rectangle2D): Unit =
  marker match {
    case _: LeftCategoryMarker => drawLeftMarker(g2, plot, axis, marker, dataArea)
    case _ => super.drawDomainMarker(g2, plot, axis, marker, dataArea)
  }

 

private def drawLeftMarker(g2: Graphics2D, plot: CategoryPlot, axis: CategoryAxis,
                           marker: CategoryMarker, dataArea: Rectangle2D): Unit = {
  val cat     = marker.getKey
  val dataset = plot.getDataset(plot.getIndexOf(this))
  val catIdx  = dataset.getColumnIndex(cat)
  if (catIdx < 0) return

  val savedComposite = g2.getComposite
  g2.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, marker.getAlpha))

  axis.getCategoryMargin
  val numCat      = dataset.getColumnCount
  val domainEdge  = plot.getDomainAxisEdge
  val left        = axis.getCategoryStart   (catIdx, numCat, dataArea, domainEdge)
  val gap         = calculateCategoryGapSize(axis  , numCat, dataArea, domainEdge)
  val v           = left - gap/2
  val line        = if (plot.getOrientation == PlotOrientation.HORIZONTAL)
    new Line2D.Double(dataArea.getMinX, v, dataArea.getMaxX, v)
  else
    new Line2D.Double(v, dataArea.getMinY, v, dataArea.getMaxY)

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

  g2.setComposite(savedComposite)
}

そして、CategoryAxisギャップを計算するには、次の保護されたメソッドが必要です。

private def calculateCategoryGapSize(axis: CategoryAxis, categoryCount: Int,
                                     area: Rectangle2D, e: RectangleEdge): Double = {
  if (categoryCount == 0) return 0.0

  val available = if ((e == RectangleEdge.TOP) || (e == RectangleEdge.BOTTOM))
    area.getWidth
  else if ((e == RectangleEdge.LEFT) || (e == RectangleEdge.RIGHT))
    area.getHeight
  else
    0.0

  available * axis.getCategoryMargin / (categoryCount - 1)
}

ここに画像の説明を入力

于 2013-10-27T16:08:54.713 に答える