Java JFreeChart |如何将百分比添加到每个条的顶部并格式化域轴(X轴)标签?
我正在使用,下面是我开发的图表的截图和相关代码Java JFreeChart |如何将百分比添加到每个条的顶部并格式化域轴(X轴)标签?,java,jfreechart,Java,Jfreechart,我正在使用,下面是我开发的图表的截图和相关代码 private void getBarChart(列表数据){ JFreeChart barChart=ChartFactory.createBarChart(“,”,”,createDataset(数据),PlotOrientation.VERTICAL,false,true,false); CategoryPlot=条形图。getCategoryPlot(); plot.getRenderer().setSeriesPaint(0,新颜色(7
private void getBarChart(列表数据){
JFreeChart barChart=ChartFactory.createBarChart(“,”,”,createDataset(数据),PlotOrientation.VERTICAL,false,true,false);
CategoryPlot=条形图。getCategoryPlot();
plot.getRenderer().setSeriesPaint(0,新颜色(7,43,97));
条形图.getCategoryPlot().getRangeAxis().setLowerBound(0);
条形图.getCategoryPlot().getRangeAxis().setUpperBound(1);
NumberAxis xAxis2=(NumberAxis)条形图。getCategoryPlot().getRangeAxis();
setNumberFormatOverride(NumberFormat.getPercentInstance());
plot.getRenderer().setSeriesItemLabelGenerator(0,新的StandardCategoryItemLabelGenerator());
plot.getRenderer().setSeriesItemLabelsVisible(1,true);
plot.getRenderer().setBaseItemLabelsVisible(true);
plot.getRenderer().setBaseSeriesVisible(true);
barChart.getCategoryPlot().setRenderer(plot.getRenderer());
setDefaultBarPainter(新的StandardBarPainter());
((Ballenderer)plot.getRenderer()).SetBarPaint(新的StandardBarPainter());
BuffereImage=新的BuffereImage(650250,BuffereImage.TYPE_INT_ARGB);
Graphics2D g2=image.createGraphics();
g2.setRenderingHint(JFreeChart.KEY\u SUPPRESS\u SHADOW\u GENERATION,true);
矩形r=新矩形(0,0,650,250);
条形图绘制(g2,r);
BuffereImage chartImage=barChart.createBuffereImage(600400,空);
}
预期的图表应该如下所示。
问题1。)如何按照预期的图形格式化x轴标签?(条形图中的CategoryLables或TickLabels.getCategoryPlot().getDomainAxis())
问题2。)每个栏顶部显示的值(序列项标签)需要使用类似于y轴的百分比标记(%)进行格式化。(我还认为,就像我在xAxis2.setNumberFormatOverride中所做的那样,这些值将自动乘以100%。现在它只显示十进制值)。如何做到这一点
请帮帮我。谢谢。1)以下行启用具有上升坡度的轴标签:
CategoryAxis domainAxis = plot.getDomainAxis();
domainAxis.setCategoryLabelPositions(CategoryLabelPositions.UP_45);
45表示角度,向上表示从左下到右上的方向。您还可以使用定义任意角度(例如22.5°)
需要注意的是,CreateUptationLabelPositions
需要以弧度为单位的角度
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());
这导致:
从以下备选方案开始工作、更新,如下所示
setCategoryLabelPositions()
,并使用CategoryLabelPositions.CreateUptationLabelPositions
微调角度。下面的示例逆时针旋转π/4弧度或45°
CategoryAxis domainAxis = plot.getDomainAxis();
domainAxis.setCategoryLabelPositions(
CategoryLabelPositions.createUpRotationLabelPositions(Math.PI / 4.0));
StandardCategoryItemLabelGenerator
,但您可能需要使用ArgumentIndex,该值占列总数的百分比,以及合适的NumberFormat
renderer.setDefaultItemLabelGenerator(
new StandardCategoryItemLabelGenerator(
"{3}", NumberFormat.getPercentInstance()));
renderer.setDefaultItemLabelsVisible(true);
这正是我要找的。谢谢你,伙计!
CategoryAxis domainAxis = plot.getDomainAxis();
domainAxis.setCategoryLabelPositions(
CategoryLabelPositions.createUpRotationLabelPositions(Math.PI / 4.0));
renderer.setDefaultItemLabelGenerator(
new StandardCategoryItemLabelGenerator(
"{3}", NumberFormat.getPercentInstance()));
renderer.setDefaultItemLabelsVisible(true);