2012-04-27 72 views
5

我正在使用JFreeChart API在我的Java应用程序中生成一些图表。在我的图表之一,我尝试下面的代码使用LogAxis对象,使我的y轴的对数刻度轴(图A):对数轴标签/蜱定制

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

enter image description here

然后我一个对数刻度的y轴,像10^n这样的刻度线(如图A)。我想使它像B一样,这对用户来说更加直观,并且每个区间表示不同的值,如图所示,2-> 4,4-> 8,8-> 16,区间增长为2^ñ。次要的是,即使它们表示不同的值,间隔也显示相同的宽度。然而,当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?

+0

一个相关的例子显示[这里](http://www.jfree.org/forum/viewtopic.php?f=3&t=119630 #p182652)。 – trashgod 2017-10-05 00:34:18

回答

3

即使您使用的是LogAxis,你可以指定整数刻度单位,如下图所示@ amaidment的例子的变化。

LogAxis

/** @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(); 
     } 
    }); 
} 
+0

另请参见[初始线程](http://download.oracle.com/javase/tutorial/uiswing/concurrency/initial.html)。 – trashgod 2012-04-27 15:18:46

+0

正是我想要的。非常感谢!。 – Biscuitz 2012-04-28 08:27:53

5

我想你需要的是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); 
    } 
+0

谢谢,但它不起作用。 – Biscuitz 2012-04-27 10:30:47

+1

@Biscuitz - 那么我怀疑你没有很努力...因为我感觉很慷慨,我已经添加了一些详细的代码。 – amaidment 2012-04-27 13:05:13

+0

+1 [sscce](http://sscce.org/)。 – trashgod 2012-04-27 15:18:02

0

恕我直言,你应该使用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); 
    } 
}