JFreeChart中的图表上方的网格线

时间:2013-05-20 09:51:28

标签: java jfreechart bar-chart

是否可以检索BarChart的所有rangeAxis值?我已经设法绘制了这样的新GridLines(标记):

enter image description here

但是我需要知道值轴中图表的哪些值能够绘制所有线。任何想法如何获得“价值”-axis的所有价值?(RangeAxis)

public class BarChartDemo extends ApplicationFrame {

    /**
     * Creates a new demo instance.
     *
     * @param title  the frame title.
     */
    public BarChartDemo(final String title) {
        super(title);
        final CategoryDataset dataset = createDataset();
        final JFreeChart chart = createChart(dataset);
        final ChartPanel chartPanel = new ChartPanel(chart);
        chartPanel.setPreferredSize(new Dimension(500, 270));
        setContentPane(chartPanel);
    }

    /**
     * Returns a sample dataset.
     * 
     * @return The dataset.
     */
    private CategoryDataset createDataset() {

        // row keys...
        final String series1 = "First";

        // column keys...
        final String category1 = "Category 1";
        final String category2 = "Category 2";
        final String category3 = "Category 3";

        // create the dataset...
        final DefaultCategoryDataset dataset = new DefaultCategoryDataset();

        dataset.addValue(3.5, series1, category1);
        dataset.addValue(4.0, series1, category2);
        dataset.addValue(3.0, series1, category3);
        return dataset;
    }

    /**
     * Creates a sample chart.
     * 
     * @param dataset  the dataset.
     * 
     * @return The chart.
     */
    private JFreeChart createChart(final CategoryDataset dataset) {

        // create the chart...
        final JFreeChart chart = ChartFactory.createBarChart(
            "Bar Chart Demo",         // chart title
            "Category",               // domain axis label
            "Value",                  // range axis label
            dataset,                  // data
            PlotOrientation.VERTICAL, // orientation
            false,                     // include legend
            false,                     // tooltips?
            false                     // URLs?
        );
        CategoryPlot plot = chart.getCategoryPlot();
        plot.getDomainAxis().setCategoryMargin(.01);

        plot.setRangeGridlinesVisible(false);
        for(int i=1; i<=4; i++){
            Marker marker = new ValueMarker(i);
            marker.setStroke(new BasicStroke(
                    1.0f, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND,
                    1.0f, new float[] {3.0f, 8.0f}, 0.0f
                ));
            marker.setPaint(new Color(224,224,224));
            plot.addRangeMarker(marker);
        }

        return chart;
    }

    public static void main(final String[] args) {
        final BarChartDemo demo = new BarChartDemo("Bar Chart Demo");
        demo.pack();
        demo.setVisible(true);
    }
}

2 个答案:

答案 0 :(得分:0)

您似乎能够以类似于此域example的方式利用addRangeMarker()。匹配标记和刻度单位的一种方法是指定包含所选标记的TickUnitSource

NumberAxis range = (NumberAxis) plot.getRangeAxis();
range.setStandardTickUnits(NumberAxis.createIntegerTickUnits());

如果您需要自定义来源,可以在createIntegerTickUnits()createStandardTickUnits()上对其进行建模。

答案 1 :(得分:0)

没有设法理解如何以“好”的方式做到这一点。制作了一个步骤方法,知道将当前图表的最大值放在哪里:

private static double getGridStep(double max){
        double step = 0;
        if(max > 86){
            step = 10;
        }
        else if(max >= 30){
            step = 5;
        }
        else if(max > 17){
            step = 2.5;
        }
        else if(max > 7){
            step = 1;
        }
        else if(max > 2){
            step = 0.5;
        }
        else if(max > 1){
            step = 0.25;
        }
        else
            step = 0.1;
        return step;
}