HighCharts - Как создать динамическую диаграмму, которая экспортирует ВСЕ
Я пытаюсь экспортировать динамически сгенерированную диаграмму, и я заметил, что некоторые вещи не экспортируются. Например, моя диаграмма имеет PlotBands, которые являются динамическими в зависимости от отображаемых данных.
Когда я построил свою диаграмму, я последовал за стандартным макетом кодов всех замечательных примеров HighChart, где я сразу создал диаграмму на загрузке документа. Затем в моем коде я использую вызов Ajax для загрузки данных и изменения таких вещей, как заголовки, полосы заглавия, пользовательский текст и т.д.
Проблема заключается в том, что все изменения, внесенные на диаграмму после загрузки начальной диаграммы, не будут экспортироваться в изображения или PDF файлы. Мои PlotBands были добавлены во время вызова Ajax. Они не могут быть включены в объект диаграммы, построенный на document.load()
. Поэтому HighCharts их просто игнорировали.
В моей диаграмме я хочу показать использование энергии в течение 24-часового периода на разных сайтах. Пользователь может выбирать разные дни и разные сайты. Диапазоны линий должны были указывать часы работы, и каждый сайт имеет разные часы работы, которые загружаются с данными. Кроме того, название диаграммы показывает название сайта, а субтитр показывает квадратную метку.
Кроме того, мой код рисует какой-то пользовательский текст в нижней части графика, используя команду HighCharts renderer text()
.
Мой код для едва функционирующего экспорта выглядит примерно так:
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);
}
});
}
К сожалению, заголовок, полосы сюжета и "пользовательский текст" не отображаются, если пользователь экспортирует диаграмму.
Ответы
Ответ 1
(отвечая на мой собственный вопрос здесь)
Ключ состоит в том, чтобы изменить порядок построения диаграммы.
Не создавайте диаграмму на 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 будет экспортировать только данные, которые были включены при первом создании диаграммы. Это сэкономит вам много головных болей.
Ответ 2
да - его возможные и высокопроизводительные версии поддерживают то, о чем вы упомянули здесь sample code
http://jsfiddle.net/vijaykumarkagne/9c2vqq7q/ динамического highchart с использованием json-данных файла, размещенного в Google диск.
$.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>