저는 JFreeChart
을 사용하여 차트를 그립니다. XYSeries에 점 (0, 0), (1, 2), (2, 5)가 있고 x = 1.5라고 가정하면 Y 값을 읽고 싶습니다.JFreeChart의 X 값에서 Y 값을 얻는 방법
XYSeries에없는 점에 대한 값을 읽을 수 있습니까? 나는 비슷한 주제를 찾을 수 없었다.
저는 JFreeChart
을 사용하여 차트를 그립니다. XYSeries에 점 (0, 0), (1, 2), (2, 5)가 있고 x = 1.5라고 가정하면 Y 값을 읽고 싶습니다.JFreeChart의 X 값에서 Y 값을 얻는 방법
XYSeries에없는 점에 대한 값을 읽을 수 있습니까? 나는 비슷한 주제를 찾을 수 없었다.
이것은 직접적으로 지원되지 않습니다. 많은 경우에 의미가 없습니다. 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 값이 각각 반환됨을 의미합니다.
고맙습니다. 정말 도움이되었습니다. – user3626048