четвер, 29 грудня 2011 р.

Cтворюємо графіки з допомогою JFreeChart

Декілька років назад довелося малювати графік в Java аплеті. Як виявилося не така вже й проста задача, особливо коли кількість даних постійно змінюється і розміри аплета теж. Тоді ж натрапив на безкоштовну бібліотеку JFreeChart, яка дозволяє малювати діаграми різного типу: графіки, стовпцеві діаграми, кругові і т.д. Зараз таких бібліотек доволі багато як безплатних так і платних. Платні переважно надають доволі непогану візуалізацію з ефектами об’ємності і т.п. JFreeChart дещо гірше промальовує графіку, але порівняно з іншими безкоштовними – це одна із найкращих, яка має багато засобів для модифікації вигляду графіку, виводу міток і написів над точками, масштабування осей та графіків тощо. Щоправда дещо заплутана документація. Існує також платний посібник розробника, який дещо детальніше описує процес створення. Багато прикладів можна знайти в Інтернеті і роз’яснень до них. Можна навіть скачати посібник до старіших версій бібліотеки.
Для використання JFreeChart необхідно скачати два jar файли JCommon та JFreChart з офіційного сайту. В інструкції по встановленню описано як можна підключити бібліотеки для використання разом з NetBeans та Eclipse. Також можна запустити демонстраційну програму, яка демонструє приклади готових графіків. Їхній код можна отримати разом з посібником. Багато прикладів програм можна знайти тут:  http://www.java2s.com/Code/Java/Chart/CatalogChart.htm
Алгоритм створення графіку простий:
1)    Створити набір даних (dataset)
2)    Створити об’єкт діаграми, який відповідатиме за вивід діаграми
3)    Додати графік на якусь графічну компоненту

Розглянемо як можна намалювати звичайний лінійний графік.  Їх можна створити засновуючись на двох типах даних, які базуються на інтерфейсах CategoryDataset та XYDataset.
Перший вид графіків передбачає, що на одній з осей будуть знаходитись цифрові значення, а на іншій текстові значення (категорії).

Другий тип передбачає, що і по X та по Y знаходяться числові значення. Саме такий ми будемо будувати.
Існують також можливість створення часових діаграм, на яких одна з осей представляє собою час. Дані графіки базують на XYDataset .
Вибір типу діаграми визначає які класи будуть застосовуватись при її створенні і відповідно, які методи будуть  доступні для роботи з даною діаграмою.
Далі наведений приклад програми, що малює два графіки на одній області.
import javax.swing.JFrame;
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.xy.XYSeries;
import org.jfree.data.xy.XYSeriesCollection;

public class FirstXYChart {
public static void main(String[] args) {

 JFrame frame = new JFrame(); //створюємо каркас вікна
 frame.setTitle("Графік");    //заголовок вікна
 frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

 //створюємо 1 ряд даних
 XYSeries series = new XYSeries("Ряд1 1");
 //додаємо точки на графіку
   series.add(1, 11);
   series.add(2, 12);
   series.add(3, 13);
   series.add(4, 14);
   series.add(5, 15);
   series.add(6, 16);
   series.add(7, 17);
   series.add(8, 58);
   series.add(9, 19);
   series.add(10, 11);

//створюємо 2 ряд даних
XYSeries series2 = new XYSeries("Ряд1 2");
   series2.add(2, 1);
   series2.add(2, 3);
   series2.add(4, 3);
   series2.add(4, 5);
   series2.add(6, 7);
   series2.add(6, 8);
   series2.add(9, 7);
   series2.add(8, 28);
   series2.add(13, 9);
   series2.add(12, 12);

// зразу ж додаємо ряд в набір даних
XYSeriesCollection data = new XYSeriesCollection(series);
data.addSeries(series2); // додаємо другий ряд в набір
//створюємо діаграму
final JFreeChart chart = ChartFactory.createXYLineChart(
  "XY Series Example",
  "X",
  "Y",
  data,
  PlotOrientation.VERTICAL,
  true,
  true,
  false
);

 //створюємо панель для графіка
 final ChartPanel chartPanel = new ChartPanel(chart);
 //встановлюємо розмір графіка
 chartPanel.setPreferredSize(new java.awt.Dimension(500, 270));
 //додаємо панель на створений нами фрейм
 frame.setContentPane(chartPanel);
 //підганяємо розміри фрейму
 frame.pack();
 //робимо усе видимим
 frame.setVisible(true);
 }
}
Результат:

Практично схожим чином можна створювати і інші типи діаграм.
Модифікація діаграм
В JFreeChart також передбачені широкі можливості по зміні зовнішнього вигляду діаграми.
Наприклад, змінюємо фон:
XYPlot plot=chart.getXYPlot();         // одержати область побудови діаграми
plot.setBackgroundPaint(Color.CYAN);   // встановлюємо колір

Крім задання кольору, можна поставити як фон певне зображення.
Якщо хочемо змінити колір кривих:
XYItemRenderer renderer=plot.getRenderer();  //отримати візуалізатор(рендерер)
renderer.setSeriesPaint(0, Color.darkGray);  // задаємо колір першого графіка
renderer.setSeriesPaint(1, Color.GREEN);     // задаємо колір другого графіка

Можна також задавати мітки на графіки, вигляд точок і т.п. З усім можна розібратись по документації та наявних в інтернеті прикладах.