2011-08-26 84 views
2

我有用JFreeChart構建的XYLineChart。鑑於該圖表和ChartMouseEvent,我需要檢索最靠近點擊鼠標點的displayde系列的X值。JFreeChart交互式圖表編輯:將鼠標座標轉換爲系列值

多虧了previous post我已經能夠獲取的灰度圖的偏移量(圖像中的綠色點的座標)及其以下方法維度:

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

我也知道了所顯示的系列的最大X值:

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

XYLineChart

現在的問題在於,用於將鼠標coordin吃(點)到圖表中的相應值,我需要知道多少單位(雙)與屏幕上的像素相對應。 不幸的是,最大X值(在這種情況下爲60)和灰色圖表寬度(看起來很大的藍色線)之間存在差距,所以我無法實現完美的轉換。

然後我有兩個問題:

  1. 如何精確計算像素最後顯示的x值和整個灰色圖表之間的差距? (大藍線長度)
  2. 我做錯了什麼?有沒有更簡單的方法來實現這個目標,可能避免所有這些微積分?我是JFreeChart新手,該庫的文檔還不夠,所以也許我錯過了一些可以幫助我的功能。
+0

http://meta.stackexchange.com/questions/99734/how-do-i-create-a-screenshot-to-illustrate-a-post +1 – mKorbel

+0

@mKorbel:你曾經使用了JFreeChart ?你有什麼想法嗎? – Heisenbug

+0

從來沒有,我認爲這只是垃圾區(在這個論壇上),因爲我知道對不起的人... – mKorbel

回答

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()); 

我們已經使用它從鼠標座標獲取數據座標。

+0

非常感謝,很有效! – Heisenbug

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(); 

應該這樣做。

+0

+1:也謝謝你。我將Kathir的答案設置爲正確的,因爲你已經將valueX和valueY顛倒過來了。沒有什麼個人的,但我不得不選擇一個答案。再次感謝,你們都非常樂於助人! – Heisenbug

+0

沒問題的隊友;) – Jes

+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()); 
    } 
}); 
+0

謝謝..我也試試。 – Heisenbug

+0

我在說什麼+1 – mKorbel

+0

偉大而簡單的想法。 –