【问题标题】:How to get Y value from X value in JFreeChart如何从 JFreeChart 中的 X 值获取 Y 值
【发布时间】:2014-11-17 09:15:29
【问题描述】:

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

是否可以读取不在 XYSeries 中的点的值?我找不到类似的主题。

【问题讨论】:

    标签: java jfreechart


    【解决方案1】:

    这是不直接支持的。在许多情况下它没有意义:根本没有 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;
        }
    
    }
    

    (这个实现clamps在极限。这意味着对于小于最小x值或大于最大x值的x值,最小值的y值/maximum x-value 将分别返回)

    【讨论】:

    • 谢谢,这真的很有帮助。
    【解决方案2】:

    您可以使用包 org.jfree.data.general 中的 DatasetUtils.findYValue()

    【讨论】:

    • 请添加更多详细信息以扩展您的答案,例如工作代码或文档引用。
    猜你喜欢
    • 1970-01-01
    • 2015-05-13
    • 2020-02-09
    • 1970-01-01
    • 2021-11-22
    • 1970-01-01
    • 2021-03-06
    • 2018-11-02
    • 1970-01-01
    相关资源
    最近更新 更多