【问题标题】:Logarithmic Axis Labels/Ticks Customization对数轴标签/刻度自定义
【发布时间】:2012-05-08 00:39:05
【问题描述】:

我正在使用JFreeChart API 在我的 Java 应用程序中生成一些图表。在我的一个图表中,我尝试使用 LogAxis 对象通过以下代码使我的 y 轴成为对数刻度轴(图中的 A):

LogAxis logAxis = new LogAxis("Price($)");
logAxis.setMinorTickMarksVisible(true);
logAxis.setAutoRange(true);
xyplot.setRangeAxis(logAxis);

然后我得到一个对数刻度的 y 轴,刻度为 10^n(如图 A)。我想让它像B一样,对用户来说更直观,每个区间代表不同的值,如图,2->4、4->8、8->16,区间增长为2^ n.较小的一点是,即使它们代表不同的值,间隔也显示同样宽。但是,当 O 尝试通过以下代码实现这一点时:

LogAxis logAxis = new LogAxis("Price($)");
logAxis.setBase(2);
logAxis.setTickUnit(new NumberTickUnit(2));
logAxis.setMinorTickMarksVisible(true);
logAxis.setAutoRange(true);
xyplot.setRangeAxis(logAxis);

我得到的是类似于图 C 的东西。

我怎样才能实现图B?

【问题讨论】:

  • 显示了一个相关的例子here

标签: java jfreechart


【解决方案1】:

您应该使用ChartFactory 创建您想要的图表类型,而不是直接创建JFreeChart 构造函数。因此,这是一个比之前发布的更好的解决方案:

public class MyLogChart 
{
    public static void main(String[] args) 
    {
        XYSeries series = new XYSeries("First");
        series.add(1.0, 1.0);
        series.add(2.0, 10.0);
        series.add(3.0, 100.0);
        series.add(4.0, 1000.0);
        series.add(5.0, 10000.0);
        series.add(6.0, 100000.0);
        series.add(7.0, 1000000.0);
        series.add(8.0, 10000000.0);

        XYSeriesCollection dataset = new XYSeriesCollection();
        dataset.addSeries(series);

        JFreeChart chart = ChartFactory.createXYLineChart(
            "XY Chart",
            "x-axis",
            "y-axis",
            dataset,
            PlotOrientation.VERTICAL,
            false,
            false,
            false
            );
    
        LogarithmicAxis yAxis = new LogarithmicAxis("Y");
    
        XYPlot plot = chart.getXYPlot();
        plot.setRangeAxis(yAxis);
    
        XYLineAndShapeRenderer renderer = (XYLineAndShapeRenderer)plot.getRenderer();
        renderer.setSeriesShapesVisible(0, true);
    
        ChartFrame frame = new ChartFrame("My Chart", chart);
        frame.pack();
        frame.setVisible(true);
    }
}

【讨论】:

    【解决方案2】:

    即使您使用的是LogAxis,您也可以指定整数刻度单位,如下面@amaidment 示例的变体所示。

    /** @see http://stackoverflow.com/a/10353270/230513 */
    private static void createFrame() {
        XYSeries series = new XYSeries("Series");
        for (int i = 0; i <= N; i++) {
            series.add(i, Math.pow(2, i));
        }
        NumberAxis xAxis = new NumberAxis("X");
        xAxis.setStandardTickUnits(NumberAxis.createIntegerTickUnits());
        LogAxis yAxis = new LogAxis("Y");
        yAxis.setBase(2);
        yAxis.setStandardTickUnits(NumberAxis.createIntegerTickUnits());
        XYPlot plot = new XYPlot(new XYSeriesCollection(series),
            xAxis, yAxis, new XYLineAndShapeRenderer(true, false));
        JFreeChart chart = new JFreeChart(
            "Chart", JFreeChart.DEFAULT_TITLE_FONT, plot, false);
        JFrame frame = new JFrame("LogAxis Test");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setContentPane(new ChartPanel(chart));
        frame.pack();
        frame.setVisible(true);
    }
    
    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
    
            @Override
            public void run() {
                createFrame();
            }
        });
    }
    

    【讨论】:

    【解决方案3】:

    我想你需要的是logAxis.setNumberFormatOverride(NumberFormat format);

    编辑:由于需要进一步的帮助...试试这个:

    logAxis.setBase(10);
    LogFormat format = new LogFormat(logAxis.getBase(), "", "", true);
    logAxis.setNumberFormatOverride(format);
    

    这里有一个完整的方法,可以用来玩...:

      public static void main(String[] args) {
        XYSeries series = new XYSeries("");
        series.add(1, 10);
        series.add(2, 100);
        series.add(3, 1000);
        series.add(4, 10000);
        series.add(5, 100000);
        series.add(6, 1000000);
    
    //    NumberAxis yAxis = new NumberAxis("");
        LogAxis yAxis = new LogAxis("");
        yAxis.setBase(10);
        LogFormat format = new LogFormat(yAxis.getBase(), "", "", true);
        yAxis.setNumberFormatOverride(format);
        XYPlot plot = new XYPlot(
          new XYSeriesCollection(series),
          new NumberAxis(""),
          yAxis,
          new XYLineAndShapeRenderer(true, false));
        JFreeChart chart = new JFreeChart("", JFreeChart.DEFAULT_TITLE_FONT, plot, false);
    
        JFrame frame = new JFrame("LogAxis Test");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setContentPane(new ChartPanel(chart));
        frame.pack();
        frame.setVisible(true);
      }
    

    【讨论】:

    • @Biscuitz - 那我怀疑你没有很努力...因为我感觉很慷慨,我已经添加了一些详细的代码。
    • @amaidment,感谢您的进一步帮助。我之前走错了方向。非常感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-28
    • 1970-01-01
    • 2011-07-20
    • 1970-01-01
    • 2012-10-06
    • 2013-07-19
    • 1970-01-01
    相关资源
    最近更新 更多