Настройка диаграммы JFreeChart

Архитектура библиотеки JFreeChart создана таким образом, чтобы пользователь мог статически и динамически настраивать графические представления данных. Имеется большое количество атрибутов, позволяющих изменить стандартный внешний вид диаграмм. На верхнем уровне, используя методы JFreeChart, можно настроить внешний вид диаграммы :

  • границы диаграммы;
  • заголовки и подзаголовки диаграммы;
  • цвет фона и/или изображения;
  • отображаемые на диаграммах подсказки.

Границы диаграммы

По умолчанию граница вокруг диаграммы JFreeChart не отображается. Чтобы прорисовать границу необходимо использовать метод setBorderVisible(boolean). Функция isBorderVisible() позволяет узнать, прорисовывается ли граница. Цвет и стиль границы определяются методами setBorderPaint(Paint) и setBorderStroke(Stroke) методы.

Примечание : при отображении диаграмм в ChartPanel можно использовать свойства границ, предоставляемые библиотекой Swing.

Отступ графической части диаграммы от границы устанавливается методом setPadding(RectangleInsets). Нулевое значение padding (null) недопустимо.

Заголовки диаграммы

Заголовок является экземпляром класса TextTitle. Его можно получить методом getTitle(). Наименование заголовка диаграммы определяется методом setTitle(title). Чтобы исключить отображение заголовка диаграммы, необходимо в метод передать значение null.

Заголовок диаграммы по умолчанию размещается сверху. Его можно также разместить внизу, слева или справа. Для этого следует использовать метод setPosition(RectangleEdge).

JFreeChart chart = ChartFactory.createBarChart(...);
TextTitle title = chart.getTitle();
chart.setTitle("Заголовок диаграммы");

chart.getTitle().setPosition(RectangleEdge.BOTTOM);

Подзаголовки диаграммы

На диаграмме можно разместить несколько подзаголовков. Чтобы добавить подзаголовок к диаграмме необходимо использовать метод addSubtitle(TextTitle). Чтобы модифицировать заголовок необходимо получить ссылку на подзаголовок методом getSubtitle(int idx), где idx определяет порядковый номер подзаголовка (отсчет от 0).

TextTitle subtitle1 = new TextTitle("Подзаголовок диаграммы");
chart.addSubtitle(subtitle1);

Title subtitle = chart.getSubtitle(0);

Метод getSubtitleCount() возвращает количество подзаголовков в диаграмме. Чтобы получить весь список ( коллекция List ) подзаголовков используйте метод getSubtitles().

Цвет фона диаграммы

Чтобы изменить цвет фона диаграммы необходимо использовать метод setBackgroundPaint(interface Paint). В качестве параметра можно передать один из объектов Color, GradientPaint или TexturePaint. Согласно типу параметра фон диаграммы будет представлен либо однородным цветом, либо в виде градиентного цвета или текстуры.

chart1.setBackgroundPaint(Color.blue);
 
Paint p = new GradientPaint(0, 0, Color.white, 1000, 0, Color.blue));
chart2.setBackgroundPaint(p);

Если в качестве фона предполагается использовать изображение, то следует вызвать метод setBackgroundPaint(null) с нулевым параметром.

Изображение в качестве фона диаграммы

Фоном диаграммы может быть изображение. Для этого используйте метод setBackgroundImage(Image). По умолчанию изображение масштабируется в соответствии с размером диаграммы. Чтобы исключить масштабирование фонового изображения необходимо использовать метод setBackgroundImageAlignment (Align). Метод setBackgroundImageAlpha (float) позволяет изменить прозрачность изображения.

java.awt.Image image = JFreeChart.INFO.getLogo();

chart.setBackgroundImage(image);

chart.setBackgroundImageAlignment(Align.TOPLEFT);

chart.setBackgroundImageAlpha(0.5f);

Если необходимо, чтобы изображение размещалось не под всей диаграммой, а только под графиком (внутри обрамленной осями области), то следует использовать объект Plot, который можно получить из chart.

Атрибуты графика Plot

Графическая часть объекта JFreeChart, обрамляемая осями, классифицируется объектом Plot, имеющего большое количество свойств и методов. Метод getPlot() класса JFreeChart возвращает объект Plot. Можно также получить ссылку на определенный тип подкласса Plot. Например :

Plot          plot1 = chart.getPlot();
CategoryPlot  plot2 = chart.getCategoryPlot();
XYPlot        plot3 = chart.getXYPlot();

Помните, что эти методы вызывают исключения ClassCastException, если вызываемый тип подкласса plot не соответствуют заданному классу.

Цвет фона графика plot

Чтобы определить цвет фона plot'a необходимо использовать метод setBackgroundPaint(interface Paint). В качестве параметра, также как и с JFreeChart, можно передать один из объектов Color, GradientPaint или TexturePaint. Согласно типу параметра фон графика будет представлен либо однородным цветом, либо в виде градиентного цвета или текстуры. Можно в качестве параметра передать нулевое значение (null), если предполагается использовать изображение.

 Plot plot = chart.getPlot();
 plot.setBackgroundPaint(Color.blue);

Изображение в качестве фона графика plot

Фоном графика plot может быть изображение. Также, как и с JFreeChart, для этого используйте метод setBackgroundImage(Image). По умолчанию изображение масштабируется в соответствии с размером plot'a. Чтобы исключить масштабирование фонового изображения необходимо использовать метод setBackgroundImageAlignment (Align). Метод setBackgroundImageAlpha (float) позволяет изменить прозрачность фона.

java.awt.Image image = JFreeChart.INFO.getLogo();

Plot plot = chart.getPlot();
plot.setBackgroundImage(image);
plot.setBackgroundImageAlignment(Align.TOPLEFT);

plot.setBackgroundImageAlpha(0.3f);

Атрибуты осей

Большинство диаграмм, создаваемых JFreeChart, имеют две оси : DomainAxis и RangeAxis. В зависимости от ориентации графика, т.е. в зависимости от значений PlotOrientation.VERTICAL, PlotOrientation.HORIZONTAL, оси DomainAxis/RangeAxis располагаются горизонтально/вертикально или наоборот. Имеются также диаграммы (круговые диаграммы), которые вообще не имеют осей. Для настройки параметров осей используются методы класса Plot для получения ссылки на объекты осей.

Получение ссылки на ось графика

Чтобы настроить параметры осей необходимо получить на них ссылки. Классы CategoryPlot и XYPlot включают методы getDomainAxis() и getRangeAxis(). Эти методы возвращают ссылки на объекты осей типа ValueAxis. исключением является CategoryPlot, у которого CategoryAxis является объектом DomainAxis.

// ссылки на объекты осей
CategoryPlot plot = chart.getCategoryPlot();
CategoryAxis domainAxis = plot.getDomainAxis();

Имеется несколько разных подклассов CategoryAxis и ValueAxis. В некоторых случаях необходимо получить объект оси конкретного класса, чтобы настроить атрибуты. Например, если Вы знаете, что используется NumberAxis , то можно использовать следующий код :

XYPlot plot = chart.getXYPlot();
NumberAxis rangeAxis = (NumberAxis) plot.getRangeAxis();
rangeAxis.setAutoRange(false);

Определение наименований осей

Чтобы определить наименование оси необходимо использовать метод setLabel(String). Для исключения наименования оси из диаграммы методу setLabel(null) передается нулевое значение. Наименование осей также можно определить в методах создания диаграмм createBarChart и createXYLineChart класса ChartFactory. Шрифт, фон и отступ меток наименований осей можно изменить методами setLabelFont(), setLabelPaint(), setLabelInsets() класса Axis.

domainAxis.setLabel("Курс вылюты");
domainAxis.setLabelFont(someFont);

Вращение метки наименования оси

Углом наклона метки наименования оси можно управлять методом setLabelAngle(degree). По умолчанию метки наименования вертикальных осей слева и справа повернуты на 90°, чтобы минимизировать пространство под меткой. Помните, что угол поворота определяется в радианах (Math.PI= 180°).

CategoryPlot plot = chart.getCategoryPlot();
ValueAxis axis = plot.getRangeAxis();
axis.setLabelAngle(Math.PI / 2.0);		

Скрытие цифровой оси

Чтобы скрыть цифровые метки оси следует использовать метод setTickLabelsVisible(false). Но в этом случае ось с делениями останется видимой. Удаление из диаграммы оси с делениями выполняется методами setAxisLineVisible(false) и setTickMarksVisible(false). В следующем примере ось DomainAxis вместе с цифровыми метками будет удалена из диаграммы.

Axis axis = plot.getDomainAxis();

axis.setTickLabelsVisible(false);  // осевые метки значений
axis.setAxisLineVisible(false);    // осевая линия
axis.setTickMarksVisible(false);   // осевые метки делений

Определение отступа осевых меток делений

Цифровую ось можно удалить из диаграммы методом setAxisLineVisible(false). В этом случае метки делений повиснут в «воздухе». Чтобы приблизить метки делений к графику (plot'у) используйте метод setAxisOffset (RectangleInsets).

// Смещение осевых меток делений
plot.setAxisOffset(new RectangleInsets (1.0, 1.0, 1.0, 1.0));

Осевые метки деления

По умолчанию метки делений для цифровых и временных осей устанавливаются на осях так, чтобы метки значений не накладывались. Можно определить собственный порядок представления меток делений используя метод setTickUnit(). В качестве альтернативы для NumberAxis и DateAxis можно использовать собственный объект осевых меток значений, согласно которому между метками делений будут установлены соответствующие расстояния.

Осевые метки значений цифровой оси

Класс NumberAxis содержит метод setStandardTickUnits(), позволяющий определять собственный набор типов значений для осевых меток. В большинстве случаев используется шкала целочисленных значений.

XYPlot plot = chart.getXYPlot();
NumberAxis axis = (NumberAxis) plot.getRangeAxis();
TickUnitSource units = NumberAxis.createIntegerTickUnits();
axis.setStandardTickUnits(units);

Можно использовать собственный набор данных TickUnits (тип Сollection), чтобы иметь возможность больше влиять на графическое представление данных.

Осевые метки значений временной оси

Также, как и для цифровой оси, описанной выше, класс временной оси DateAxis содержит метод setStandardTickUnits(), определяющий собственный набор типов значений для осевых меток. Метод createStandardDateTickUnits() возвращает набор данных для DateAxis. При необходимости можно создать собственный набор значений.

  Рейтинг@Mail.ru