求教大佬们,需求:两根柱状图,四个属性a,b,c,d 第一根根据a,b属性生成叠形柱状图,第二根根据c,d属性生成叠形柱状图
只能做出两个属性或者四个属性叠在一起的的叠行柱状图,搞了几天都不行,求大佬们赐教
已经改成这样的效果了,用的两个dataset作为数据源,但是图像是叠在一起的,能有办法不重叠吗
你可以使用两个CategoryDataset来存储你的数据,一个存储a,b属性的数据,另一个存储c,d属性的数据。然后,使用CategoryPlot来创建两个叠形柱状图,一个用于a,b属性,另一个用于c,d属性。最后,将这两个图形合并到同一个图表中。
// 创建a,b属性的数据集
DefaultCategoryDataset dataset1 = new DefaultCategoryDataset();
dataset1.addValue(1, "Series 1", "Category 1");
dataset1.addValue(2, "Series 1", "Category 2");
dataset1.addValue(3, "Series 1", "Category 3");
// 创建c,d属性的数据集
DefaultCategoryDataset dataset2 = new DefaultCategoryDataset();
dataset2.addValue(4, "Series 2", "Category 1");
dataset2.addValue(5, "Series 2", "Category 2");
dataset2.addValue(6, "Series 2", "Category 3");
// 创建a,b属性的叠形柱状图
CategoryPlot plot1 = new CategoryPlot();
plot1.setDataset(dataset1);
plot1.setRenderer(new StackedBarRenderer());
plot1.setDomainAxis(new CategoryAxis("Category"));
plot1.setRangeAxis(new NumberAxis("Value"));
// 创建c,d属性的叠形柱状图
CategoryPlot plot2 = new CategoryPlot();
plot2.setDataset(dataset2);
plot2.setRenderer(new StackedBarRenderer());
plot2.setDomainAxis(new CategoryAxis("Category"));
plot2.setRangeAxis(new NumberAxis("Value"));
// 创建图表,并将两个叠形柱状图添加到其中
JFreeChart chart = new JFreeChart("Chart Title", JFreeChart.DEFAULT_TITLE_FONT, new CombinedDomainCategoryPlot());
CombinedDomainCategoryPlot combinedPlot = (CombinedDomainCategoryPlot) chart.getPlot();
combinedPlot.add(plot1);
combinedPlot.add(plot2);
// 显示图表
ChartFrame frame = new ChartFrame("Chart Title", chart);
frame.pack();
frame.setVisible(true);
这个示例代码片段创建了两个叠形柱状图,一个用于a,b属性,另一个用于c,d属性,并将它们合并到同一个图表中。你可以根据自己的需求修改代码来实现你想要的效果。
@wone7 如果你使用的是 JFreeChart
的 CombinedDomainXYPlot
或 CombinedRangeXYPlot
,那么默认情况下,它们会将所有的子 XYPlot
叠加在一起,导致图像重叠。
要解决这个问题,你可以通过设置每个子 XYPlot
的 weight
属性来调整它们之间的空间分配。weight
属性表示每个 XYPlot
在整个组合图中所占的比例。例如,如果你有两个 XYPlot
,你可以将它们的 weight
属性设置为 1 和 2,这样第二个 XYPlot
将占用更多的空间,从而避免了图像重叠的问题。
CombinedDomainXYPlot plot = new CombinedDomainXYPlot();
plot.setGap(10.0);
// 创建第一个子 XYPlot
XYDataset dataset1 = createDataset1();
XYItemRenderer renderer1 = new StandardXYItemRenderer();
XYPlot subplot1 = new XYPlot(dataset1, null, new NumberAxis("Range 1"), renderer1);
subplot1.setWeight(1); // 设置 weight 为 1
// 创建第二个子 XYPlot
XYDataset dataset2 = createDataset2();
XYItemRenderer renderer2 = new StandardXYItemRenderer();
XYPlot subplot2 = new XYPlot(dataset2, null, new NumberAxis("Range 2"), renderer2);
subplot2.setWeight(2); // 设置 weight 为 2
// 将子 XYPlot 添加到 CombinedDomainXYPlot 中
plot.add(subplot1);
plot.add(subplot2);
// 创建图表并显示
JFreeChart chart = new JFreeChart(plot);
ChartPanel chartPanel = new ChartPanel(chart);
frame.setContentPane(chartPanel);
在上面的代码中,我们创建了两个子 XYPlot
,并将它们的 weight
属性分别设置为 1 和 2。这样第一个子 XYPlot
将占用 1/3 的空间,第二个子 XYPlot
将占用 2/3 的空间。
是的,JFreeChart可以实现您描述的需求,即绘制两根柱状图,每根柱状图都包含两个属性,并将它们叠加在一起。
下面是一个示例代码,展示了如何使用JFreeChart创建叠加的柱状图:
java
Copy code
import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartFrame;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.data.category.DefaultCategoryDataset;
public class StackedBarChartExample {
public static void main(String[] args) {
// 创建数据集
DefaultCategoryDataset dataset = new DefaultCategoryDataset();
// 添加数据
dataset.addValue(10, "Series 1", "Category 1");
dataset.addValue(20, "Series 1", "Category 2");
dataset.addValue(30, "Series 2", "Category 1");
dataset.addValue(40, "Series 2", "Category 2");
// 创建柱状图
JFreeChart chart = ChartFactory.createStackedBarChart(
"Stacked Bar Chart Example", // 图表标题
"Category", // X轴标签
"Value", // Y轴标签
dataset, // 数据集
PlotOrientation.VERTICAL, // 图表方向
true, // 是否显示图例
true, // 是否生成工具提示
false // 是否生成URL链接
);
// 创建图形窗口并显示柱状图
ChartFrame frame = new ChartFrame("Stacked Bar Chart", chart);
frame.pack();
frame.setVisible(true);
}
}
在这个示例中,我们创建了一个DefaultCategoryDataset数据集,并添加了四个数据点,分别对应两个属性和两个类别(Category)。然后使用ChartFactory.createStackedBarChart方法创建柱状图,其中指定了图表的标题、轴标签、数据集等参数。最后使用ChartFrame显示柱状图。
您可以根据自己的数据和需求修改代码中的数据集内容,并根据需要自定义图表的外观和设置。
请注意,您需要确保已经正确导入JFreeChart库,可以根据您的开发环境和构建工具(如Maven或Gradle)进行相应的导入操作。
希望这个示例能够帮助您绘制您所需的叠加柱状图。如果您有更多问题,请随时提问。