skysilver

 
<<< Back

Кастомный график в модуле Charts

Делаем кастомный график уличной температуры с помощью модуля Charts, используя магию html-верстки.

Штатные возможности модуля Charts не позволяют широко кастомизировать внешний вид графиков. Имеющаяся в модуле опция настройки на вкладке Данные распространяется только на ось Y графика, чего зачастую бывает недостаточно. Чтобы обойти данную несправедливость можно самостоятельно с нуля накодить вывод графика в HTML-элементах Меню или Сцен, использую API Highcharts в полном объеме. Либо воспользоваться моим вариантом обхода ограничений модуля, который становится возможным благодаря небольшим манипуляциям с html-версткой в модуле.

Внимание! Данное решение не работает на новой версии модуля от 13.11.2018 г. Используйте новую опцию Highcharts Setup (см. дополнение в конце статьи).

Собственно все действия проводятся в опции Настроить вкладки Данные.

Если в это поле настроек ввести следующий код

}], // Начинаем всегда с этой строки.

// Здесь будет находиться JSON графика.

// Завершаем обязательно такими строками.
});
});

// Здесь можно добавить локализацию графика.

</script><script>/* <!--

то он разорвет сущесутвующую верстку и даст нам возможность сформировать и вписать нашу собственную JSON-структуру графика.

При этом следует понимать, что по факту мы обрезали большую часть кода графика, которую за нас автоматически сформировал модуль. И теперь вся ответственность по формирования валидной JSON-структуры графика полностью на нас. Шаг влево, шаг вправо - получаем не график, а пустую страницу.

Что же можем теперь сделать с графиком? Вообщем-то, почти все, что есть в API Highcharts. Читаем api docs, смотрим демки, проникаемся и кодим.

Для начала сменим цвет и размер заголовка:

title: {
   text: 'Температура на улице',
   style: {
      color: '#FFF',
      font: '12px Lucida Grande, Lucida Sans Unicode, Verdana, Arial, Helvetica, sans-serif'
   }
},

Затем немного настроим ось X - размер подписей, их наклон и формат, а также засечки передвинем внутрь области графика.

xAxis: {
   type: 'datetime',
   tickPosition: 'inside',
   labels: {
      overflow: 'justify',
      rotation: -45,
      style: {fontSize: '11px'}
   },
   dateTimeLabelFormats: {day: '%e %b'}
},

Ось Y в данной случае не так интересна, поэтому уберем только подпись с названием оси.

yAxis: {
   title: null
},

Спрячем ссылку на сайт Highcharts.

credits: {
   enabled: false
},

Убираем легенду.

legend: {enabled: false},

Обязательно (!) прописываем настройки серий. В данном примере серия только одна - температура (мультисерийные графики я не тестировал). Указываем название, единицу измерения, отключаем отображение маркеров на линии графика, выключаем эффект утолшения линии при наведении указателя, выставляем цвет графика для положительных и отрицательных значений.

series: [{
   name: 'Температура',
   tooltip: {
      valueSuffix: ' °C',
   },
   marker: {
      enabled: true,
      radius: 1,
   },
   states: {
      hover: {lineWidth: 2}
   },
   color: '#FF3333',
   negativeColor: '#48AFE8',
   data: []
}]

Напоследок локализуем график.

Highcharts.setOptions({
   lang: {
      loading: 'Загрузка...',
      months: ['Январь', 'Февраль', 'Март', 'Апрель', 'Май', 'Июнь', 'Июль', 'Август', 'Сентябрь', 'Октябрь', 'Ноябрь', 'Декабрь'],
      weekdays: ['Воскресенье', 'Понедельник', 'Вторник', 'Среда', 'Четверг', 'Пятница', 'Суббота'],
      shortMonths: ['Янв', 'Фев', 'Март', 'Апр', 'Май', 'Июнь', 'Июль', 'Авг', 'Сент', 'Окт', 'Нояб', 'Дек'],
      exportButtonTitle: "Экспорт",
      printButtonTitle: "Печать",
      rangeSelectorFrom: "С",
      rangeSelectorTo: "По",
      rangeSelectorZoom: "Период",
      downloadPNG: 'Скачать PNG',
      downloadJPEG: 'Скачать JPEG',
      downloadPDF: 'Скачать PDF',
      downloadSVG: 'Скачать SVG',
      printChart: 'Напечатать график',
      resetZoom: 'Сбросить зум',
      resetZoomTitle: 'Сбросить зум',
      thousandsSep: " ",
      decimalPoint: '.'
   }
});

Сохраняем. Открываем график и смотрим результат.

Так выглядит стандартный график уличной температуры за 4 дня.

hc1
А так - тот же самый график, но уже после кастомизации.

hc2

Ниже привожу полный код настройки графика.

}], // Начинаем всегда с этой строки.

// Здесь будет находиться JSON графика.
title: {
   text: 'Температура на улице',
   style: {
      color: '#FFF',
      font: '12px Lucida Grande, Lucida Sans Unicode, Verdana, Arial, Helvetica, sans-serif'
   }
},
xAxis: {
   type: 'datetime',
   tickPosition: 'inside',
   labels: {
      overflow: 'justify',
      rotation: -45,
      style: {fontSize: '11px'}
   },
   dateTimeLabelFormats: {day: '%e %b'}
},
yAxis: {
   title: null
},
credits: {
   enabled: false
},
legend: {enabled: false},
series: [{
   name: 'Температура',
   tooltip: {
      valueSuffix: ' °C',
   },
   marker: {
      enabled: true,
      radius: 1,
   },
   states: {
      hover: {lineWidth: 2}
   },
   color: '#FF3333',
   negativeColor: '#48AFE8',
   data: []
}]

// Завершаем обязательно такими строками.
});
});

// Здесь можно добавить локализацию графика.
Highcharts.setOptions({
   lang: {
      loading: 'Загрузка...',
      months: ['Январь', 'Февраль', 'Март', 'Апрель', 'Май', 'Июнь', 'Июль', 'Август', 'Сентябрь', 'Октябрь', 'Ноябрь', 'Декабрь'],
      weekdays: ['Воскресенье', 'Понедельник', 'Вторник', 'Среда', 'Четверг', 'Пятница', 'Суббота'],
      shortMonths: ['Янв', 'Фев', 'Март', 'Апр', 'Май', 'Июнь', 'Июль', 'Авг', 'Сент', 'Окт', 'Нояб', 'Дек'],
      exportButtonTitle: "Экспорт",
      printButtonTitle: "Печать",
      rangeSelectorFrom: "С",
      rangeSelectorTo: "По",
      rangeSelectorZoom: "Период",
      downloadPNG: 'Скачать PNG',
      downloadJPEG: 'Скачать JPEG',
      downloadPDF: 'Скачать PDF',
      downloadSVG: 'Скачать SVG',
      printChart: 'Напечатать график',
      resetZoom: 'Сбросить зум',
      resetZoomTitle: 'Сбросить зум',
      thousandsSep: " ",
      decimalPoint: '.'
   }
});

</script><script>/* <!--

Важно!

В связи с неожиданным (внеплановым) обновлением модуля от 13 ноября 2018 г. все вышеуказанные манипуляции можно и нужно делать через штатную возможность модуля - настройка Highcharts Setup на вкладке Общее. При этом несколько изменится синтаксис конфига, но общие принципы кастомизации останутся точно такие же.

hc3

Полный код настройки графика через опцию Highcharts Setup будет выглядеть так:

function (config, options) {
config.credits = {enabled: false};
config.legend= {enabled: false};
config.yAxis = {title: null};
config.xAxis = {
   type: 'datetime',
   tickPosition: 'inside',
   labels: {
      overflow: 'justify',
      rotation: -45,
      style: {fontSize: '11px'}
   },
   dateTimeLabelFormats: {day: '%e %b'}
};
config.title = {
   text: 'Температура на улице',
   style: {
      color: '#FFF',
      font: '12px Lucida Grande, Lucida Sans Unicode, Verdana, Arial, Helvetica, sans-serif'
   }
};
config.series = [{
   name: 'Температура',
   tooltip: {
      valueSuffix: ' °C',
   },
   marker: {
      enabled: true,
      radius: 1,
   },
   states: {
      hover: {lineWidth: 2}
   },
   color: '#FF3333',
   negativeColor: '#48AFE8',
   data: []
}];
options.lang = {
      loading: 'Загрузка...',
      months: ['Январь', 'Февраль', 'Март', 'Апрель', 'Май', 'Июнь', 'Июль', 'Август', 'Сентябрь', 'Октябрь', 'Ноябрь', 'Декабрь'],
      weekdays: ['Воскресенье', 'Понедельник', 'Вторник', 'Среда', 'Четверг', 'Пятница', 'Суббота'],
      shortMonths: ['Янв', 'Фев', 'Март', 'Апр', 'Май', 'Июнь', 'Июль', 'Авг', 'Сент', 'Окт', 'Нояб', 'Дек'],
      exportButtonTitle: "Экспорт",
      printButtonTitle: "Печать",
      rangeSelectorFrom: "С",
      rangeSelectorTo: "По",
      rangeSelectorZoom: "Период",
      downloadPNG: 'Скачать PNG',
      downloadJPEG: 'Скачать JPEG',
      downloadPDF: 'Скачать PDF',
      downloadSVG: 'Скачать SVG',
      printChart: 'Напечатать график',
      resetZoom: 'Сбросить зум',
      resetZoomTitle: 'Сбросить зум',
      thousandsSep: " ",
      decimalPoint: '.'
   }
}

Discuss (8) (45)

See also:
2020-04-06 Получение данных о COVID с карты Яндекс
2019-07-12 MajorDoMo и Яндекс Алиса. Алиса, включи канал Карусель.
2019-06-20 MajorDoMo и Яндекс Алиса. Алиса, измени цвет бра на красный.
2019-06-18 MajorDoMo и Яндекс Алиса. Алиса, сделай ярче настольную лампу.
2019-06-17 MajorDoMo и Яндекс Алиса. Алиса, включи свет на кухне.
2019-06-10 MajorDoMo и Яндекс Алиса. Модуль Yandex Home.
2019-06-06 MajorDoMo и Яндекс Алиса. Объединение аккаунтов.
2019-06-05 MajorDoMo и Яндекс Алиса. Регистрация приватного навыка.
2019-06-03 Загрузка PHP-расширения PDO MySQL в Windows
2019-06-01 MajorDoMo и Яндекс Алиса. Публикация вебхуков.
2019-05-29 MajorDoMo и Яндекс Алиса. Общие сведения.
2019-05-22 Экспресс контроль состояния циклов в Linux
2019-05-08 Сценарий контроля состояния SSL сертификатов сайтов
2019-02-26 Экспорт графиков в PNG-файл в модуле Charts
2019-01-26 Мультисерийный кастомный график в модуле Charts
2018-12-13 График с цветовой индикацией выхода величины за пределы
2018-08-15 Кронштейн NB F120 (North Bayou)
2018-07-18 WiFi-информер на светодиодных матрицах MAX7219 и ESP8266. Часть 3.
2018-06-20 WiFi-информер на светодиодных матрицах MAX7219 и ESP8266. Часть 2.
2018-06-15 WiFi-информер на светодиодных матрицах MAX7219 и ESP8266. Часть 1.
2018-05-20 Кросс-компиляция ядра для Banana Pi M2U
2018-05-14 Ссылки на ресурсы по MajorDoMo
2018-03-02 Знакомство и тестирование Banana Pi M2U
2018-02-21 Распаковка Banana Pi M2U
2018-02-14 Одноплатный ПК для MajorDoMo
2018-08-14 Заметки по железу
2018-01-23 Мой взгляд на вопрос голосового управления в MajorDoMo
2018-01-17 Обзор цен на устройства Xiaomi
2017-12-24 Гирлянда на ESP8266 и WS2812
2017-12-20 Блог им. skysilver

Киров, Россия

На форуме: skysilver

Web-site URL:
http://connect.smartliving.ru/profile/461