Для выполнения примера необходимо создать html-страницу и выполнить следующие действия:
1. Добавить ссылку на css-файл PP.css. Также нужно добавить ссылки на следующие js-файлы:
PP.js;
PP.GraphicsBase.js
PP.Charts_Canvas.js;
resources.ru.js.
2. Далее в теге <head> необходимо добавить стиль для блока с идентификатором «chart»:
<style type="text/css">
div#chart {
border: #CCCCCC 1px solid;
padding: 1px;
margin: 1px;
width: 600px;
height: 500px;
}
</style>
3. Затем в теге <head> необходимо добавить сценарий, создающий гистограмму с накоплением:
<script>
var chart; // Диаграмма
var currentY = 0;
var isPointEditing = false;
// Создает диаграмму
function createChart() {
// Создаем диаграмму
chart = new PP.Ui.Chart({
Width: 600, // Ширина диаграммы
Height: 500, // Высота диаграммы
ParentNode: "chart",
Type: "Column", // Тип диаграммы
// Ось X
XAxis: {
Categories: getCategories(),
Labels: {
Enabled: true
}
},
// Ось Y
YAxis: {
Labels: {
Enabled: true
},
Max: 30,
Min: -5
},
// Дополнительная ось Y
YSAxis: {
Enabled: false
},
UseZeroSubstitution: true
});
// Удаляем легенду
chart.getLegend().dispose();
chart.PointMouseOver.add(function(sernder, args) {
var point = args.Point;
if (point) {
point.MouseOver.fire(chart, args);
}
})
chart.PointMouseOut.add(function(sernder, args) {
var point = args.Point;
if (point) {
point.MouseOut.fire(chart, args);
}
})
chart.DblClick.add(function(sender, args) {
var point = args.Point;
if (point) {
point.Click.fire(sender, args);
}
});
}
// Возвращает точку ряда данных по идентификатору
function getChartPointById(id) {
for (var i in chart.getSeries()) {
var serie = chart.getSerie(i);
for (var j in serie.getPoints()) {
var point = serie.getPoint(j);
if (point.getId() == id) {
return point;
}
}
}
return null;
}
// Удаляет столбцы, соответствующие точкам рядов данных со значением null
function removeNullPoints() {
// Определяем удаляемые столбцы
var removePointsIndexes = getRemovedPoints();
// Удаляем столбцы
removePoints(removePointsIndexes);
// Перемещаем столбцы с учётом удалённых столбцов
movePointsAfterRemoving();
}
// Определяет удаляемые столбцы
function getRemovedPoints() {
var removePointsIndexes = [];
for (var i in chart.getSeries()) {
var serie = chart.getSeries()[i];
for (var j = 0; j < serie.getPoints().length; j++) {
var point = serie.getPoint(j);
if (j > 0) {
if (point.getIsAfterNull()) {
removePointsIndexes.push(j - 1);
}
}
}
};
return removePointsIndexes;
}
// Удаляет точки с указанными индексами
function removePoints(points) {
var serie = chart.getSeries()[0];
for (var i = 0; i < serie.getPoints().length; i++) {
if (points.indexOf(i) >= 0) {
chart.getXAxis().getCategories().splice(i + 1, 1);
for (var j = 0; j < chart.getSeries().length; j++) {
chart.getSeries()[j].removePoint(i, true);
}
}
}
}
// Перемещает столбцы с учётом удалённых столбцов
function movePointsAfterRemoving() {
for (var i in chart.getSeries()) {
var serie = chart.getSeries()[i];
for (var j = 0; j < serie.getPoints().length; j++) {
var point = serie.getPoint(j);
point.setX(j);
}
};
}
// Удаляет указанный столбец диаграммы
function removeColumn(index) {
for (var i in chart.getSeries()) {
var serie = chart.getSeries()[i];
serie.removePoint(index - 1, true);
}
chart.getXAxis().getCategories().splice(index + 1, 1);
}
// Создаёт ряды данных для диаграммы
function createSeries() {
chart.setSeries([createSerie0(), createSerie1()]);
chart.redraw(true);
}
// Создаёт второй ряд данных для круговой диаграммы
function createSerie0() {
var serie = new PP.Ui.ChartColumnSerie({
Index: 0,
Name: "Бразилия", // Наименование ряда
Data: getSerieData0(), // Массив значений
Color: getColors()[1],
Parent: chart,
Type: "Column"
});
return serie;
}
// Создаёт первый ряд данных для круговой диаграммы
function createSerie1() {
var serie = new PP.Ui.ChartColumnSerie({
Index: 0,
LineColor: new PP.SolidColorBrush(),
Name: "Австралия", // Наименование ряда
LineWidth: 2,
Parent: chart,
Type: "Column"
});
// Добавляем точки в ряд данных
var point0 = getChartPoint0(serie);
addPointToSerie(point0, serie);
addPointToSerie(getChartPoint1(serie), serie);
addPointToSerie(getChartPoint2(serie), serie);
addPointToSerie(getChartPoint3(serie), serie);
addPointToSerie(getChartPoint4(serie), serie);
// Устанавливаем цвет границ точек
if (point0.getOriginalLineColorIsRGBA()) {
serie.getLineColor().setColor(point0.getLineColor());
};
return serie;
}
// Добавляет точку в ряд данных
function addPointToSerie(point, serie) {
serie.getData().push({
X: point.getX(),
Y: point.getY(),
Name: point.getName(),
Color: point.getColor(),
YBottom: point.getStackY(),
});
serie.getPoints().push(point);
}
// Создаёт массив цветов
function getColors() {
var colors = [
"#933DA8",
"#FFD900",
"#FF9191",
"#6BBC80",
"#A0CBC8"
];
return colors;
}
// Возвращает массив категорий для оси X
function getCategories() {
var categories = [];
for (var i in getSerieData0()) {
categories.push(getSerieData0()[i].Name);
}
return categories;
}
// Возвращает массив значений для второго ряда данных
function getSerieData0() {
var data = [{
X: 0,
Y: 1,
YBottom: 0,
Name: "2001",
Color: getColors()[5]
}, {
X: 1,
Y: 2,
YBottom: 0,
Name: "2002",
Color: getColors()[6]
}, {
X: 2,
Y: 3,
YBottom: 0,
Name: "2003",
Color: getColors()[7]
}, {
X: 3,
Y: 5,
YBottom: 0,
Name: "2004",
Color: getColors()[8]
}, {
X: 4,
Y: 10,
YBottom: 0,
Name: "2005",
Color: getColors()[9]
}];
return data;
}
// Возвращает массив значений для первого ряда данных
function getSerieData1() {
var data = [{
X: 0,
Y: 10,
YBottom: 1,
Name: "2001",
Color: getColors()[0]
}, {
X: 1,
Y: null,
YBottom: 2,
Name: "2002",
Color: getColors()[1]
}, {
X: 2,
Y: 17,
YBottom: 3,
Name: "2003",
Color: getColors()[2]
}, {
X: 3,
Y: 25,
YBottom: 5,
Name: "2004",
Color: getColors()[3]
}, {
X: 4,
Y: 22,
YBottom: 10,
Name: "2005",
Color: getColors()[4]
}];
return data;
}
// Возвращает точку для ряда данных диаграммы
function getChartPoint0(serie) {
var data0 = getSerieData1()[0];
var chartPoint = new PP.Ui.ChartColumnPoint({
Color: data0.Color,
ColorValue: 0.75,
CustomData: "0",
Id: "point0",
EnableEdit: true,
LineColor: "rgba(195,195,195,1)", Name: data0.Name, Parent: serie, // Ряд данных, к которому принадлежит точка X: data0.X, Y: data0.Y, State: "Normal", Width: 60, StackY: data0.YBottom });
// Обновляем точку для данных
refreshBeforeRender(chartPoint);
return chartPoint;
}
// Возвращает точку для ряда данных диаграммы
function getChartPoint1(serie) {
var data1 = getSerieData1()[1];
var chartPoint = new PP.Ui.ChartColumnPoint({
Color: data1.Color,
ColorValue: 0.75,
CustomData: "1", Id: "point1", EnableEdit: false, Name: data1.Name, Parent: serie, // Ряд данных, к которому принадлежит точка X: data1.X, Y: data1.Y, TextValue: "Точка со значением null", Width: 60, StackY: data1.YBottom });
// Обновляем точку для данных
refreshBeforeRender(chartPoint);
return chartPoint;
}
// Возвращает точку для ряда данных диаграммы
function getChartPoint2(serie) {
var data2 = getSerieData1()[2];
var chartPoint = new PP.Ui.ChartColumnPoint({
Color: data2.Color,
ColorValue: 0.75,
CustomData: "2",
Id: "point2",
EnableEdit: true,
LineColor: data2.Color, Name: data2.Name, Parent: serie, // Ряд данных, к которому принадлежит точка X: data2.X, Y: data2.Y, IsSelected: true, SizeValue: 10, IsAfterNull: true, Width: 60, StackY: data2.YBottom }); // Обновляем точку для данных refreshBeforeRender(chartPoint); return chartPoint; }
// Возвращает точку для ряда данных диаграммы
function getChartPoint3(serie) {
var data3 = getSerieData1()[3];
var chartPoint = new PP.Ui.ChartColumnPoint({
Color: data3.Color,
ColorValue: 0.75,
CustomData: "3",
Id: "point3",
EnableEdit: false,
IsFictive: true,
Name: data3.Name,
Parent: serie, // Ряд данных, к которому принадлежит точка
X: data3.X,
Y: data3.Y,
TextValue: "Фиктивная точка",
Width: 60,
StackY: data3.YBottom
});
// Обновляем точку для данных
refreshBeforeRender(chartPoint);
return chartPoint;
}
// Возвращает точку для ряда данных диаграммы
function getChartPoint4(serie) {
var data4 = getSerieData1()[4];
var chartPoint = new PP.Ui.ChartColumnPoint({
Color: data4.Color,
ColorValue: 0.75, CustomData: "4", Id: "point4", EnableEdit: true, IsVisible: false, LineColor: data4.Color, Name: data4.Name, Parent: serie, // Ряд данных, к которому принадлежит точка X: data4.X, Y: data4.Y, TextValue: "Скрытая точка", Width: 60, StackY: data4.YBottom }); // Обновляем точку для данных refreshBeforeRender(chartPoint); return chartPoint; }
// Обновляет столбец диаграммы до его отрисовки
function refreshBeforeRender(point) {
// Настраиваем цвет точки ряда данных
setupPointColor(point);
// Устанавливаем метку для точки ряда данных
setupDataLabel(point);
// Добавляем события к точке
addEventsHandlerToPoint(point);
}
// Обновляет столбец диаграммы после его отрисовки
function refreshAfterRender() {
for (var i in chart.getSeries()) {
var serie = chart.getSeries()[i];
for (var j in serie.getPoints()) {
var point = serie.getPoints()[j];
// Устанавливаем вторую координату для столбцов по оси Y
point.setYBottom(point.getStackY(), true);
// Указываем размеры столбца
point.setSizeValue({
Width: point.getWidth(),
Height: point.getPlotYBottom() - point.getPlotY()
});
if (point.getPercentage()) {
point.setY(point.getPercentage());
}
if (point.getPercentPart()) {
point.setYBottom(point.getPercentPart());
}
}
}
}
// Создаёт подписи данных для точки ряда данных
function createDataLabels(point) {
var dataLabel = new PP.Ui.ChartText({
BackgroundColor: "rgb(255,239,153)",
BorderWidth: 1,
Radius: 12,
Font: new PP.Font(),
Parent: point.getParent(),
Text: point.getY()
});
point.setDataLabels([dataLabel]);
}
// Устанавливает подпись данных для точки ряда данных
function setupDataLabel(point) {
createDataLabels(point);
if (point.getDataLabels().length > 0) {
point.setDataLabel(point.getDataLabels()[0]);
}
}
// Рисует подпись данных для точки ряда
function drawDataLabel(point) {
var label = point.getDataLabel();
if (label) {
label.setLeft(25);
label.setTop(point.getPlotY());
label.drawSelf();
}
}
// Добавляем обработчики событий к точке ряда данных
function addEventsHandlerToPoint(point) {
// Обрабатываем событие MouseOut
point.MouseOut.add(function(sender, args) {
if (args.Point && args.Point.getDataLabel()) {
args.Point.getDataLabel().dispose();
args.Point.setDataLabel(null);
}
});
// Обрабатываем событие MouseOver
point.MouseOver.add(function(sender, args) {
if (args.Point) {
if (!args.Point.getDataLabel()) {
setupDataLabel(point);
}
drawDataLabel(args.Point);
};
});
// Обрабатываем событие Click
point.Click.add(function(sender, args) {
var point = args.Point;
console.log("Выбрана точка ряда данных с индексом «%s»", point.getCustomData());
if (point.getTextValue()) {
console.log("Описание точки: %s", point.getTextValue());
}
if (point.getSizeValue()) {
console.log("Размеры соответствующего столбца: %s x %s",
point.getSizeValue().Width,
point.getSizeValue().Height);
}
});
}
// Настраивает цвет точки ряда данных
function setupPointColor(point) {
var opacity = point.getColorValue();
if (!point.getIsVisible()) {
opacity = 0;
}
if (point.getIsFictive()) {
opacity = 0.1;
}
if (point.getIsSelected()) {
opacity = 1;
}
if (point.getOriginalColorIsRGBA()) {
point.setColor(new PP.SolidColorBrush({
Color: point.getColor(),
Opacity: opacity
}));
}
}
// Включает режим редактирования точки ряда данных
function turnEditMode(isEnabled) {
chart.getEditMode().setEnabled(isEnabled);
chart.redraw(true);
}
function onReady() {
// Создаём диаграмму с областями
createChart();
// Создаём ряды данных для диаграммы
createSeries();
// Обновляем столбцы диаграммы после их отрисовки
refreshAfterRender();
}
</script>
4. В теге <body> в качестве значения атрибута «onLoad» указать имя функции для создания гистограммы с накоплением и добавить блок с идентификатором «chart»:
<body onload="onReady()"> <div id="chart"></div> </body>
В результате выполнения примера на html-странице была размещена гистограмма с накоплением:

Вторая точка второй серии диаграммы имеет пустое значение, третья точка этой же серии выделена, четвёртая является фиктивной, пятая - невидимой.
При наведении на любую точку второго ряда на оси Y появляется всплывающая подсказка, содержащая значение данной точки:

После двойного щелчка на любой точке второго ряда в консоли браузера будет выведена информация о данной точке. Например, для третьей точки выведенные данные будут следующими:
Выбрана точка ряда данных с индексом «2»
Размеры соответствующего столбца: 52.901119402985074 x 174
Выбрана точка ряда данных с индексом «3»
Описание точки: Фиктивная точка
Размеры соответствующего столбца: 52.901119402985074
x 248.57142857142856
Разрешим редактирование точек рядов данных гистограммы:
chart.getEditMode().setEnabled(true);
После выполнения примера был включён режим редактирования точек гистограммы. После нажатия на любую точку второго ряда определилось, что для первой, третьей и пятой точек данного ряда редактирование разрешено, для остальных точек ряда - запрещено:

Удалим столбцы, соответствующие пустым точкам диаграммы:
removeNullPoints();
В результате выполнения данного строки второй столбец диаграммы был удалён:

См. также: