Редактирование интерактивной диаграммы JFreeChart: преобразование координат мыши в значения серии - PullRequest
2 голосов
/ 26 августа 2011

У меня есть XYLineChart, построенный с JFreeChart.Мне нужно, учитывая тот график и ChartMouseEvent, получить значение X ряда displayde, ближайшего к точке, где была нажата мышь.

Благодаря предыдущему посту я смогчтобы получить смещение серой диаграммы (координаты зеленой точки на изображении) и ее размер следующим способом:

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

Я также знаю максимальные значения X отображаемой серии:

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

XYLineChart

Теперь проблема в том, что для преобразования координаты мыши (точки) в соответствующее значение на диаграмме мне нужно знать, сколько единиц (двойных) соответствуетпиксель на экране.К сожалению, существует разрыв между максимальным значением X (в нашем случае 60) и шириной серой диаграммы (посмотрите на большую синюю линию), поэтому я не могу добиться идеального преобразования.

Тогда у меня есть двавопросы:

  1. Как точно рассчитать разрыв в пикселях между последним отображаемым значением x и всей серой диаграммой?(длина большой синей линии)
  2. Я что-то не так делаю?Есть ли более простой способ достижения этих целей, возможно, избегая всего этого исчисления?Я новичок в JFreeChart, и документации этой библиотеки недостаточно, поэтому, возможно, мне не хватает некоторых функций, которые могли бы мне помочь.

Ответы [ 3 ]

4 голосов
/ 26 августа 2011

Вспоминая этот пример , вы можете получить координаты модели из значений перекрестия в 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());
    }
});
2 голосов
/ 26 августа 2011
  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());

Мы использовали это для получения координат данных от координат мыши.

1 голос
/ 26 августа 2011

Посмотрите на это JFreeChart получить координаты мыши .Если вы знаете координату, вы можете взять координаты 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();

Это должно сделать это.

...