有下面一段程序:按我的想法应该有两条横轴,一条的刻度是1,2,3,4,另外一条是Jan,Feb,Mar,Apr.但是程序运行结果却是两条横轴的刻度都是1,2,3,4,让我非常不理解。有熟悉JFreeChart的朋友请帮忙看一下怎么回事。程序在JFreeChart1.0.2下可以直接运行,谢谢指教
package test;import java.awt.Color;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.AxisLocation;
import org.jfree.chart.axis.CategoryAxis;
import org.jfree.chart.plot.CategoryPlot;
import org.jfree.chart.plot.DatasetRenderingOrder;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.data.category.CategoryDataset;
import org.jfree.data.category.DefaultCategoryDataset;
import org.jfree.ui.ApplicationFrame;
import org.jfree.ui.RefineryUtilities;public class BarChartDemo3 extends ApplicationFrame {
    public BarChartDemo3(String title) {
        super(title);
        CategoryDataset dataset = createDataset();
        JFreeChart chart = createChart(dataset);
        ChartPanel chartPanel = new ChartPanel(chart);
        chartPanel.setPreferredSize(new java.awt.Dimension(500, 270));
        setContentPane(chartPanel);
    }
    private CategoryDataset createDataset() {     final String series1 = "Active drug";
        final String series2 = "Placebo";
        final DefaultCategoryDataset dataset = new DefaultCategoryDataset();
        dataset.addValue(1.0, series1, "1");
        dataset.addValue(4.0, series1, "2");
        dataset.addValue(3.0, series1, "3");
        dataset.addValue(5.0, series1, "4");
        dataset.addValue(2.0, series2, "1");
        dataset.addValue(3.0, series2, "2");
        dataset.addValue(4.0, series2, "3");
        dataset.addValue(1.0, series2, "4");     
        return dataset;
    }
    
    private CategoryDataset createDataset2() {
     final DefaultCategoryDataset result = new DefaultCategoryDataset();        result.addValue(2.3, "active", "Jan");
        result.addValue(2.2, "active", "Feb");
        result.addValue(1.9, "active", "Mar");
        result.addValue(1.4, "active", "Apr");
        return result;
    }
    private JFreeChart createChart(CategoryDataset dataset) {        JFreeChart chart = ChartFactory.createBarChart(
            "Dosing",       // chart title
            "",               // domain axis label
            "Dose volume",                  // range axis label
            dataset,                  // data
            PlotOrientation.VERTICAL, // the plot orientation
            true,                    // include legend
            true,
            false
        );        chart.setBackgroundPaint(Color.lightGray);        // get a reference to the plot for further customisation...
        CategoryPlot plot = chart.getCategoryPlot();
        plot.setNoDataMessage("NO DATA!");
        CategoryAxis catAxis = new CategoryAxis("Visite Date");
        plot.setDomainAxis(1,catAxis);
        plot.setDataset(1,createDataset2());
        plot.mapDatasetToDomainAxis(1,1);
        plot.setDatasetRenderingOrder(DatasetRenderingOrder.FORWARD);
        plot.setDomainAxisLocation(1, AxisLocation.BOTTOM_OR_RIGHT);
        catAxis.setTickLabelPaint(Color.blue);
                return chart;    }
    public static void main(String[] args) {        BarChartDemo3 demo = new BarChartDemo3("Bar Chart Demo 3");
        demo.pack();
        RefineryUtilities.centerFrameOnScreen(demo);
        demo.setVisible(true);
    }}

解决方案 »

  1.   

    除非你的 chart 是固定 size 的,且 chart 所顯示的數據是固定(range 不會變),不然自己設定 tick unit 並不適合。平常 tick unit 會隨著 chart/plot 的大小自動調整。 要讓 Y axis 的刻度固定,你可以把 plot 上的 range axis(假如 plot orientation 是 vertical) 的 autoTickUnitSelection flag 關掉然後設定你要的 tick unit。或是提供一個會固定產出 size=0.5 的 TickUnit 的 TickUnitSource 給 range axis。 see: 
    org.jfree.chart.plot.CategoryPlot - getRangeAxis 
    org.jfree.chart.axis.ValueAxis - setAutoTickUnitSelection 
    org.jfree.chart.axis.NumberAxis - setTickUnit
      

  2.   

    跑了一下,不明白楼主createDataset2() 方法是做什么
    特别是active这组和series1, series2都没有关系
    String series1 = "January"
    String series2 = "February" 这样?不然楼主似乎是需要3维(月,日,series)了
    为什么要画2维图
      

  3.   

    谢谢上面的朋友,我设置active这组没有任何意思,只是希望产生一条刻度为Jan,Feb,Mar,Apr的横轴,我不知道有没有这个必要,是否有其他简单的方法来产生横轴,谢谢!