如何基于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
相关产品推荐
相关产品推荐

