Тепловая карта¶
Контрол Heatmap (Eremex.AvaloniaUI.Charts.Heatmap
) позволяет вам создать двумерную heat map, диаграмму, которая визуализирует данные с использованием цвета.
Контрол рисует каждую точку данных на 2D-"карте" цветом, соответствующим значению в этой точке.
Контрол Heatmap является потомком Eremex.AvaloniaUI.Charts.ChartControl
, который является базовым классом для всех контролов диаграмм, включая CartersianChart
и PolarChart
. Таким образом, он наследует специфическую функциональность, общую для всех контролов диаграммы. Функции контрола тепловой карты включают в себя:
- Пользовательская цветовая кодировка
- Раскрашивание в оттенках серого
- Настройка осей X и Y
- Перекрестие
- Полосы и постоянные линии
- Прокрутка и масштабирование с помощью мыши и клавиатуры
- Экспортируйте результат раскрашивания данных в растровое изображение
Демонстрационное приложение¶
Смотрите демонстрационное приложение контролов Eremex для получения примеров, демонстрирующих функции контрола Heatmap в действии.
Начало работы с контролом тепловой карты¶
Чтобы настроить контрол тепловой карты, предоставьте данные контролу и укажите поставщика цвета , который окрашивает значения точек данных в соответствии с определенной логикой. Вы также можете настроить оси для отображения значений осей и, например, постоянных линий.
Обратите внимание, что оси X и Y в контроле тепловой карты являются качественными. Аргументы этих осей имеют тип string. Значения точек данных на "карте" имеют двойной тип.
Предоставьте данные¶
Установите для свойства Heatmap.DataAdapter
значение объекта Eremex.AvaloniaUI.Charts.HeatmapDataAdapter
, чтобы предоставить данные в контрол тепловой карты.
Класс HeatmapDataAdapter
содержит следующие основные свойства, которые необходимо инициализировать:
public class HeatmapDataAdapter : ISeriesDataAdapter
{
public IList<string> XArguments;
public IList<string> YArguments;
public double[,] Values;
//...
}
XArguments
— Список строк, которые задают аргументы оси X. Аргументы X должны быть уникальными.YArguments
— Список строк, которые задают аргументы оси Y. Аргументы Y должны быть уникальными.-
Values
— двумерный массив значений типа Double.Ширина и высота массива
Values
должны соответствовать количеству элементов в спискахXArguments
иYArguments
соответственно.Массив
Values
может содержать значениеDouble.NaN
для определенных точек. Эти точки не отображаются контролом тепловой карты, и пользователь может видеть фон контрола через эти точки.Строки массива
Values
отображаются контролом Heatmap снизу вверх. Первая строка массиваValues
отображается внизу, а последняя строка - вверху. Подробности смотрите в примере ниже.
Используйте следующие методы для обновления данных для контрола тепловой карты во время выполнения программы:
HeatmapDataAdapter.UpdateValues(double[,] newValues)
— Обновляет текущие значения (HeatmapDataAdapter.Values
) значениями, указанными параметромnewValues
метода. Количество столбцов и строк в массивеnewValues
должно совпадать с количеством в массивеHeatmapDataAdapter.Values
.HeatmapDataAdapter.UpdateXArguments(IList<string> newArguments)
— Обновляет текущие аргументы X (HeatmapDataAdapter.XArguments
) новыми аргументами. Количество элементов в спискеnewArguments
должно совпадать с количеством элементов в спискеHeatmapDataAdapter.XArguments
. Аргументы X должны быть уникальными.HeatmapDataAdapter.UpdateYArguments(IList<string> newArguments)
— Обновляет текущие аргументы Y (HeatmapDataAdapter.YArguments
) новыми аргументами. Количество элементов в спискеnewArguments
должно совпадать с количеством элементов в спискеHeatmapDataAdapter.YArguments
. Аргументы Y должны быть уникальными.
Пример - Предоставьте данные и используйте дефолтная отрисовка¶
Следующий пример предоставляет выборочные данные для контрола тепловой карты. Данные представляют собой двумерный массив, состоящий из трех строк и пяти столбцов.
Поставщик цвета контрола по умолчанию (HeatmapGrayscaleColorProvider
) отображает минимальное значение черным цветом, а максимальное - белым. Остальные значения окрашены в пропорциональные оттенки серого.
//Create an array that contains 3 rows with 5 values in each row
double[,] values = new double[,]
{
{1, 2, 3, 4, 5}, // values rendered at the bottom
{6, 7, 8, 9, 10},
{11, 12, 13, 14, 15}, // values rendered at the top
};
List<string> xArgs = new List<string>() { "A", "B", "C", "D", "E" };
List<string> yArgs = new List<string>() { "I", "II", "III" };
HeatmapDataAdapter dataAdapter = new HeatmapDataAdapter(xArgs, yArgs, values);
heatMap1.DataAdapter = dataAdapter;
Раскрашивание значений точек данных¶
Поставщики цветов используются для раскрашивания точек данных в контроле тепловой карты. Для каждой точки данных контрол запрашивает цвет для определенного значения у поставщика цвета (свойство Heatmap.ColorProvider
).
Доступны следующие поставщики цветов:
HeatmapGrayscaleColorProvider
(по умолчанию) — позволяет отображать значения в оттенках серого.HeatmapRangeColorProvider
— Позволяет окрашивать точки данных произвольным способом, связывая пользовательские цвета с определенными значениями.
При необходимости вы можете создать свой собственный поставщик цветов, реализовав интерфейс IHeatmapColorProvider
.
Раскрашивание в оттенках серого¶
Контрол тепловой карты по умолчанию использует раскраску точек данных в оттенках серого. Раскраска в оттенках серого реализована HeatmapGrayscaleColorProvider
. Чтобы использовать этот поставщик цветов, вы можете оставить свойство Heatmap.ColorProvider
неназначенным или явно присвоить свойству Heatmap.ColorProvider
значение объекта HeatmapGrayscaleColorProvider
.
Объект HeatmapGrayscaleColorProvider
отображает минимальное значение во всех точках данных черным цветом, а максимальное значение - белым. Другие значения, находящиеся между минимальным и максимальным значениями, отображаются пропорциональными оттенками серого.
Пример - Раскрашивание в оттенках серого¶
Следующий пример привязывает контрол тепловой карты к выборке данных и отображает точки данных с использованием поставщика цветов по умолчанию (HeatmapGrayscaleColorProvider
). В коде также показано, как изменить заголовки осей.
xmlns:mxc="https://schemas.eremexcontrols.net/avalonia/charts"
<mxc:Heatmap DataAdapter="{Binding DataAdapter}">
<mxc:Heatmap.AxisX>
<mxc:HeatmapAxisX Title="Parameter A">
</mxc:HeatmapAxisX>
</mxc:Heatmap.AxisX>
<mxc:Heatmap.AxisY>
<mxc:HeatmapAxisY Title="Parameter B">
</mxc:HeatmapAxisY>
</mxc:Heatmap.AxisY>
</mxc:Heatmap>
public partial class MainWindowViewModel : ViewModelBase
{
[ObservableProperty]
HeatmapDataAdapter dataAdapter;
public MainWindowViewModel()
{
double[,] values = new double[,]
{
{148, 169, 185, 199, 213, 223, 228, 233}, // values rendered at the bottom
{161, 182, 196, 207, 216, 222, 224, 223},
{162, 181, 191, 198, 205, 208, 208, 205},
{150, 163, 172, 177, 179, 177, 174, 168},
{126, 132, 136, 142, 143, 140, 135, 127},
{95, 97, 101, 105, 107, 104, 101, 98} // values rendered at the top
};
List<string> xArgs = new List<string>() { "1", "2", "3", "4", "5", "6", "7", "8" };
List<string> yArgs = new List<string>() { "10", "20", "30", "40", "50", "60"};
dataAdapter = new HeatmapDataAdapter(xArgs, yArgs, values);
}
}
Пользовательская раскраска¶
Чтобы произвольным способом раскрасить точки данных в контроле тепловой карты, назначьте объект HeatmapRangeColorProvider
свойству Heatmap.ColorProvider
. HeatmapRangeColorProvider
позволяет привязывать пользовательские цвета к определенным значениям (значениям перехода). Чтобы рассчитать цвета для значений, которые находятся между двумя значениями перехода, HeatmapRangeColorProvider
использует градиент между цветами, назначенными этим значениям перехода.
При указании значений перехода вы можете указать абсолютные или нормализованные величины.
На следующей картинке показано, как HeatmapRangeColorProvider
создает цветовые градиенты между образцами абсолютных значений перехода. В этом примере определены три значения перехода:
- Значение 1 связано с бирюзовым цветом
- Значение 6 связано с желтым цветом
- Значение 10 связано с фиолетовым цветом
Пример - Пользовательская раскраска¶
В следующем примере используется HeatmapRangeColorProvider
для раскрашивания точек данных контрола тепловой карты в соответствии с пользовательскими правилами цвета. Код определяет цвета для представления абсолютных значений перехода: 95, 110, 150, 210 и 233.
Цвета для других значений рассчитываются в соответствии с градиентом между цветами, присвоенными соседним значениям перехода.
xmlns:mxc="https://schemas.eremexcontrols.net/avalonia/charts"
<mxc:Heatmap DataAdapter="{Binding DataAdapter}" ColorProvider="{Binding ColorProvider}">
<mxc:Heatmap.AxisX>
<mxc:HeatmapAxisX Title="Parameter A">
</mxc:HeatmapAxisX>
</mxc:Heatmap.AxisX>
<mxc:Heatmap.AxisY>
<mxc:HeatmapAxisY Title="Parameter B">
</mxc:HeatmapAxisY>
</mxc:Heatmap.AxisY>
</mxc:Heatmap>
public partial class MainWindowViewModel : ViewModelBase
{
[ObservableProperty]
HeatmapDataAdapter dataAdapter;
[ObservableProperty]
HeatmapRangeColorProvider colorProvider = new HeatmapRangeColorProvider();
public MainWindowViewModel()
{
HeatmapRangeStop[] colorRanges = new HeatmapRangeStop[]
{
new() { Value = 95, Color = Color.FromRgb(0,102,101) },
new() { Value = 110, Color = Color.FromRgb(1,210,207) },
new() { Value = 150, Color = Color.FromRgb(0,155,105)},
new() { Value = 210, Color = Color.FromRgb(81,206,68)},
new() { Value = 233, Color = Color.FromRgb(213,248,0) }
};
colorProvider.AddRange(colorRanges);
double[,] values = new double[,]
{
{148, 169, 185, 199, 213, 223, 228, 233}, // values rendered at the bottom
{161, 182, 196, 207, 216, 222, 224, 223},
{162, 181, 191, 198, 205, 208, 208, 205},
{150, 163, 172, 177, 179, 177, 174, 168},
{126, 132, 136, 142, 143, 140, 135, 127},
{95, 97, 101, 105, 107, 104, 101, 98} // values rendered at the top
};
List<string> xArgs = new List<string>() { "1", "2", "3", "4", "5", "6", "7", "8" };
List<string> yArgs = new List<string>() { "10", "20", "30", "40", "50", "60"};
dataAdapter = new HeatmapDataAdapter(xArgs, yArgs, values);
}
}
Цвета для значений, выходящих за пределы граничных значений перехода¶
Как правило, объект HeatmapRangeColorProvider
должен включать цвета для минимальных и максимальных значений всего диапазона значений. Это гарантирует, что цветовые градиенты, построенные объектом HeatmapRangeColorProvider
, охватывают все значения, переданные в контрол Heatmap.
В противном случае значения за пределами значений граничного перехода окрашиваются в те же цвета, что и значения граничного перехода.
На следующей картинке показано, как HeatmapRangeColorProvider
вычисляет цвета, когда определенные значения выходят за пределы минимального и максимального значений перехода.
Нормализованные значения перехода¶
Если вы не знаете минимальных и максимальных абсолютных значений для всего диапазона данных, вы можете указать значения перехода, используя нормализованные величины. Установите для свойства HeatmapRangeColorProvider.IsNormalizedValues
значение true
, чтобы включить нормализацию значений для объекта HeatmapRangeColorProvider
. В этом режиме укажите значения перехода в диапазоне между 0
и 1
, где 0
и 1
представляют собой минимальное и максимальное значения соответственно. Нормализованное значение 0.5
представляет собой абсолютное значение в середине диапазона данных (minimum + (maximum-minimum)/2
).
Пример - Раскрасьте точки данных, если минимум и максимум заранее не известны¶
В следующем примере используется объект HeatmapRangeColorProvider
для раскрашивания точек данных с использованием нормализованных значений перехода. Свойству HeatmapRangeColorProvider.IsNormalizedValues
присвоено значение true
, чтобы включить нормализацию значений. Значения перехода указаны в нормализованных величинах: 0, 0,3, 0,7 и 1, где значения 0 и 1 представляют собой минимальное и максимальное значения диапазона данных.
double[,] values = new double[,]
{
{-5, -4, -3, -2, -1, 0}, // values rendered at the bottom
{1, 2, 3, 4, 5, 6} // values rendered at the top
};
List<string> xArgs = new List<string>();
for (int i=1; i <= values.GetLength(1); i++)
{
xArgs.Add((i*10).ToString());
}
List<string> yArgs = new List<string>() { "p1", "p2" };
HeatmapRangeColorProvider colorProvider = new HeatmapRangeColorProvider();
colorProvider.IsNormalizedValues = true;
HeatmapRangeStop[] colorRanges = new HeatmapRangeStop[]
{
new() { Value = 0, Color = Colors.Pink },
new() { Value = 0.3, Color = Colors.Purple},
new() { Value = 0.7, Color = Colors.Orange },
new() { Value = 1, Color = Colors.Green},
};
colorProvider.AddRange(colorRanges);
heatmap.ColorProvider = colorProvider;
heatmap.DataAdapter = new HeatmapDataAdapter(xArgs, yArgs, values);
Оси¶
Контрол тепловой карты содержит две оси, X и Y. Аргументы для этих осей предоставляются при вызове конструктора HeatmapDataAdapter
с помощью параметров xArguments
и yArguments
.
double[,] values = new double[,]
{
{1, 2, 3, 4, 5}, // values rendered at the bottom
{6, 7, 8, 9, 10},
{11, 12, 13, 14, 15}, // values rendered at the top
};
List<string> xArgs = new List<string>() { "A", "B", "C", "D", "E" };
List<string> yArgs = new List<string>() { "I", "II", "III" };
//...
HeatmapDataAdapter dataAdapter = new HeatmapDataAdapter(xArgs, yArgs, values);
heatmap.DataAdapter = dataAdapter;
- Оси контрола являются качественными, что означает, что их значения имеют строковый тип.
- Количество элементов в списке
yArguments
должно соответствовать количеству строк в двумерном массиве данных (HeatmapDataAdapter.Values
). - Количество элементов в списке
xArguments
должно соответствовать количеству столбцов в двумерном массиве данных (HeatmapDataAdapter.Values
).
Вы можете настроить свойства axis, указав объекты Heatmap.AxisX
и Heatmap.AxisY
.
Следующий код задает названия для осей.
xmlns:mxc="https://schemas.eremexcontrols.net/avalonia/charts"
<mxc:Heatmap ...>
<mxc:Heatmap.AxisX>
<mxc:HeatmapAxisX Title="Axis X">
</mxc:HeatmapAxisX>
</mxc:Heatmap.AxisX>
<mxc:Heatmap.AxisY>
<mxc:HeatmapAxisY Title="Axis Y">
</mxc:HeatmapAxisY>
</mxc:Heatmap.AxisY>
</mxc:Heatmap>
Масштаб по оси¶
Вы можете использовать свойства AxisX.ScaleOptions
и AxisY.ScaleOptions
для настройки опций отображения оси. Эти свойства относятся к типу QualitativeScaleOptions
.
В следующем примере опция масштабирования GridSpacing
устанавливается равной 2, чтобы отображать каждую вторую метку и основную галочку и пропускать метки и галочки между ними.
<mxc:HeatmapAxisX >
<mxc:HeatmapAxisX.ScaleOptions>
<mxc:QualitativeScaleOptions GridSpacing="2" />
</mxc:HeatmapAxisX.ScaleOptions>
</mxc:HeatmapAxisX>
Метки оси формата¶
Свойство ScaleOptions.LabelFormatter
позволяет указать объект, который форматирует значения отображения оси произвольным способом. Вы можете реализовать пользовательский форматировщик меток на основе функции/выражения, используя объект Eremex.AvaloniaUI.Charts.FuncLabelFormatter
.
В следующем примере реализован пользовательский форматировщик меток для значений оси.
<mxc:Heatmap Grid.Row="1" Name="heatmap">
<mxc:Heatmap.AxisX>
<mxc:HeatmapAxisX Title="Parameter A">
<mxc:HeatmapAxisX.ScaleOptions>
<mxc:QualitativeScaleOptions LabelFormatter="{Binding CustomLabelFormatter}" />
</mxc:HeatmapAxisX.ScaleOptions>
</mxc:HeatmapAxisX>
</mxc:Heatmap.AxisX>
</mxc:Heatmap>
public partial class MainWindowViewModel : ViewModelBase
{
// ...
[ObservableProperty] FuncLabelFormatter customLabelFormatter = new(o => String.Format("val: {0}", o));
}
Свойства осей¶
В следующем списке обобщены свойства отображения и поведения осей контрола тепловой карты:
ConstantLines
иConstantLinesSource
— Позволяет рисовать постоянные линии для определенных значений. Смотрите Постоянные линии и полоски .EnableZooming
— Позволяет пользователю изменять масштаб оси с помощью колесика мыши и клавиатуры.EnableScrolling
— Позволяет пользователю прокручивать ось с помощью операции перетаскивания мыши и горячих клавиш.InterlacingColor
- цвет, используемый для чередования полосовых линий (когда включена опцияShowInterlacing
).MinorCount
— Указывает количество второстепенных отметок и линий сетки.Position
— Определяет позицию оси. Доступные опции включают:Near
(ось X отображается внизу, а ось Y отображается у левого края диаграммы) иFar
(ось X отображается вверху, а ось Y отображается у правого края диаграммы).ShowAxisLine
— Определяет видимость линии оси.ShowInterlacing
— Указывает, следует ли рисовать чередующиеся полосовые линии между основными линиями сетки. СмотритеShowMajorGridlines
для получения дополнительной информации.ShowLabels
— Определяет видимость меток, соответствующих основным отметкам.-
ShowMajorGridlines
— Определяет видимость линий сетки, соответствующих основным отметкам. Основные и второстепенные линии сетки отображаются за цветными точками данных. Линии сетки видны в следующих случаях:- в позициях, где точки данных отображаются с использованием полупрозрачных цветов.
- в позициях, где точки данных не отображаются (например, когда значение точки данных равно
Double.NaN
).
-
ShowMajorTickmarks
— Определяет видимость основных отметок. ShowMinorGridlines
— Определяет видимость линий сетки, соответствующих второстепенным отметкам. СмотритеShowMajorGridlines
для получения дополнительной информации.ShowMinorTickmarks
— Определяет видимость второстепенных меток.ShowTitle
— Определяет видимость заголовка оси (свойствоTitle
).Strips
иStripsSource
— позволяет заполнять диапазоны между определенными значениями. Смотрите Постоянные линии и полоски .Thickness
— Толщина линии оси.Title
— Возвращает или задает заголовок для оси.TitlePosition
— Получает или устанавливает позицию заголовка оси.
Перекрестие¶
Перекрестие - это пара тонких вертикальных и горизонтальных линий (линий аргументов и значений), которые позволяют пользователю видеть точные значения осей и точек данных в текущей позиции курсора. Перекрестие появляется при наведении курсора на область данных и следует за указателем мыши.
Используйте свойство Heatmap.CrosshairOptions
, чтобы настроить свойства отображения перекрестия или отключить эту функцию.
Отключите перекрестие¶
Свойство CrosshairOptions.ShowCrosshair
позволяет отключить перекрестие.
<mxc:Heatmap x:Name="heatmap1" >
<mxc:Heatmap.CrosshairOptions>
<mxc:CrosshairOptions ShowCrosshair="False" />
</mxc:Heatmap.CrosshairOptions>
<!-- ... -->
</mxc:Heatmap>
Постоянные линии и полоски¶
Контрол тепловой карты позволяет использовать постоянные линии и полоски для обозначения определенных значений и диапазонов значений для горизонтальной и вертикальной осей.
Постоянные линии¶
Постоянная линия - это линия, проведенная перпендикулярно оси, которая отмечает определенное значение оси. Чтобы создать постоянные линии, используйте коллекцию ConstantLines
или источник ConstantLinesSource
объектов HeatmapAxisX
и HeatmapAxisY
.
В следующем примере создаются постоянные линии для осей X и Y, чтобы отметить значения осей "H" и "V" соответственно.
<mxc:Heatmap Name="heatmap">
<mxc:Heatmap.AxisX>
<mxc:HeatmapAxisX Title="Parameter A">
<mxc:HeatmapAxisX.ConstantLines>
<mxc:ConstantLine AxisValue="H" ShowTitle="True" Title="Level H" Color="DimGray" ShowBehind="False" />
</mxc:HeatmapAxisX.ConstantLines>
</mxc:HeatmapAxisX>
</mxc:Heatmap.AxisX>
<mxc:Heatmap.AxisY>
<mxc:HeatmapAxisY Title="Parameter X">
<mxc:HeatmapAxisY.ConstantLines>
<mxc:ConstantLine AxisValue="V" ShowTitle="True" Title="Level V" Color="DimGray" ShowBehind="False" />
</mxc:HeatmapAxisY.ConstantLines>
</mxc:HeatmapAxisY>
</mxc:Heatmap.AxisY>
</mxc:Heatmap>
Установите для опции ConstantLine.ShowBehind
значение false
, чтобы рисовать постоянные линии над цветными точками данных. В противном случае они отображаются за точками данных и видны в следующих случаях:
- в позициях, где точки данных отображаются с использованием полупрозрачных цветов.
- в позициях, где точки данных не отображаются (например, когда значение точки данных равно
Double.NaN
).
Полоски¶
Полоса - это продолжение постоянной линии. Полоски используются для выделения диапазонов значений осей. Они всегда отображаются за цветными точками данных.
Для создания полос используйте коллекцию Strips
или исходный код StripsSource
для объектов HeatmapAxisX
и HeatmapAxisY
.
<mxc:Heatmap.AxisY>
<mxc:HeatmapAxisY Title="Parameter">
<mxc:HeatmapAxisY.Strips>
<mxc:Strip AxisValue1="W" AxisValue2="V" Color="Gray" />
</mxc:HeatmapAxisY.Strips>
</mxc:HeatmapAxisY>
</mxc:Heatmap.AxisY>
Полоски видны в следующих случаях:
- в позициях, где точки данных отображаются с использованием полупрозрачных цветов.
- в позициях, где точки данных не отображаются (например, когда значение точки данных равно
Double.NaN
).
Прокрутка и масштабирование¶
Разрешить операции прокрутки и масштабирования¶
Операции прокрутки и масштабирования включены по умолчанию. Следующие опции позволяют отключить эти операции для осей X и/или Y:
Axis.EnableZooming
Axis.EnableScrolling
<!-- Disable scroll and zoom operations for the X axis -->
<mxc:Heatmap.AxisX>
<mxc:HeatmapAxisX EnableZooming="False" EnableScrolling="False"/>
</mxc:Heatmap.AxisX>
<!-- Disable scroll and zoom operations for the Y axis -->
<mxc:Heatmap.AxisY>
<mxc:HeatmapAxisY EnableZooming="False" EnableScrolling="False"/>
</mxc:Heatmap.AxisY>
Прокрутка и масштабирование по пользователям¶
Прокрутите тепловую карту (по осям X и Y одновременно).¶
-
Перетащите область данных с помощью мыши
или
-
Нажмите Ctrl+клавиши со стрелками для прокрутки с помощью клавиатуры.
Увеличьте тепловую карту¶
-
Прокрутите колесико мыши по области данных
или
-
Нажмите Ctrl+"+", чтобы увеличить изображение, и Ctrl+"-", чтобы уменьшить масштаб.
Прокрутка по оси X или Y¶
- Перетащите курсор мыши в пределах соответствующей области оси.
Масштабирование по оси X или Y¶
- Прокрутите колесико мыши в пределах соответствующей области оси.
Увеличение масштаба в определенном регионе¶
- Нажмите и удерживайте клавишу SHIFT в области данных, а затем перетащите курсор, чтобы выделить нужный прямоугольник.
Увеличение диапазона значений на оси¶
- Нажмите и удерживайте клавишу SHIFT в области оси, а затем перетащите курсор, чтобы выбрать нужный диапазон.
Экспорт¶
Вы можете использовать метод Heatmap.Export
для экспорта рендеринга контрола в объект WriteableBitmap
. Полученное растровое изображение содержит цветные точки данных. Размер растрового изображения соответствует размеру данных контрола тепловой карты, заданного массивом Heatmap.DataAdapter.Values
.
В следующем примере рендеринг контрола тепловой карты сохраняется в файл картинки.
* Эта страница была создана автоматически с помощью сервиса машинного перевода Яндекс Переводчик.