java - 如何从 JFreeChart 中的 X 值获取 Y 值

标签 java jfreechart

我正在使用JFreeChart来绘制图表。我有 XYSeries ,其点为 (0, 0)、(1, 2)、(2, 5),我想读取 Y 值(假设 x=1.5)。

是否可以读取不在 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 值,最小值的 y 值/将分别返回最大x值)

关于java - 如何从 JFreeChart 中的 X 值获取 Y 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26969188/

相关文章:

java - 使用 Microsoft Access 通过查询获取组中的行数

java - 认知复杂性及其对代码的影响

java - 如何使用apache poi并排添加图像word文档

java - JFreeChart 中的差距

java - 条形图设置值轴增量

java - 扩大和装箱 Java 原语

java - 如何在 JFreeChart 条形图中更新数据集

java - 如何从 Jtable 中获取所有值并绘制它们的图表?

java - 使用 JFreeChart 的箱线图

java - WAV音频无法从IntelliJ创建的JAR文件中播放