2012-04-27 7 views
5

Ich verwende die JFreeChart API, um einige Diagramme in meiner Java-Anwendung zu generieren. In einem meiner Charts, ich versuche, das LogAxis Objekt zu verwenden, um meine y-Achse eine Log-Skala Achse (A in der Figur) durch den folgenden Code ein:Logarithmische Achse Etiketten/Ticks Anpassung

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

enter image description here

Dann bekam ich eine y-Achse im Log-Maßstab mit Zecken wie 10^n (wie Abbildung A). Ich möchte es wie B machen, das für den Benutzer intuitiver ist, und jedes Intervall stellt unterschiedliche Werte dar, wie in der Abbildung 2-> 4, 4-> 8, 8-> 16 gezeigt, das Intervall wächst als 2^n. Etwas Minderwertiges ist, dass die Intervalle gleich weit erscheinen, auch wenn sie unterschiedliche Werte repräsentieren. Wenn jedoch O versuchen, dies durch den folgenden Code zu erreichen:

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

Was ich bekommen, ist so etwas wie Abbildung C.

Wie kann ich Figur B erreichen?

+0

Ein verwandtes Beispiel gezeigt wird [hier] (http://www.jfree.org/forum/viewtopic.php?f=3&t=119630 # p182652). – trashgod

Antwort

3

Auch wenn Sie eine LogAxis verwenden, können Sie integer-tick-Einheiten angeben, wie unten in der Variation von @ amaidment dem Beispiel gezeigt.

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

Siehe auch [Anfängliche Themen] (http://download.oracle.com/javase/tutorial/uiswing/concurrency/initial.html). – trashgod

+0

genau was ich will. Ich danke dir sehr!. – Biscuitz

5

Ich denke, was Sie brauchen, ist logAxis.setNumberFormatOverride(NumberFormat format);

EDIT: Da weitere Hilfe benötigt wird ... versuchen Sie dies:

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

Hier ist eine ganze Methode, die verwendet werden können, mit ... zu spielen:

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

Danke, aber es funktioniert nicht. – Biscuitz

+1

@Biscuitz - dann vermute ich, dass du dich nicht sehr bemüht hast ... da ich mich großzügig fühle, habe ich einen detaillierten Code hinzugefügt. – amaidment

+0

+1 für [sscce] (http://sscce.org/). – trashgod

0

IMHO, sollten Sie die ChartFactory verwenden, um die Art des Diagramms Sie erstellen möchten, und nicht den Konstruktor direkt JFreeChart erstellen. Daher ist dies eine bessere Lösung als das, was vorher bekannt gegeben worden ist:

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); 
    } 
}