You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Java中为JFreeChart极坐标图实现边角平滑?

极坐标图数据系列平滑问题

问题描述

使用JFreeChart创建了包含初始(红色)和修改后(蓝色)两个数据系列的极坐标图,修改后的系列存在尖锐边角需要平滑处理。尝试移动平均法后情况有所改善,但尖锐边角仍存在;尝试插值法也未解决问题。

已尝试的解决方案及代码

插值法

public void interpolate(Map<Double, Double> data) {
    double angel = 0.0;
    double increment = reader.getPolarAngelsArray()[1];
    int length = reader.getNumberOfPolarAngels() * 2 - 1;
    double[] x = new double[length];
    double[] y = new double[length];
    for (int i = 0; i < length; i++) {
        x[i] = angel;
        y[i] = data.get(angel);
        angel += increment;
    }
    UnivariateInterpolator interpolator = new SplineInterpolator();
    UnivariateFunction function = interpolator.interpolate(x, y);
    for (double angle = 0.0; angle <= 360.0; angle += increment) {
        data.put(angle, function.value(angle));
    }
}

移动平均法

public XYSeries movAvg(XYSeries series) {

    ArrayList<Double> avgY = new ArrayList<>();
    for (int i = 0; i < series.getItemCount(); i++) {
        if (i == 0) {
            avgY.add((Double) series.getY(i));
        } else if (i == (series.getItemCount() - 1)) {
            avgY.add((Double) series.getY(i));
        } else {
            avgY.add(((Double) series.getY(i - 1) +
                    (Double) series.getY(i) +
                    (Double) series.getY(i + 1)) / 3.0);
        }
    }

    for (int i = 0; i < series.getItemCount(); i++) {
        series.update(series.getX(i), avgY.get(i));
    }
    return series;
}

示例数据

  • 角度:25.0、27.5、30.0、32.5、35.0、37.5、40.0、42.5、45.0、47.5、50.0、52.5、55.0、57.5、60.0、62.5、65.0
  • 数值:327.24、321.03、314.3、307.05、298.64、290.09、280.77、270.14、511.27、488.73、463.07、438.02、411.86、382.51、354.24、324.84、290.96

内容的提问来源于stack exchange,提问作者Eugene

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 05:15:25