每个条形顶部印有精确值的条形图

时间:2014-05-14 21:14:32

标签: java jfreechart

有没有办法在JFreeChart中完成以下操作?

我特别询问每个酒吧顶部优雅印刷的数字。 在这个特定的样本中,很容易猜测出这些值,但是如果y轴以数千或更多的速度运行,这样的特征将是有用的。在这种情况下,条的长度对于发现确切的值没有多大帮助。

enter image description here

2 个答案:

答案 0 :(得分:8)

是的,有可能。您需要在ItemLabelPosition中指定CategoryItemLabelGenerator

例如:

renderer.setBaseItemLabelGenerator(new StandardCategoryItemLabelGenerator());
renderer.setBaseItemLabelsVisible(true);
ItemLabelPosition position = new ItemLabelPosition(ItemLabelAnchor.OUTSIDE12, 
        TextAnchor.TOP_CENTER);
renderer.setBasePositiveItemLabelPosition(position);

编辑:

enter image description here

import javax.swing.JFrame;
import javax.swing.SwingUtilities;

import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.labels.ItemLabelAnchor;
import org.jfree.chart.labels.ItemLabelPosition;
import org.jfree.chart.labels.StandardCategoryItemLabelGenerator;
import org.jfree.chart.plot.CategoryPlot;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.renderer.category.CategoryItemRenderer;
import org.jfree.data.category.DefaultCategoryDataset;
import org.jfree.ui.TextAnchor;

public class DemoBarChart {
    public DemoBarChart() {
        DefaultCategoryDataset dataset = new DefaultCategoryDataset();
        dataset.setValue(6, "test", "A");
        dataset.setValue(7, "test", "B");
        dataset.setValue(15, "test", "C");

        JFreeChart chart = ChartFactory.createBarChart(
                "Demo", "Test", "Value", dataset,
                PlotOrientation.VERTICAL, false, false, false);

        CategoryItemRenderer renderer = ((CategoryPlot)chart.getPlot()).getRenderer();

        renderer.setBaseItemLabelGenerator(new StandardCategoryItemLabelGenerator());
        renderer.setBaseItemLabelsVisible(true);
        ItemLabelPosition position = new ItemLabelPosition(ItemLabelAnchor.OUTSIDE12, 
                TextAnchor.TOP_CENTER);
        renderer.setBasePositiveItemLabelPosition(position);

        JFrame frame = new JFrame("DemoTable");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(new ChartPanel(chart));
        frame.setLocationByPlatform(true);
        frame.pack();
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                new DemoBarChart();
            }
        });
    }
}

EDIT(版本1.5.0):

在当前的JFreeChart版本(1.5.0)中,方法名称中的“Base”已更改为Default。

例如:

renderer.setDefaultItemLabelGenerator(new StandardCategoryItemLabelGenerator());
renderer.setDefaultItemLabelsVisible(true);
ItemLabelPosition position = new ItemLabelPosition(ItemLabelAnchor.OUTSIDE12, 
        TextAnchor.TOP_CENTER);
renderer.setDefaultPositiveItemLabelPosition(position); 

答案 1 :(得分:0)

如果未设置Position ItemLabelPosition

,则按照新版本

只需添加,它将自动设置bar的Value OutSide Top 。有时,它将Max Bar值隐藏为X轴的最大限制,因此您必须按边距增加X轴限制

BarRenderer renderer = (BarRenderer) plot.getRenderer();
renderer.setBaseItemLabelGenerator(new StandardCategoryItemLabelGenerator(
            "{1}", NumberFormat.getInstance()));
renderer.setBaseItemLabelsVisible(true);

NumberAxis rangeAxis = (NumberAxis) plot.getRangeAxis(); 
rangeAxis.setUpperMargin(0.15); 

但是如果 您要更改条形值位置 ,则可以尝试点赞

用于中心

renderer.setPositiveItemLabelPosition(new ItemLabelPosition( 
         ItemLabelAnchor.CENTER, TextAnchor.CENTER, TextAnchor.CENTER, 
         - 0 / 2));

用于栏的顶部

renderer.setBasePositiveItemLabelPosition(new ItemLabelPosition(ItemLabelAnchor.OUTSIDE12,TextAnchor.TOP_CENTER  ));

用于添加值的字体样式并根据需要进行修改

renderer.setItemLabelFont(new Font("SansSerif", Font.PLAIN, 12));