我有一个用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
现在的问题是,为了将鼠标坐标(Point)转换为图表中的相应值,我需要知道屏幕上有多少单位(双)对应一个像素。 不幸的是,最大X值(本例中为60)与灰色图表宽度(看大蓝线)之间存在差距,因此无法实现完美转换。
然后我有两个问题:
答案 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();
应该这样做。