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

如何基于JFreeChart 1.0.14用LineAndShapeRenderer或StackedAreaRenderer创建堆叠折线图?

JFreeChart 绘制堆叠折线图(1.0.14版本)

我需要用JFreeChart绘制堆叠折线图,但框架没有预定义的创建方法。我考虑过将无填充、仅保留轮廓的堆叠面积图当作堆叠折线图,但不知道怎么实现;另外尝试过通过累加数据集的值,用LineAndShapeRenderer绘制,这种方法可行,但修改数据集的操作成本较高。

说明:使用的数据集为CategoryDataset,JFreeChart版本是1.0.14,需要代码示例。


方案一:将堆叠面积图改造为堆叠折线图

利用StackedAreaRenderer,通过关闭填充、保留线条和数据点的方式模拟堆叠折线图效果,无需修改原始数据集,操作成本更低。

代码示例:

// 创建堆叠面积图基础框架
JFreeChart chart = ChartFactory.createStackedAreaChart(
    "堆叠折线图示例", // 图表标题
    "分类", // X轴标签
    "数值", // Y轴标签
    createCategoryDataset(columns, rows, data), // 传入原始数据集
    PlotOrientation.VERTICAL,
    true, // 显示图例
    true, // 显示工具提示
    false // 不显示URL链接
);

// 获取绘图区并配置渲染器
CategoryPlot plot = (CategoryPlot) chart.getPlot();
StackedAreaRenderer renderer = (StackedAreaRenderer) plot.getRenderer();

// 关闭系列填充(设置为透明)
for (int i = 0; i < renderer.getSeriesCount(); i++) {
    Paint paint = renderer.getSeriesPaint(i);
    if (paint instanceof Color) {
        Color color = (Color) paint;
        // 保留线条颜色,将填充透明度设为0
        renderer.setSeriesPaint(i, new Color(color.getRed(), color.getGreen(), color.getBlue(), 0));
    }
}

// 开启轮廓线、折线和数据点显示
renderer.setDrawOutline(true);
for (int i = 0; i < renderer.getSeriesCount(); i++) {
    renderer.setSeriesLinesVisible(i, true);
    renderer.setSeriesShapesVisible(i, true);
}

方案二:基于累加数据集的折线图实现

通过预处理数据集,累加每个系列的数值后,用LineAndShapeRenderer绘制折线,逻辑直接但需要修改数据集。

默认数据集代码

private static DefaultCategoryDataset createCategoryDataset(JSONArray columns, JSONArray rows, JSONArray data) {
    DefaultCategoryDataset dataset = new DefaultCategoryDataset();
    for (int i = 0; i < columns.length(); i++) {
        for (int j = 0; j < data.length(); j++) {
            JSONArray singleRow = data.getJSONArray(j);
            dataset.addValue(singleRow.getInt(i), rows.getString(j), columns.getString(i));
        }
    }
    return dataset;
}

堆叠折线图修改后的数据集代码

private static DefaultCategoryDataset createCategoryDataset(JSONArray columns, JSONArray rows, JSONArray data) {
    DefaultCategoryDataset dataset = new DefaultCategoryDataset();
    for (int i = 0; i < columns.length(); i++) {
        int sum = 0;
        for (int j = 0; j < data.length(); j++) {
            JSONArray singleRow = data.getJSONArray(j);
            dataset.addValue(sum += singleRow.getInt(i), rows.getString(j), columns.getString(i));
        }
    }
    return dataset;
}

示例参数

columns = [A,B,C]
rows = [X,Y,Z]
data = [ [0,0,1],[0,1,0],[1,0,0]]

图表创建代码

// 使用累加后的数据集创建折线图
JFreeChart chart = ChartFactory.createLineChart(
    "堆叠折线图示例",
    "分类",
    "数值",
    createCategoryDataset(columns, rows, data),
    PlotOrientation.VERTICAL,
    true,
    true,
    false
);

// 配置渲染器显示折线和数据点
CategoryPlot plot = (CategoryPlot) chart.getPlot();
LineAndShapeRenderer renderer = (LineAndShapeRenderer) plot.getRenderer();
for (int i = 0; i < renderer.getSeriesCount(); i++) {
    renderer.setSeriesLinesVisible(i, true);
    renderer.setSeriesShapesVisible(i, true);
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 04:56:30