【问题标题】:How to find the nearest point to the mouse in a JFreeChart scatter plot?如何在 JFreeChart 散点图中找到离鼠标最近的点?
【发布时间】:2012-09-12 04:30:20
【问题描述】:

我需要能够获取从 MouseListener 返回的点,并确定散点图中最近的点。我正在使用带有 XYDataset 的 JFreeChart。

我在我的 ChartPanel 中添加了一个鼠标侦听器,并尝试将这些 x,y 值与我遍历数据并检查它们的位置时返回的值进行比较。我的代码如下所示:

ValueAxis domainAxis = chartPanel.getXYPlot().getDomainAxis();
ChartArea chartArea = chartPanel.getChartRenderingInfo().getChartArea();

for(int i=0; i < myXYData.getItemCount(0); i++) {
    double mouseX = e.getX(); // e is the MouseEvent
    double pointX = domainAxis.valueToJava2D(myXYData.getX(0, i), chartArea, RectangleEdge.BOTTOM);
    System.out.println("difference is " + (pointX - mouseX));
}

问题在于 MouseEvent 报告的点相对于 ChartPanel 的左上角,因此 (0,0) 位于标题上方,位于 x 轴标签的左侧。然而,valueToJava2D 方法给出的是相对于绘制值的区域的值,因此 (0,0) 位于图形标题下方和 x 轴标签的右侧。这意味着当鼠标直接在我的一个数据点上时,我得到一个非零差异!

如何解决这种差异?

谢谢, 埃里克

【问题讨论】:

  • 交叉发布here

标签: java jfreechart


【解决方案1】:

我会看ChartMouseListener,插图herehere

如果这还不够,您可能必须查看轴,其中区域和边缘有意义。

这可能有助于解释目标,而不是您当前的方法。或者,编辑您的问题以包含显示您当前方法的sscce。很多简短的例子可以在here找到。

附录:最大点数的实际限制非常小。

对于合理的点数,可以放大Shape,如图herehere;另见ShapeUtilities。要调用详细信息,请考虑使用自定义工具提示生成器,检查 here

【讨论】:

  • ChartMouseListener 在鼠标直接位于图表中的某个点上时效果很好。但是,当鼠标不在某个点上时,我希望能够找到最近的点。有任何想法吗?我的目标是在鼠标仅靠近某个点而不是直接在该点上方时向用户提供有用的反馈。
  • “最接近”的匹配肯定需要使用一些合适的度量来迭代数据集。由于这似乎需要大量资源,您能否详细说明目标?
  • 该图表示国际象棋服务器的游戏请求。该图看起来不错,但点有点小。我想让用户接受游戏的有效点击区域更大,而不改变图形的美感。当用户“接近”该点时,我还想提供有关挑战的信息(评分、时间等),而不需要太高的精度以至于他们将鼠标准确地放在它上面。最大点数的实际限制非常小,因此迭代和计算的时间不是问题。
  • 啊,有道理。我在上面提出了一些更简单的替代方案。
  • 感谢您抽出宝贵时间提出这些变通办法。使形状更大一点是一种改进。我猜结论是您不知道有任何方法可以找到从 ChartPanel 左上角到绘图左上角的偏移量。那好吧。我想这就是他们给我们源代码的原因...... :)
猜你喜欢
  • 1970-01-01
  • 2014-09-07
  • 1970-01-01
  • 1970-01-01
  • 2018-08-28
  • 1970-01-01
  • 2022-01-14
  • 1970-01-01
  • 2011-07-14
相关资源
最近更新 更多