2012-04-27 12 views
5

JFreeChart API를 사용하여 Java 응용 프로그램에서 일부 차트를 생성합니다. 그리고 내가 가진대수 축 레이블/틱 사용자 지정

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

enter image description here

: 내 차트 중 하나에서, 나는 다음과 같은 코드로 내 y 축은 로그 스케일 축 (그림에서 A)를 만들기 위해 LogAxis 객체를 사용하려고 10-n과 같은 틱을 가진 로그 축척의 Y 축 (그림 A와 같이). 나는 그림과 같이 2-> 4, 4-> 8, 8 -> 16과 같이 사용자가보다 직관적 인 B를 각기 다른 값으로 나타내기를 원합니다. 간격은 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를 달성 할 수있다? 추가 도움이 필요하기 때문에 ...이 시도 : 여기

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

가 함께 플레이하는 데 사용할 수있는 모든 방법입니다 ... :

+0

관련 예제가 여기에 나와 있습니다 (http://www.jfree.org/forum/viewtopic.php?f=3&t=119630). # p182652). – trashgod

답변

3

, 당신은, 정수 틱 단위를 지정할 수 있습니다.

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

+0

정확히 원하는 걸. 정말 고맙습니다!. – Biscuitz

5

난 당신이 logAxis.setNumberFormatOverride(NumberFormat format);

수정이 필요한 생각 당신이 LogAxis를 사용하더라도 아래 @ amaidment의 예의 변화와 같이

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

+1

@Biscuitz - 당신은 열심히 노력하지 않았다고 생각합니다. 관대 한 느낌이 들었 기 때문에, 자세한 코드를 추가했습니다. – amaidment

+0

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

0

IMHO, 당신은 당신이 원하는 차트 유형을 만들 수 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); 
    } 
}