首页 新闻 会员 周边

jfreechart能实现这样的效果吗请问

0
悬赏园豆:15 [待解决问题]

求教大佬们,需求:两根柱状图,四个属性a,b,c,d 第一根根据a,b属性生成叠形柱状图,第二根根据c,d属性生成叠形柱状图
只能做出两个属性或者四个属性叠在一起的的叠行柱状图,搞了几天都不行,求大佬们赐教

问题补充:

已经改成这样的效果了,用的两个dataset作为数据源,但是图像是叠在一起的,能有办法不重叠吗

wone7的主页 wone7 | 初学一级 | 园豆:187
提问于:2023-06-06 16:03
< >
分享
所有回答(2)
0

你可以使用两个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属性,并将它们合并到同一个图表中。你可以根据自己的需求修改代码来实现你想要的效果。

lanedm | 园豆:2381 (老鸟四级) | 2023-06-06 17:23

@wone7 如果你使用的是 JFreeChartCombinedDomainXYPlotCombinedRangeXYPlot,那么默认情况下,它们会将所有的子 XYPlot 叠加在一起,导致图像重叠。

要解决这个问题,你可以通过设置每个子 XYPlotweight 属性来调整它们之间的空间分配。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 的空间。

支持(0) 反对(0) lanedm | 园豆:2381 (老鸟四级) | 2023-06-07 16:34
0

是的,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)进行相应的导入操作。

希望这个示例能够帮助您绘制您所需的叠加柱状图。如果您有更多问题,请随时提问。

Technologyforgood | 园豆:5992 (大侠五级) | 2023-06-06 23:15
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册