JFreeChart交互式图表编辑:将鼠标坐标转换为系列值

时间:2011-08-26 14:52:04

标签: java mouseevent jfreechart coordinate-systems

我有一个用JFreeChart构建的XYLineChart。鉴于该图表和ChartMouseEvent,我需要检索最接近鼠标点击的displayde系列的X值。

感谢previous post我能够通过以下方法检索灰色图表的偏移量(图像中绿点的坐标)及其尺寸:

Rectangle2D greyChartArea = chartPanel.getChartRenderingInfo().getPlotInfo().getDataArea();

我也知道显示的系列的最大X值:

double maxXValue = seriesCollection.getDomainUpperBound(true); //where seriesCollection is an XYSeriesCollection object

XYLineChart

现在的问题是,为了将鼠标坐标(Point)转换为图表中的相应值,我需要知道屏幕上有多少单位(双)对应一个像素。 不幸的是,最大X值(本例中为60)与灰色图表宽度(看大蓝线)之间存在差距,因此无法实现完美转换。

然后我有两个问题:

  1. 如何准确计算最后显示的x值与整个灰度图之间的像素间隙? (大蓝线长)
  2. 我做错了什么?有没有更简单的方法来实现这个目标,可能避免所有这些微积分?我是一个JFreeChart新手,该库的文档是不够的,所以也许我错过了一些可以帮助我的功能。

3 个答案:

答案 0 :(得分:4)

回顾这个example,您可以从ChartProgressListener中的十字准线值获取模型坐标。十字线不一定是可见的。

chartPanel.getChart().addProgressListener(new ChartProgressListener() {

    @Override
    public void chartProgress(ChartProgressEvent e) {
        XYPlot xyPlot = (XYPlot) chartPanel.getChart().getPlot();
        System.out.println(e.getType()
            + ": " + xyPlot.getDomainCrosshairValue()
            + ", " + xyPlot.getRangeCrosshairValue());
    }
});

答案 1 :(得分:2)

  final XYPlot plot = getChart().getXYPlot();
  final ValueAxis domainAxis = plot.getDomainAxis();
  final ValueAxis rangeAxis = plot.getRangeAxis();
  final Rectangle2D plotRectangle = SWTUtils.toAwtRectangle(getScreenDataArea());
  final double chartX = domainAxis.java2DToValue(relativeX, plotRectangle, plot.getDomainAxisEdge());
  final double chartY = rangeAxis.java2DToValue(relativeY, plotRectangle, plot.getRangeAxisEdge());

我们用它来从鼠标坐标中获取数据坐标。

答案 2 :(得分:1)

看看这个JFreeChart get mouse coordinates。如果您知道坐标,则可以从绘图中获取x和y坐标,并从轴获取相应的值:

JFreeChart chart = yourChart;
Rectangle2D greyChartArea = chartPanel.getChartRenderingInfo().getPlotInfo().getDataArea();
XYPlot plot = (XYPlot) chart.getPlot();

double valueX = ((NumberAxis) plot.getRangeAxis()).java2DToValue(chartY,plot.getRangeAxisEdge();
double valueY = ((NumberAxis) plot.getDomainAxis()).java2DToValue(chartX,plot.getDomainAxisEdge();

应该这样做。