Google Charts и парочка мыслей
Доброго времени суток 😉
В общем ситуация такова, что часто приходится по каким либо причинам рисовать график, когда совсем не хочется видеть сухих данных в текстовом виде.
В результате чего, я решил прибегнуть к решению, которое предлагает Google ( хотя существуют и другие решения, но как говорится, что первое под руку попало, то и взял, да и не было особой надобности использовать другое решение).
И как можно заметить, компания реализовала достаточно много разных способов отображения, это: Geo Chart, Scatter Chart, Column Chart, Histogram, Line Chart и еще много много и т.д и т.п. Все виды предложенных графиков, которые можно применить, Вы можете посмотреть вот тут — Chart Gallery.
Лично мне необходимо было использовать Линейный График (Line Chart), чем я воспользовался. Просто дело в том, что мои данные собираются достаточно часто укладываясь аккуратненько в БД MySQL 😉 В связи с чем, хотел бы поделиться уже готовым решением (взятым на просторах сети), которое я реализовал для себя, дабы не конструировать велосипеды.
Частично код написан на PHP, База Данных как я уже сказал MySQL, клиентский код написан на JS дабы связать все с Google API.
Для подключения к БД использовал паттерн — Singleton:
<?
class Db{
const DB_HOST = 'localhost'; //
const DB_USERNAME = 'username'; // Эти данные лучше вынесите в другой файл, например config.php
const DB_PASSWORD = 'password'; // Они добавлены лишь для примера, соответственно и параметры подключения к БД
const DB_NAME = 'db_name'; // немного изменятся!
private static $_instance;
private function __construct(){}
private function __clone(){}
protected function __wakeup(){}
public static function getInstance(){
if(!self::$_instance instanceof self) {
self::$_instance = new MYSQLi(self::DB_HOST,self::DB_USERNAME,self::DB_PASSWORD,self::DB_NAME);
}
return self::$_instance;
}
public static function getDbname(){
return self::DB_NAME;
}
public function __destruct(){
unset(self::$_instance);
}
}
Ну, а здесь уже представлена выборка необходимых данных:
// Файл getdata.php
function __autoload($class_name) {
include_once(__DIR__."/".$class_name . ".php");
}
function getData($id){
$json = '';
$db = DB::getInstance();
$data = $db->query("SELECT `id`,`date`, `mens`, `womens` FROM `data` WHERE `id` = ".(int)$id." ORDER BY `date` ASC")->mysqli_fetch_all(MYSQLI_ASSOC);
return createGoogleFormatJson($data);
}
function createGoogleFormatJson($big_data){
$data = '{"cols":[';
$data .='{"id":"","label":"Дата","pattern":"","type":"string"},';
$data .='{"id":"","label":"Количество мужчин","pattern":"","type":"number"},';
$data .='{"id":"","label":"Количество женщин","pattern":"","type":"number"}';
$data .='],"rows":[';
foreach($big_data as $bd){
$data.='{"c":[{"v":"'.$bd['date']. '"},{"v":'.$bd['mens'].'},{"v":'.$bd['womens'].'}]},';
}
$data=rtrim($data,',');
$data.=']}';
return $data;
}
createGoogleFormatJson функция для формирования Json представления пригодного для Google API
В моем случае это было 3 параметра: Дата, Кол-во мужчин, Кол-во женщин.
В общем целом должно получиться, нечто вот такого порядка, однако соответствующего вашим данным соотвественно:
{"cols":[
{"id":"","label":"Дата","pattern":"","type":"string"},
{"id":"","label":"Количество мужчин","pattern":"","type":"number"},
{"id":"","label":"Количество женщин","pattern":"","type":"number"}],
"rows":[
{"c":[
{"v":"2015-04-10 10:00:00"},
{"v":1000},
{"v":900}]},
{"c":[
{"v":"2015-04-11 10:00:00"},
{"v":980},
{"v":930}]},
{"c":[{"v":"2015-04-11 10:00:00"},
{"v":1012},
{"v":983}]},
..............
..............
{"c":[
{"v":"2015-10-16 10:00:00"},
{"v":1620},
{"v":1202}]},
}
Ну, а после данных процедур делаем следующее уже на клиентской части отдаем Гуглу и пущай ришует:
<html>
<head>
<!--Load the AJAX API-->
<script type="text/javascript" src="https://www.google.com/jsapi"></script>
<script type="text/javascript" src="//ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
<script type="text/javascript" src="https://www.google.com/jsapi?autoload={'modules':[{'name':'visualization','version':'1.1','packages':['corechart', 'timeline']}]}"></script>
<script type="text/javascript">
google.load('visualization', '1.1', {packages: ['corechart', 'line']});
google.setOnLoadCallback(drawCurveTypes);
function drawCurveTypes() {
var jsonData = $.ajax({
url: "getdata.php?id=1",
dataType: "json",
async: false
}).responseText;
var data = new google.visualization.DataTable(jsonData);
var options = {
hAxis: {
title: 'Дата',
gridlines: {
count: 20,
units: {
days: {format: ['MMМ dd']},
hours: {format: ['HH:mm', 'ha']}
}
}
},
colors: ['#0026FF', '#cc0000'],
vAxis: {
title: 'Количество людей',
count: 20
},
width: 1580,
height: 780,
//series: {
//1: {curveType: 'function'}
//}
trendlines: {
0: {
type: 'polynomial',
showR2: true,
visibleInLegend: true
}
}
};
var chart = new google.visualization.LineChart(document.getElementById('chart_div'));
chart.draw(data,options);
}
</script>
</head>
<body>
<div id="chart_div"></div>
</body>
</html>
А вот какой получился у меня:
И еще раз уточнюсь для Вашего случая будет совсем иная ситуация, соответственно и график другой, и выборка данных другая.
Если возникли вопросы задавайте, постараюсь по возможности ответить.
Спасибо за внимание 😉


