2014-11-17 4 views
1

저는 JFreeChart을 사용하여 차트를 그립니다. XYSeries에 점 (0, 0), (1, 2), (2, 5)가 있고 x = 1.5라고 가정하면 Y 값을 읽고 싶습니다.JFreeChart의 X 값에서 Y 값을 얻는 방법

XYSeries에없는 점에 대한 값을 읽을 수 있습니까? 나는 비슷한 주제를 찾을 수 없었다.

답변

2

이것은 직접적으로 지원되지 않습니다. 많은 경우에 의미가 없습니다. x = 1.5에 대한 데이터가 없습니다. 값은 1000.0 또는 -3.141이 될 수 있습니다. 당신은 몰라요.

그러나 선형 보간을 찾는 것이 가장 가능성이 높습니다. 따라서 실용적인 접근법은 각각의 x 값을 포함하는 간격을 찾고 y 값을 선형 적으로 보간하는 것입니다.

몇 가지 기술적 인 경고가 있습니다. 예 : XYSeries은 정렬 할 수 없거나 중복 된 x 값을 포함 할 수 있습니다.이 경우 주어진 x 값에 대해 고유 한 y 값이 없습니다. 그러나 지금은 데이터 집합에 이러한 속성이 없다고 가정 할 수 있습니다.

다음은 이것이 어떻게 구현 될 수 있는지에 대한 예입니다. 이것은 매우 효율적이지 않습니다. 중간 값을 계산해야하는 경우 (즉, interpolate 메서드를 자주 호출하려는 경우) O (logn)에서 간격을 조회 할 수있는 트리 기반 데이터 구조를 만드는 것이 좋습니다.

그러나,이 시간이 중요한 (만 툴팁 정도의 값을 표시하려는 경우 예),이 같은 값을 보간 할 수없는 경우 : 클램프

import java.util.List; 

import org.jfree.data.xy.XYDataItem; 
import org.jfree.data.xy.XYSeries; 

public class XYInterpolation 
{ 
    public static void main(String[] args) 
    { 
     XYSeries s = new XYSeries("Series"); 

     s.add(0,0); 
     s.add(1,2); 
     s.add(2,5); 

     double minX = -0.5; 
     double maxX = 3.0; 
     int steps = 35; 
     for (int i=0; i<=steps; i++) 
     { 
      double a = (double)i/steps; 
      double x = minX + a * (maxX - minX); 
      double y = interpolate(s, x); 
      System.out.printf("%8.3f : %8.3f\n", x, y); 
     } 
    } 

    private static double interpolate(XYSeries s, double x) 
    { 
     if (x <= s.getMinX()) 
     { 
      return s.getY(0).doubleValue(); 
     } 
     if (x >= s.getMaxX()) 
     { 
      return s.getY(s.getItemCount()-1).doubleValue(); 
     } 
     List<?> items = s.getItems(); 
     for (int i=0; i<items.size()-1; i++) 
     { 
      XYDataItem i0 = (XYDataItem) items.get(i); 
      XYDataItem i1 = (XYDataItem) items.get(i+1); 
      double x0 = i0.getXValue(); 
      double y0 = i0.getYValue(); 
      double x1 = i1.getXValue(); 
      double y1 = i1.getYValue(); 

      if (x >= x0 && x <= x1) 
      { 
       double d = x - x0; 
       double a = d/(x1-x0); 
       double y = y0 + a * (y1 - y0); 
       return y; 
      } 
     } 
     // Should never happen 
     return 0; 
    } 

} 

(이 구현을 이는 최소 x 값보다 작거나 최대 x 값보다 큰 x 값의 경우 최소/최대 x 값의 y 값이 각각 반환됨을 의미합니다.

+0

고맙습니다. 정말 도움이되었습니다. – user3626048

관련 문제