HighCharts - как создать динамический график, который экспортирует все
Я пытаюсь экспортировать динамически сгенерированную диаграмму, и я заметил, что некоторые вещи не экспортируются. Например, мой график PlotBands, которые являются динамическими в зависимости от отображаемых данных.
когда я строил свою диаграмму, я следовал стандартной компоновке кода всех больших примеров HighChart, где я сгенерировал диаграмму сразу при загрузке документа. Затем позже в моем коде я использую вызов Ajax для загрузки данных и изменения таких вещей, как заголовки, полосы участков, пользовательский текст, так далее.
проблема в том, что все изменения на диаграмме после начальной загрузки диаграммы не будут экспортироваться в изображения или PDF. Мой PlotBands были добавлены во время AJAX-вызов. Они не могли быть включены в объект диаграммы, который был построен на document.load()
. Так они удобно игнорируют HighCharts.
В моем графике, я хочу показать использование энергии в течение 24-часового периода на разных сайтах. Пользователь может выбрать разные дни и разные сайты. Нужны полосы участка выделите часы работы, и каждый сайт имеет разные часы работы, которые загружаются с данными. Кроме того, заголовок диаграммы показывает название сайта, а подзаголовок-квадратные метры.
кроме того, мой код рисует некоторый пользовательский текст в нижней части графика с помощью Highcharts renderer .
мой код для едва функционирующего экспорта выглядит примерно так:
var chart;
$(document).ready(function() {
chart = new Highcharts.Chart({
chart: {
renderTo: "ChartContainer",
type: "line",
title: { text: null },
subtitle: { text: null }
}
}
});
function UpdateChart() {
$.ajax({
url: "/my/url.php",
success: function(json) {
chart.addSeries(json[1]);
chart.addSeries(json[2]);
chart.setTitle(json[0].title, json[0].subtitle);
chart.xAxis[0].addPlotBand({ color: "#FCFFB9", from: json[0].OpenInterval, to: json[0].CloseInterval, label: { text: "Operating Hours", verticalAlign: "bottom", y: -5, style: { fontSize: "8pt", color: "gray" } } });
chart.renderer.text("Custom Text", 50, 100);
}
});
}
к сожалению, название, сюжетные полосы и " пользовательские текст" не появится, если пользователь экспортирует графику.
2 ответов
Да - его возможные и highcharts поддерживают вещи, которые вы упомянули здесь sample code
http://jsfiddle.net/vijaykumarkagne/9c2vqq7q/ динамической highchart с использованием данных JSON файла, размещенного в google drive.
$.getJSON("https://b943d995d961c8938d74bf398f8748e2b34864c6.googledrive.com/host/0B_i_hw1oG1HeaU9nMWxfTnJZd1k/data.json",{format:"json"},function(result){
chart = new Highcharts.Chart({
chart: {
zoomType: 'x',
type: 'line',
renderTo: 'container'
},
title: {
text: ' '
},
subtitle: {
text: 'Click and drag in the plot area to zoom in',
x: -20
},
xAxis: {
type: 'datetime',
title: {
text: ' '
}
},
yAxis: {
title: {
text: ' '
}
},
series:[{
name: 'Tokyo',
data: result
}]
});
});
<script src="https://code.jquery.com/jquery-1.10.2.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<script src="https://b943d995d961c8938d74bf398f8748e2b34864c6.googledrive.com/host/0B_i_hw1oG1HeaU9nMWxfTnJZd1k/dataEmp.json"></script>
<script src="https://code.highcharts.com/highcharts.js"></script>
<script src="https://code.highcharts.com/modules/drilldown.js"></script>
<script src="https://code.highcharts.com/modules/exporting.js"></script>
<body>
<div id="container"></div>
</body>
(отвечая на мой собственный вопрос здесь)
ключ состоит в том, чтобы перестроить, как вы строите свою диаграмму.
не генерировать диаграмму на document.load()
. Создайте его в success()
функция вызова ajax.
во-первых, проверьте, если диаграмма уже существует и destroy()
его. Если ваш код позволяет пользователям динамически изменять настройки, это вызовет новый вызов ajax, для выполнения которого потребуется обновить график. Карту нужно уничтожить до того, как перестраивается.
Теперь создайте новую диаграмму с нуля. Но теперь у вас уже есть данные, необходимые для вызова ajax, чтобы вы могли построить его с нуля с правильной информацией. HighCharts будет экспортировать только данные, которые были включены при первом создании диаграммы. так что все пользовательские данные должны быть включены. Если вам нужно что-то изменить на графике, уничтожьте его и перестройте с помощью пользовательских данных.
function UpdateChart() {
$.ajax({
url: "/my/url.php",
success: function(json) {
// If the chart exists, destroy it
if (chart) chart.destroy();
// Create the chart
chart = new Highcharts.Chart({
chart: {
renderTo: "ChartContainer",
type: "line",
events: {
load: function(event) {
this.renderer.text("Custom Text", 50, 100);
}
},
title: { text: json[0].title },
subtitle: { text: json[0].sqft }
},
plotBands: {
color: "#FCFFB9",
from: json[0].OpenInterval,
to: json[0].CloseInterval,
label: {
text: "Store Hours", verticalAlign: "bottom", y: -5, style: { fontSize: "8pt", color: "gray" }
}
}
};
// Add two data series to the chart
chart.addSeries(json[1]);
chart.addSeries(json[2]);
// Set title and sub-title
chart.setTitle(json[0].title, json[0].subtitle);
}
});
}
теперь диаграмма покажет все пользовательские вещи, которые вы добавили. Обратите внимание, что пользовательский текст, записанный на диаграмму с помощью renderer.text()
команда добавляется в chart.load()
событие. Почему-то это работает только здесь.
помните, ключ: HighCharts будет экспортировать только данные, которые были включены при первом создании диаграммы. это избавит вас от многих головных болей.