java - JFreeChart:条形图 X 轴标签与大型数据集重叠

标签 java jfreechart

我在使用 JFreeChart 创建具有相对较大数据集的条形图时遇到以下问题:

使用重叠的 X 轴标签生成的条形图。我尝试过将标签垂直放置,但仍然没有帮助。请提供解决此问题的最佳方法。代码片段如下:

CategoryDataset categoryDataSet = getBarDataset();
JFreeChart barChart = ChartFactory.createBarChart("TITLE", "X-LABEL","Y-LABEL", categoryDataSet, PlotOrientation.VERTICAL, true, true, false);
barChart.getCategoryPlot().getDomainAxis().setCategoryLabelPositions(CategoryLabelPositions.UP_90);
barChart.getCategoryPlot().getDomainAxis().setMaximumCategoryLabelLines(4);
jpg = Image.getInstance(im, null);
document.add(jpg);

更新: 根据 @trashgod 的建议,我使用了 SlidingCategoryDataset 索引从 0 到列数。当列数较大(此处为 50)时,X 标签会重叠。当列数设置为较低的数字时,它工作正常。我想找到大尺寸列的解决方案。重要的是,我需要将图表图像导出为 pdf。请帮助我找到可行的解决方案。谢谢!

    private static void createBarChart() throws DocumentException, IOException {
        Document document = new Document();
        PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(FILE_LOCN));
        writer.setStrictImageSequence(true);
        document.open();
        CategoryDataset categoryDataset = createDataset();
        int colCount = categoryDataset.getColumnCount();
        SlidingCategoryDataset slidingCategoryDataSet = new SlidingCategoryDataset(categoryDataset, 0, colCount);
        JFreeChart barChart = ChartFactory.createBarChart("TITLE", "X-LABEL","Y-LABEL", slidingCategoryDataSet, 
                PlotOrientation.VERTICAL, true, true, false);
        barChart.getCategoryPlot().getDomainAxis().setCategoryLabelPositions(CategoryLabelPositions.UP_90);
        barChart.getCategoryPlot().getDomainAxis().setMaximumCategoryLabelLines(4);
        java.awt.Image im = barChart.createBufferedImage(400, 400);
        Image jpg = Image.getInstance(im, null);
        jpg.scaleToFit(400, 400);
        document.add(jpg);
        document.close();
        writer.close();
    }

    private static CategoryDataset createDataset() {
        DefaultCategoryDataset dataset = new DefaultCategoryDataset();
        for (int i = 0; i <= 50; i++) {
            dataset.addValue(i, "R", "C" + i);
        }
        return dataset;
    }

enter image description here

最佳答案

类别较多,通过 setCategoryLabelPositions() 指定垂直标签是最大化易读性的不错选择。任意CategoryLabelPositions支持。

在交互式图表中,SlidingCategoryDataset ,提到here ,允许您的应用程序根据需要设置可见类别的计数和起始索引,可能使用 slider 或微调器,如图 here 所示。 .

How can I achieve this in a PDF?…More pixels seems a good idea, but how can we implement that here?

在具有给定数量类别的固定大小上下文中,您可以通过 createBufferedImage() 优化图表图像的大小,如图here ,或Image.scaleToFit() 。对于更大的数据集,可以以特定于域的方式创建多个链接图表,例如按年份或子公司。

关于java - JFreeChart:条形图 X 轴标签与大型数据集重叠,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58761900/

相关文章:

java - 如何使用泛型在抽象类中注入(inject)服务

java - 带有 JFreeChart 的 Eclipse RCP

java - 如何从java中的mysql数据库获取图表数据?

java - 扩展 JackRabbit 还是从 Lucene 构建?

java - 构造函数是否必须使用传递给它的所有参数?

java - 更新 Android Studio 后无法转换对象“org.gradle.api.internal...”

java - 使用 ChartPanel 覆盖paintComponent

java - 在 SWT 中将 JFreeChart ChartComposite 设置为固定大小

java - 如何在编码为 PNG 之前调整 JFreeChart 的大小

java - 凯蒂斯有一个问题,我认为这是一个极端的例子