JFreeChart |如何在每个条形图的顶部添加百分比并设置域轴(X轴)刻度标签的格式? [英] JFreeChart | How to add percentage to top of each bar and format domain axis (X axis) ticklabels?

查看:175
本文介绍了JFreeChart |如何在每个条形图的顶部添加百分比并设置域轴(X轴)刻度标签的格式?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在使用 JFreeChart ,以下是我和相关代码.

I'm using JFreeChart and following is a screenshot of the developed chart by me and the related code.

    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);
}

期望的图表应类似于以下内容.

The expected chart should be something like following.

问题1.) 如何按照期望的图形格式设置x轴标签?(barChart.getCategoryPlot().getDomainAxis()中的CategoryLables或TickLabels)

Question 1.) How to format the x axis lables as per like the expected graph ?(CategoryLables or TickLabels in barChart.getCategoryPlot().getDomainAxis())

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

Question 2.) The values displayed in top of each bar (SeriesItemLabels) needs to be formatted with a percentage mark(%) similar to the y axis. (Also I think, like I have done in xAxis2.setNumberFormatOverride, the values will automatically get multipled by 100%. Right now it displays the decimal value only). How to achieve this ?

请帮帮我.谢谢.

推荐答案

1)下面的代码行使轴标签具有递增的斜率:

1) The following line enables the axis-labels with an ascending slope:

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

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

45 denotes the angle in degree and UP means an orientation from bottom left to top right. You can also define an arbitrary angle (e.g. 22.5°) with

CategoryAxis domainAxis = plot.getDomainAxis();  
domainAxis.setCategoryLabelPositions(CategoryLabelPositions.createUpRotationLabelPositions(Math.toRadians(22.5))); 

应注意,createUpRotationLabelPositions期望以弧度表示的角度.

It should be noted that createUpRotationLabelPositions expects an angle in radians.

2)以下行以百分比格式设置了系列0的条形标签.

2) The following line formats the bar-labels of series 0 in percent.

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} =值

with {0} = series, {1} = category, {2} = value

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

As an alternative you can define your own label generator, e.g.:

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);
    }
}

可以简单地按如下方式使用:

which simply can be used as follows:

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

结果是:

这篇关于JFreeChart |如何在每个条形图的顶部添加百分比并设置域轴(X轴)刻度标签的格式?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆