Работа с графиками и диаграммами google chart

Ильдар Сарибжанов | 30.01.2017

У гугла есть сотни крутых сервисов, начиная от почты gmail и заканчивая уведомлениями google alert. Но самое прикольное, что есть гугловские сервисы, которые упрощают жизнь разработчикам, например, google font для нестандартных шрифтов на сайте или  google chart для построения графиков.

Вот о последнем я и хочу поговорить. Если кто пытался постичь этот неимоверный сервис, то видел какого объема документация для разработчиков. Естественно, при выполнении прикладных задач, никто всю документацию читать не будет, я тоже не стал заниматься фигней, и полез сразу в примеры. Чтобы вывести 2 таких графика, я потратил очень много времени.

Поэтому хочу помочь таким же бедолагам и сэкономить их время. А заодно будет и мне небольшая шпаргалка.

Построение круговой диаграммы

Начнем с круговой диаграммы, я посчитал, что эта задача сложнее и поэтому начал с нее. Вариант из примеров выглядит так:

See the Pen vgWwWW by Ildar Saribzhanov (@ildar_r_saribzhanov) on CodePen.

От него и будем плясать. Что меня не устроило? Во-первых, цвета, не то чтобы они мне не понравились, но в макете были другие. Поэтому начнем с изменения цветов сегмента. Благо поиск по странице документации слова «color» быстро меня навел на нужный кусок. В опции надо запихать необходимые параметры:

var options = {
	title: 'Название',
	pieHole: 0.6,
	slices: {
		0: { color: '#56b900' },
		1: { color: '#cccccc' }
	}
};

Шестнадцатиричное значение цвета или можно написать то, что понимает css: ‘yellow’, ‘red’ и т.д. Количество предустановленных цветов не обязательно должно равняться количеству реально заданных сегментов, но лучше установить количество цветов с запасом, т.к. если ваших цветов не будет хватать, то диаграмма возьмет их из значений по умолчанию, что может сильно поломать ваш дизайн. Сразу изменим толщину рамки у диаграммы, за это отвечает параметр pieHole (размер дырки от бублика =) ), значения от нуля до единицы, где ноль это сплошные сегменты, а при n→1 рамка становится тоньше.

Еще мне нужно, чтобы размер самой диаграммы был максимальным на холсте, а вот легенда мне вообще не нужна, и фон тоже надо бы убрать.  Опять же это меняется через объект опций:

var options = {
	title: '',
	pieHole: 0.6,
	slices: {
		0: { color: '#56b900' },
		1: { color: '#cccccc' }
	},
	backgroundColor: 'transparent',
	legend         : 'none',
	chartArea      : {left: 10, top: 10, width: '95%', height: '95%'}
};

Значения говорят сами за себя. С chartArea есть особенность, если точку начала установить в нуле, а размеры сделать по 100%, то будет небольшой баг, при наведении на сегмент он подсвечивается, и вот эта подсветка обрежется границами обертки, поэтому я отступил от края. Теперь завернем все это в более осмысленную функцию (мне хочется верить, что она более осмысленная) и посмотрим что получается.

See the Pen oBoRGZ by Ildar Saribzhanov (@ildar_r_saribzhanov) on CodePen.

Продублирую функцию отдельно (вдруг онлайн интерпретатор удалит мое творение?), чтобы дать комментарии

function drawChartRound( arr_data, id ) {
	var data = google.visualization.arrayToDataTable(arr_data);

	var options = {
		title: '',
		pieHole: 0.6,
		slices: {
			0: { color: '#56b900' },
			1: { color: '#cccccc' }
		},
		legend         : 'none',
		backgroundColor: 'transparent',
		chartArea      : {left: 10, top: 10, width: '95%', height: '95%'}
	};

	var chart = new google.visualization.PieChart(document.getElementById(id));
	chart.draw(data, options);
}

// Пример вызова
google.charts.load("current", {packages:["corechart"]});
var data = [['Actives', ''], ['var 1', 4], ['var 2', 6]];
drawChartRound( data, 'id_block' );

Принимает 2 параметра: массив с данными (первым элементом в массиве должно идти описание графика) и id блока куда встраивать диаграмму. Таким образом не обязательно отрисовывать график в момент готовности АПИ, можно вызвать в любой другой удобный момент, например, кода пользователь введет данные, которые нужно визуализировать. Мне кажется, это хорошо.

Построение гистограммы

Несмотря на то, что я считал эту задачу простой, но поковыряться пришлось с ней больше, чем с круговой диаграмой. Конечно, проблема, в примерах, они были сильно перегружены.

Сразу дам итоговый вариант, и опишу что здесь за что отвечает

See the Pen dNZBJg by Ildar Saribzhanov (@ildar_r_saribzhanov) on CodePen.

И сама функция выглядит так

function drawHistogramChart( info, id ) {
	var data = google.visualization.arrayToDataTable(info);

	var view = new google.visualization.DataView(data),
		max  = 0;

	for(itm in info ) {
		if( max < info[itm][1] ) {
			max = info[itm][1];
		}
	}

	var options = {
		title          : "",
		chartArea      : {left: 0, top: 0, width: '100%', height: '100%'},
		backgroundColor: 'transparent',
		bar            : {groupWidth: "95%"},
		width          : 280,
		vAxis          : {
			minValue: 0,
			maxValue: max
		}
	};
	var chart   = new google.visualization.ColumnChart(document.getElementById(id));
	chart.draw(view, options);
}

// вызывается так
google.charts.load("current", {packages:["corechart"]});
var data = [
	["", "", {role: "style"}],
	["Описание 1", 10, "#cccccc"],
	["Описание 2", 8, "#56b900"]
];
drawHistogramChart(data, 'capital');

По умолчанию включено слишком много всего. Что хочется отметить, если в круговой диаграмме настройки цвета секторов шли отдельной настройкой, то тут цвета передаются в массиве с данными.

Параметр chartArea в действительности очень сильно влияет на отображение. Если точку начала рисования отодвинуть от края, то появится градация шкал. Если высоту задать меньше 100%, то снизу появятся подписи к колонкам, если ширину установить меньше 100%, то справа появится кнопка выделения группы. Или что-то типа такого, по примерам из документации можно понять, что происходит.

Параметр bar — устанавливает ширину колонок.
vAxis — устанавливает максимально и минимальное значение шкалы, может быть важно, если необходимо, чтобы была видна нулевая точка. Так как я старался сделать функцию универсальной, то максимальное значение вычисляется, а не устанавливается жестко.

Итого

Однозначно Google Chart очень мощный сервис от корпорации добра.  Если внимательно изучить примеры, то видно, что я использую крайне малую долю возможностей, там еще есть анимации для диаграмм, можно было заморочиться. Хочется верить что гугл не прикроет его, а иначе все наши красивости превратятся в тыкву. В этом и основной минус, я сам себя подписал на зависимость от третьих лиц. Когда только анализировал «рынок решений» для своей задачи, то посматривал в сторону d3.js, но мне он показался еще более мудреным. Когда-нибудь доберусь и до него, но как говорится в одном оскароносном фильме: «Не сейчас. Не сейчас…»

Всем рок!