2012-04-27 12 views
5

मैं अपने जावा एप्लिकेशन में कुछ चार्ट उत्पन्न करने के लिए JFreeChart एपीआई का उपयोग कर रहा हूं।लॉगरिदमिक एक्सिस लेबल्स/टिक्स कस्टमाइज़ेशन

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

enter image description here

तो मैं मिला: मेरे चार्ट में से एक में, मैं निम्नलिखित कोड के आधार पर अपना y- अक्ष एक लॉग पैमाने अक्ष (चित्र में ए) बनाने के लिए LogAxis वस्तु उपयोग करने का प्रयास लॉग-स्केल में एक वाई-अक्ष 10^एन (जैसे चित्र ए) की तरह टिकों के साथ। मैं इसे बी की तरह बनाना चाहता हूं, जो उपयोगकर्ता के लिए अधिक सहज है, और प्रत्येक अंतराल अलग-अलग मानों का प्रतिनिधित्व करता है, जैसा चित्र में दिखाया गया है, 2-> 4, 4-> 8, 8-> 16, अंतराल 2^एन। कुछ मामूली यह है कि, अंतराल समान रूप से विस्तृत प्रदर्शन कर रहे हैं भले ही वे अलग-अलग मान का प्रतिनिधित्व कर रहे हों। हालांकि, जब हे निम्नलिखित कोड द्वारा इस लक्ष्य को हासिल करने का प्रयास करें:

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

क्या मैं आंकड़ा सी की तरह कुछ

मैं कैसे आंकड़ा बी को प्राप्त कर सकते है?

+0

इससे संबंधित एक उदाहरण [यहां] दिखाया गया है (http://www.jfree.org/forum/viewtopic.php?f=3&t=119630: इसलिए, यह है कि क्या पहले से नियुक्त किया गया है की तुलना में एक बेहतर समाधान है # p182652)। – trashgod

उत्तर

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

+0

बिल्कुल वही है जो मैं चाहता हूं। बहुत बहुत धन्यवाद!। – Biscuitz

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

+1

@ बिस्कुटज़ - तो मुझे संदेह है कि आपने बहुत मेहनत नहीं की है ... क्योंकि मैं उदार महसूस कर रहा हूं, मैंने कुछ विस्तृत कोड जोड़ा है। [Sscce] के लिए – amaidment

+0

+1 (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); 
    } 
} 
संबंधित मुद्दे