【问题标题】:JFreeChart | How to add percentage to top of each bar and format domain axis (X axis) ticklabels?JFreeChart |如何在每个条形图的顶部添加百分比并格式化域轴(X 轴)刻度标签?
【发布时间】:2018-12-28 19:04:32
【问题描述】:

我用的是JFreeChart,下面是我开发的图表和相关代码的截图。

    private void getBarChart(List<Data> data) {
JFreeChart barChart = ChartFactory.createBarChart("", "", "", createDataset(data), PlotOrientation.VERTICAL, false, true, false);
        CategoryPlot plot = barChart.getCategoryPlot();
        plot.getRenderer().setSeriesPaint(0, new Color(7, 43, 97));

        barChart.getCategoryPlot().getRangeAxis().setLowerBound(0);
        barChart.getCategoryPlot().getRangeAxis().setUpperBound(1);
        NumberAxis xAxis2 = (NumberAxis) barChart.getCategoryPlot().getRangeAxis();
        xAxis2.setNumberFormatOverride(NumberFormat.getPercentInstance());

        plot.getRenderer().setSeriesItemLabelGenerator(0, new StandardCategoryItemLabelGenerator());
        plot.getRenderer().setSeriesItemLabelsVisible(1, true);
        plot.getRenderer().setBaseItemLabelsVisible(true);
        plot.getRenderer().setBaseSeriesVisible(true);
        barChart.getCategoryPlot().setRenderer(plot.getRenderer());


        BarRenderer.setDefaultBarPainter(new StandardBarPainter());
        ((BarRenderer) plot.getRenderer()).setBarPainter(new StandardBarPainter());

        BufferedImage image = new BufferedImage(650, 250, BufferedImage.TYPE_INT_ARGB);
        Graphics2D g2 = image.createGraphics();
        g2.setRenderingHint(JFreeChart.KEY_SUPPRESS_SHADOW_GENERATION, true);
        Rectangle r = new Rectangle(0, 0, 650, 250);
        barChart.draw(g2, r);
        BufferedImage chartImage = barChart.createBufferedImage(600, 400, null);
}

预期的图表应如下所示。

问题 1.) 如何按照预期的图形格式化 x 轴标签?(barChart.getCategoryPlot().getDomainAxis() 中的类别标签或 TickLabels)

问题 2.) 显示在每个条形 (SeriesItemLabels) 顶部的值需要使用类似于 y 轴的百分比标记 (%) 进行格式化。 (我也认为,就像我在 xAxis2.setNumberFormatOverride 中所做的那样,这些值将自动乘以 100%。现在它只显示十进制值)。如何做到这一点?

请帮帮我。谢谢。

【问题讨论】:

    标签: java jfreechart


    【解决方案1】:

    BarChartDemo1.java 工作,更新为JFreechart 1.5,以下替代方案如下所示。

    1. 如图herehere,可以在域轴上调用setCategoryLabelPositions(),使用CategoryLabelPositions.createUpRotationLabelPositions微调角度。下面的示例逆时针旋转 π/4 弧度或 45°。

      CategoryAxis domainAxis = plot.getDomainAxis();
      domainAxis.setCategoryLabelPositions(
          CategoryLabelPositions.createUpRotationLabelPositions(Math.PI / 4.0));
      
    2. 显示的here,您可以构造自定义StandardCategoryItemLabelGenerator,但您可能希望使用ArgumentIndex {3},它也是作为列总数百分比的值作为一个合适的NumberFormat

      renderer.setDefaultItemLabelGenerator(
          new StandardCategoryItemLabelGenerator(
              "{3}", NumberFormat.getPercentInstance()));
      renderer.setDefaultItemLabelsVisible(true);
      

    【讨论】:

      【解决方案2】:

      1) 以下行启用具有上升斜率的轴标签:

      CategoryAxis domainAxis = plot.getDomainAxis();  
      domainAxis.setCategoryLabelPositions(CategoryLabelPositions.UP_45);
      

      45 表示角度,UP 表示从左下角到右上角的方向。您还可以使用

      定义任意角度(例如 22.5°)
      CategoryAxis domainAxis = plot.getDomainAxis();  
      domainAxis.setCategoryLabelPositions(CategoryLabelPositions.createUpRotationLabelPositions(Math.toRadians(22.5))); 
      

      需要注意的是,createUpRotationLabelPositions 需要一个以弧度为单位的角度。

      2) 以下行以百分比形式格式化系列 0 的条形标签。

      DecimalFormat labelFormat = new DecimalFormat("##0.0 %");
      labelFormat.setMultiplier(100);
      plot.getRenderer().setSeriesItemLabelGenerator(0, new StandardCategoryItemLabelGenerator("{2}", labelFormat));
      plot.getRenderer().setSeriesItemLabelsVisible(0, true);
      

      其中 {0} = 系列,{1} = 类别,{2} = 值

      作为替代方案,您可以定义自己的标签生成器,例如:

      class CstmStandardCategoryItemLabelGenerator extends StandardCategoryItemLabelGenerator {
      
          @Override
          public String generateLabel(CategoryDataset dataset, int row, int column) {
              return String.format("%.1f %%", dataset.getValue(row, column).doubleValue() * 100.0);
          }
      }
      

      可以简单地使用如下:

      plot.getRenderer().setSeriesItemLabelGenerator(0, new CstmStandardCategoryItemLabelGenerator());
      

      这会导致:

      【讨论】:

      • 这正是我想要的。谢谢老哥!
      猜你喜欢
      • 2017-11-22
      • 1970-01-01
      • 1970-01-01
      • 2012-12-12
      • 1970-01-01
      • 2021-10-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多