Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/348.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 一边打开XYBoxAnnotation的JFreeChart_Java_Plot_Charts_Annotations_Jfreechart - Fatal编程技术网

Java 一边打开XYBoxAnnotation的JFreeChart

Java 一边打开XYBoxAnnotation的JFreeChart,java,plot,charts,annotations,jfreechart,Java,Plot,Charts,Annotations,Jfreechart,我正在用一个坐标来标定JFreeChart上的一个矩形区域。我希望盒子的一面是“开放的”,即无限延伸。我尝试将值设置为双精度。正无穷大,但这似乎不起作用。我还尝试将其设置为Double.MAX\u VALUE,但也没有成功。在这些情况下,注释甚至根本不会显示在绘图上。并且没有抛出异常 下面是我的代码的一个非常简单的版本,我在其中生成XYBoxAnnotation并将其添加到绘图中 XYBoxAnnotation _axisMarker = new XYBoxAnnotation(xLow, yL

我正在用一个坐标来标定JFreeChart上的一个矩形区域。我希望盒子的一面是“开放的”,即无限延伸。我尝试将值设置为双精度。正无穷大,但这似乎不起作用。我还尝试将其设置为
Double.MAX\u VALUE
,但也没有成功。在这些情况下,注释甚至根本不会显示在绘图上。并且没有抛出异常

下面是我的代码的一个非常简单的版本,我在其中生成XYBoxAnnotation并将其添加到绘图中

XYBoxAnnotation _axisMarker = new XYBoxAnnotation(xLow, yLow, Double.POSITIVE_INFINITY, yHigh, new BasicStroke(0.5F), Color.WHITE, Color.WHITE);
_plot.getRenderer().addAnnotation(_axisMarker, Layer.BACKGROUND);
编辑:

我发现注释没有显示的原因是注释的x值远远大于轴比例。出于某种原因,这会导致注释在您足够缩小之前不可见

多亏了下面@trashgood的回答,我想出了一个解决方案。他的回答对我来说不太合适,因为我的情节允许放大,当你缩小时你可以看到盒子的边缘

首先,我添加了一个
PlotChangeListener
,以便在缩放绘图时侦听:

// define PlotChangeListener to update the annotation when the plot is zoomed
private PlotChangeListener _zoomListener = new PlotChangeListener() {
  @Override
  public void plotChanged(PlotChangeEvent plotChangeEvent) {
    if (_basisIsotope != null) {
      updateAxisMarkers();
    }
  }
};
然后,我创建了一个函数,根据新的打印边界重新绘制注释:

// function to re-draw the annotation
private void updateAxisMarkers() {
  _plot.removeChangeListener(_zoomListener); // remove to prevent triggering infinite loop

  // define xLow, yLow and yHigh...

  double xHigh = _plot.getDomainAxis().getUpperBound() * 1.1;
  XYBoxAnnotation _axisMarker = new = new XYBoxAnnotation(xLow, yLow, xHigh, yHigh, new BasicStroke(0.5F), Color.WHITE, Color.WHITE);
  _plot.getRenderer().addAnnotation(annotation);

  _plot.addChangeListener(_zoomListener); // add back
}

Double.MAX_值
太大,无法缩放到相关轴,但
Double.MAX_值/2
与任何大于轴上限的值一样工作。更好的选择可能是超出域的最大值一定范围的值。下面的片段用
XYBoxAnnotation
对一些高斯数据的绘图进行着色,其域边界从42扩展到最大域值+10%;范围界限为±1σ

XYSeriesCollection dataset = createDataset();
JFreeChart chart = createChart(dataset);
Color color = new Color(0, 0, 255, 63);
double max = dataset.getSeries(0).getMaxX() * 1.1;
XYBoxAnnotation annotation = new XYBoxAnnotation(
    42, -1, max, 1, new BasicStroke(1f), color, color);
chart.getXYPlot().getRenderer().addAnnotation(annotation);

谢谢你的回答。这对我来说不太管用,因为我的情节允许缩小。缩放后,可以看到长方体的边缘。然而,它确实引导我找到了我的解决方案。我添加了一个
PlotChangeListener
,用于在图表缩放时侦听,然后将框边界重置为新的打印边界。