带有 XYBoxAnnotation 在一侧打开的 JFreeChart
JFreeChart with XYBoxAnnotation Open on One Side
我正在使用 XYBoxAnnotation 来划分 JFreeChart 上的矩形区域。我希望盒子的一侧是 "open",即无限远。我尝试将值设置为 Double.POSITIVE_INFINITY
但这似乎不起作用。我也尝试将其设置为 Double.MAX_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 值比轴比例大得多。出于某种原因,这会导致注释在您缩小到足够大之前不可见。
感谢下面@trashgod 的回答,我想出了一个解决方案。他的回答对我来说不太适用,因为我的情节允许缩放,当你缩小时你可以看到盒子的边缘。
首先,我添加了一个 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_VALUE
太大而无法缩放到相关轴,但 Double.MAX_VALUE / 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);
我正在使用 XYBoxAnnotation 来划分 JFreeChart 上的矩形区域。我希望盒子的一侧是 "open",即无限远。我尝试将值设置为 Double.POSITIVE_INFINITY
但这似乎不起作用。我也尝试将其设置为 Double.MAX_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 值比轴比例大得多。出于某种原因,这会导致注释在您缩小到足够大之前不可见。
感谢下面@trashgod 的回答,我想出了一个解决方案。他的回答对我来说不太适用,因为我的情节允许缩放,当你缩小时你可以看到盒子的边缘。
首先,我添加了一个 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_VALUE
太大而无法缩放到相关轴,但 Double.MAX_VALUE / 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);