suhe arie's pages

Programmer juga manusia

Membuat grafik dengan JFreeChart

Dengan JFreeChart, membuat grafik di java menjadi mudah. Kita tidak perlu lagi berurusan dengan low level Java 2D API. Ada banyak jenis chart yang disupport olleh JFreeChart, namun di contoh kali ini saya hanya akan membuat grafik sederhana (garis dan batang) dengan menggunakan static (dummy) data.

Ada dua library yang kita butuhkan yaitu jfreechart.jar dan jcommon.jar. Class utama dari JFreeChart adalah ChartFactory, yang merupakan factory class untuk membuat berbagai macam chart. Pseudo codenya:

1. Buat dataset dengan meng-create object DefaultCategoryDataset.
2. Tambahkan data dengan memanggil method addValue().
3. Definisikan title, label untuk sumbu X dan sumbu Y.
4. Create chart dengan memanggil method ChartFactory.createLineChart() yang akan menghasilkan object chart.
5. Buat object ChartPanel dengan memberikan object chart tadi sebagai argumen.
6. Tampilkan panel ini pada aplikasi swing anda.

Contoh sample lengkapnya:


package suhearie.blog.chart;

import java.awt.BorderLayout;
import javax.swing.JPanel;
import javax.swing.JFrame;
import java.awt.GridBagLayout;
import javax.swing.JButton;

import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.data.category.CategoryDataset;
import org.jfree.data.category.DefaultCategoryDataset;

import java.awt.GridBagConstraints;
import javax.swing.JComboBox;
import javax.swing.JLabel;

public class TestChart extends JFrame {

    private JPanel jContentPane = null;
    private JButton btnChart = null;
    private JPanel panelChart = null;
    private JComboBox comboOption = null;
    private JLabel jLabel = null;

    /**
     * This is the default constructor
     */
    public TestChart() {
        super();
        initialize();
    }

    /**
     * This method initializes this
     *
     * @return void
     */
    private void initialize() {
        this.setSize(744, 543);
        this.setContentPane(getJContentPane());
        this.setTitle("JFrame");
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }

    /**
     * This method initializes jContentPane
     *
     * @return javax.swing.JPanel
     */
    private JPanel getJContentPane() {
        if (jContentPane == null) {
            GridBagConstraints gridBagConstraints2 = new GridBagConstraints();
            gridBagConstraints2.gridx = 0;
            gridBagConstraints2.insets = new java.awt.Insets(5,5,5,5);
            gridBagConstraints2.gridy = 0;
            jLabel = new JLabel();
            jLabel.setText("Tipe Chart");
            GridBagConstraints gridBagConstraints11 = new GridBagConstraints();
            gridBagConstraints11.fill = java.awt.GridBagConstraints.NONE;
            gridBagConstraints11.gridy = 0;
            gridBagConstraints11.weightx = 1.0;
            gridBagConstraints11.anchor = java.awt.GridBagConstraints.WEST;
            gridBagConstraints11.insets = new java.awt.Insets(5,20,5,5);
            gridBagConstraints11.gridx = 1;
            GridBagConstraints gridBagConstraints1 = new GridBagConstraints();
            gridBagConstraints1.gridx = 0;
            gridBagConstraints1.fill = java.awt.GridBagConstraints.BOTH;
            gridBagConstraints1.weightx = 1.0;
            gridBagConstraints1.weighty = 1.0;
            gridBagConstraints1.gridwidth = 3;
            gridBagConstraints1.gridy = 1;
            GridBagConstraints gridBagConstraints = new GridBagConstraints();
            gridBagConstraints.gridx = 2;
            gridBagConstraints.insets = new java.awt.Insets(5,5,5,5);
            gridBagConstraints.gridy = 0;
            jContentPane = new JPanel();
            jContentPane.setLayout(new GridBagLayout());
            jContentPane.add(getBtnChart(), gridBagConstraints);
            jContentPane.add(getPanelChart(), gridBagConstraints1);
            jContentPane.add(getComboOption(), gridBagConstraints11);
            jContentPane.add(jLabel, gridBagConstraints2);
        }
        return jContentPane;
    }

    /**
     * This method initializes btnChart
     *
     * @return javax.swing.JButton
     */
    private JButton getBtnChart() {
        if (btnChart == null) {
            btnChart = new JButton();
            btnChart.setText("Show");
            btnChart.addActionListener(new java.awt.event.ActionListener() {
                public void actionPerformed(java.awt.event.ActionEvent e) {
                    generateChart();
                }
            });
        }
        return btnChart;
    }

    private void generateChart() {
        String title = "Average Salary (2004 - 2008)";
        String categoryLabel = "Year";
        String valueLAbel = "Salary (x1000 USD)";
        CategoryDataset dataSet = populateDataSet();
        String type = (String) getComboOption().getSelectedItem();

        JFreeChart chart = null;
        if (type.equals("LINE")) {
            chart = ChartFactory.createLineChart(title, categoryLabel, valueLAbel, dataSet, PlotOrientation.VERTICAL, true, true, true);
        }
        else if (type.equals("LINE 3D")) {
            chart = ChartFactory.createLineChart3D(title, categoryLabel, valueLAbel, dataSet, PlotOrientation.VERTICAL, true, true, true);
        }
        else if (type.equals("BAR")) {
            chart = ChartFactory.createBarChart(title, categoryLabel, valueLAbel, dataSet, PlotOrientation.VERTICAL, true, true, true);
        }
        else if (type.equals("BAR 3D")) {
            chart = ChartFactory.createBarChart3D(title, categoryLabel, valueLAbel, dataSet, PlotOrientation.VERTICAL, true, true, true);
        }

        if (panelChart.getComponentCount()>0) {
            panelChart.remove(0);
        }
        panelChart.add(new ChartPanel(chart));
        getJContentPane().validate();

    }

    private CategoryDataset populateDataSet() {
        DefaultCategoryDataset dataSet = new DefaultCategoryDataset();
        int[] tahun = {2004,2005,2006,2007,2008};
        int[] MS = {100,120,140,150,155};
        int[] Oracle = {110,120,120,150,160};
        int[] Google = {80,85,100,140,175};

        for (int i=0; i<tahun.length; i++) {
            String thn = String.valueOf(tahun[i]);
            dataSet.addValue(MS[i], "MS", thn);
            dataSet.addValue(Oracle[i], "Oracle", thn);
            dataSet.addValue(Google[i], "Google", thn);
        }

        return dataSet;
    }

    /**
     * This method initializes panelChart
     *
     * @return javax.swing.JPanel
     */
    private JPanel getPanelChart() {
        if (panelChart == null) {
            panelChart = new JPanel();
        }
        return panelChart;
    }

    /**
     * This method initializes comboOption
     *
     * @return javax.swing.JComboBox
     */
    private JComboBox getComboOption() {
        if (comboOption == null) {
            comboOption = new JComboBox();
            comboOption.addItem("LINE");
            comboOption.addItem("LINE 3D");
            comboOption.addItem("BAR");
            comboOption.addItem("BAR 3D");
        }
        return comboOption;
    }

    public static void main(String[] args) {
        new TestChart().setVisible(true);
    }

}  //  @jve:decl-index=0:visual-constraint="10,10"

Hasilnya:

Chart tersebut bisa dikustomisasi sesuai dengan kebutuhan, diantaranya mengatur renderer dan tampilan. Selengkapnya bisa dibaca di sini.

About these ads

September 6, 2008 - Posted by | Java | , ,

15 Comments »

  1. Nice Post and nice blog…. Hmn… mungkin gue bakal sering kesini deh… btw,

    Gue mo nanya nih, gue punya source untuk nampilin pie chart via jsp (pake JFreeChart juga). masalahnya gue butuh fitur agar setiap value dari chart bisa ngelink ke halaman lain dan nampilin detail dari chart tersebut…

    kira-kira sourcenya gini:

    <%
    String[] section = new String[] {
    “Notifikasi”,”Checklist”,”Paripurna”,”Draft Surat”,”Net Surat”,”BPMIGAS”
    };

    // data…
    double[] data = new double[section.length];
    for (int i = 0; i < data.length; i++) {
    data[i] = 10 + (Math.random() * 10);
    }

    // create the dataset…
    DefaultPieDataset dataset = new DefaultPieDataset();
    for (int i = 0; i

    JSP Page

    kalo dari yang gue dapet di forum pake imagemap, cuma masalahnya gimana cara generate imagemap pake JFreeChart…

    sebelumnya maaf kalo commentnya panjang banget

    Comment by Amaran Sidhiq | October 14, 2008 | Reply

    • Wah, sorry, belum pernah nyoba juga tuh :)

      Comment by suhearie | December 3, 2009 | Reply

  2. wah kayanya ga bisa posting code di comment ya? heheheh…. btw kalo ada solusi share ya?

    thanks

    Comment by Amaran Sidhiq | October 14, 2008 | Reply

  3. om mau nanya nech….. butuh pertolongan om… kalo pake JFreeChart create dataset yang ngambil data dari database kayak gmana ya caranya… pusing banget nech… aku pake database oracle… mohon bantuannya kalo bisa kirim ke emailku….. thanks banget

    Comment by pang2 | April 20, 2009 | Reply

  4. mas nunmpang nanya,koq file jfreechartnya tdk ada file ‘.jar’nya ya?
    so gimana ya carae bisa punya file jfreechart yang .jar, mohon petunjuk dan sarannya?? thank’s before…

    Comment by satriya | May 27, 2009 | Reply

  5. kalau data untuk grafiknya diambil dari database, gimana ya?..

    Comment by aria | December 3, 2009 | Reply

    • Lihat reply di atas (comment no 3)

      Comment by suhearie | December 3, 2009 | Reply

  6. nice post

    Comment by kariansy | February 27, 2010 | Reply

  7. great..thank u 4 d post… :-)

    Comment by Shary_Tux | August 21, 2010 | Reply

  8. mau nanya, klo jfreechart kan buat nampilin grafik (uda pernah dapet pas kuliah), nah klo buat nampilin ato bikin visualisasi gambar 2D pake apa?
    apa pake jfreechart juga?
    trus klo mau bikin grafik 3D atau bikin visualisasi gambar 3D gitu pake apa?
    terima kasiih…

    *saya pake netbeans IDE 6.0

    Comment by Etty | September 17, 2011 | Reply

    • Maksudnya mau nge-gambar 2D atau 3D secara low level? Ada yang namanya Java 2D API (http://java.sun.com/products/java-media/2D/index.jsp), bisa dipake untuk membuat gambar 2D. JFreeChart sepertinya juga menggunakan ini sebagai pondasi untuk grafiknya. Kalo untuk 3D bisa diliat di http://www.oracle.com/technetwork/java/javase/tech/index-jsp-138252.html. Tapi yang ini saya belum pernah coba. Silahkan dicoba & ditunggu sharing infonya..

      Comment by suhearie | September 19, 2011 | Reply

      • gini, saya kan mau bikin tugas akhir tentang visualisasi menggunakan netbeans, intinya dari sebuah pengukuran nanti diketahui hasilnya kemudian di panggil dengan sintak java, di plot dan bisa di visualisasikan menggunakan gambar 2D dan 3D, tetapi saya bingung gimana mulai belajarnya, karena saya gag mudeng2 banget tentang java
        hehehehehe
        terimakasih infonya, saya coba belajar…
        ^.^

        Comment by Etty | September 20, 2011

      • saya jadi inget pernah komen disini..
        makasii infonya./

        Comment by etty | December 7, 2012


Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

Follow

Get every new post delivered to your Inbox.

%d bloggers like this: