Вопрос или проблема
Я создаю интерактивный диаграмму рассеяния с помощью eCharts в Angular, которая, возможно, будет иметь очень большой набор данных. У меня есть две группы точек, которые будут отображаться на одной диаграмме.
Я хочу разделить метки, разместив одну группу меток в верхней части, а другую под точками данных. У них много перекрытия, поэтому я использую labellayout: { moveOverlap: ‘shiftX’ }.
Однако опция ‘shiftX’ ищет только перекрытие по оси x, так что если одна метка находится в верхней части диаграммы, а другая в нижней части, то их позиции по x все равно будут разделены. Это выглядит очень странно и не является эффективным способом отображения данных. Я не могу понять, как использовать ‘shiftX’ отдельно для каждой половины меток – я пытался помещать их в отдельные сетки/оси/серии и т.д.
Есть идеи?
Вот мой код – я изменил один из примеров eCharts, чтобы проиллюстрировать свою проблему. Я могу включить hideOverlap, если точки действительно плотные, но в этом примере, если вы отключите ‘shiftX’ для одной из серий, другая выглядит идеально. А серия без ‘shiftX’ это беспорядок.
Когда обе имеют ‘shiftX’, это более организованный беспорядок, но перекрытие намного больше, чем необходимо для размера набора данных, потому что она пытается минимизировать перекрытие горизонтально среди ВСЕХ меток, а не только верхнего или нижнего ряда.
const data = [
[[28604,77,17096869,'Australia',1990],[31163,77.4,27662440,'Canada',1990],[1516,68,1154605773,'China',1990],[13670,74.7,10582082,'Cuba',1990],[28599,75,4986705,'Finland',1990],[29476,77.1,56943299,'France',1990],[31476,75.4,78958237,'Germany',1990],[28666,78.1,254830,'Iceland',1990],[1777,57.7,870601776,'India',1990],[29550,79.1,122249285,'Japan',1990],[2076,67.9,20194354,'North Korea',1990],[12087,72,42972254,'South Korea',1990],[24021,75.4,3397534,'New Zealand',1990],[43296,76.8,4240375,'Norway',1990],[10088,70.8,38195258,'Poland',1990],[19349,69.6,147568552,'Russia',1990],[10670,67.3,53994605,'Turkey',1990],[26424,75.7,57110117,'United Kingdom',1990],[37062,75.4,252847810,'United States',1990]],
[[44056,81.8,23968973,'Australia',2015],[43294,81.7,35939927,'Canada',2015],[13334,76.9,1376048943,'China',2015],[21291,78.5,11389562,'Cuba',2015],[38923,80.8,5503457,'Finland',2015],[37599,81.9,64395345,'France',2015],[44053,81.1,80688545,'Germany',2015],[42182,82.8,329425,'Iceland',2015],[5903,66.8,1311050527,'India',2015],[36162,83.5,126573481,'Japan',2015],[1390,71.4,25155317,'North Korea',2015],[34644,80.7,50293439,'South Korea',2015],[34186,80.6,4528526,'New Zealand',2015],[64304,81.6,5210967,'Norway',2015],[24787,77.3,38611794,'Poland',2015],[23038,73.13,143456918,'Russia',2015],[19360,76.5,78665830,'Turkey',2015],[38225,81.4,64715810,'United Kingdom',2015],[53354,79.1,321773631,'United States',2015]]
];
option = {
xAxis: [{
splitLine: { show: false }
},
{
splitLine: { show: false }
}],
yAxis: [{
splitLine: { show: false },
scale: true,
},
{
splitLine: { show: false },
scale: true,
}],
grid: {
left: 40,
right: 130
},
series: [
{
name: '1990',
data: data[0],
xAxisIndex: 0,
yAxisIndex: 0,
type: 'scatter',
symbolSize: function (data) {
return Math.sqrt(data[2]) / 5e2;
},
emphasis: {
focus: 'self'
},
labelLayout: function () {
return {
y: myChart.getHeight() - 750,
moveOverlap: 'shiftX'
};
},
labelLine: {
show: true,
lineStyle: {
color: '#bbb'
}
},
label: {
show: true,
formatter: function (param: any) {
return param.data[3];
},
position: 'right',
minMargin: 2
}
},
{
name: '1990',
data: data[1],
xAxisIndex: 1,
yAxisIndex: 1,
type: 'scatter',
symbolSize: function (data) {
return Math.sqrt(data[2]) / 5e2;
},
emphasis: {
focus: 'self'
},
labelLayout: function () {
return {
y: myChart.getHeight() - 30,
moveOverlap: 'shiftX'
};
},
labelLine: {
show: true,
lineStyle: {
color: '#bbb'
}
},
label: {
show: true,
formatter: function (param: any) {
return param.data[3];
},
position: 'right',
minMargin: 2
}
}
]
};
Ответ или решение
Как отобразить метки eCharts для двух несвязанных групп на диаграмме рассеяния
При работе с библиотекой eCharts в Angular, создание интерактивной диаграммы рассеяния с несколькими группами данных может представлять определённые трудности, особенно когда метки для этих групп накладываются друг на друга. Целью данного руководства будет обсуждение возможных решений для корректного отображения меток из двух независимых групп с использованием eCharts.
Проблема наложения меток
Ваш запрос основан на имеющихся данных, где метки из двух различных групп накладываются друг на друга на одной диаграмме. Вы используете опцию labelLayout: { moveOverlap: 'shiftX' }
, чтобы уменьшить наложение по оси X, однако, как вы заметили, эта опция не учитывает вертикальное размещение меток. Это приводит к сложностям в визуализации, когда метки одной группы могут сдвигать метки другой группы по горизонтали, создавая неэффективное отображение.
Решение проблемы
-
Создание отдельных серий: Вы правильно начали с создания двух разных серий данных для каждой группы. Это позволит вам применять разные настройки для каждой группы меток.
-
Использование вертикального смещения: Вместо того, чтобы использовать только горизонтальное смещение, попробуйте исключить
moveOverlap: 'shiftX'
из одной из групп, чтобы оценить их взаимодействие. Также можно задать фиксированное vertical смещение для каждой группы при помощиlabelLayout
. -
Настройка
labelLayout
: Вместо использования однозначного решения для наложения меток, настройтеlabelLayout
для каждой группы. Например, задайте разные значения по оси Y для каждой серии так, чтобы метки первой группы находились в верхней части графика, а второй — ниже.
labelLayout: function () {
return {
y: this.seriesIndex === 0 ? myChart.getHeight() - 750 : myChart.getHeight() - 30,
moveOverlap: 'none' // Разделите управление наложением
};
}
-
Настройка границ видимости: Ваша текущая настройка границ имеет значение. Возможно, стоит увеличить пространство между осями, чтобы избежать наложения меток. Используйте
grid
для дальнейшего увеличения отступов по вертикали. -
Проверка на реальных данных: Проверьте, как ваши настройки работают на реальных данных. Ищите пересечения и корректируйте настройки
position
(например,position: 'top'
илиposition: 'bottom'
) для контроля размещения меток.
Пример исправленного кода
Вот возможный вариант кода с учетом вышеуказанных рекомендаций:
option = {
// остальные настройки остаются прежними
series: [
{
// первая серия
labelLayout: function () {
return { y: myChart.getHeight() - 750, moveOverlap: 'none' }; // Нет наложения
},
label: {
position: 'right', // можно задать 'top' для более четкого отображения
}
},
{
// вторая серия
labelLayout: function () {
return { y: myChart.getHeight() - 30, moveOverlap: 'none' }; // Нет наложения
},
label: {
position: 'bottom', // разместите метки ниже
}
}
]
}
Заключение
Интерактивные диаграммы рассеяния в eCharts могут быть очень мощными для визуализации больших наборов данных. Правильное размещение меток — это ключ к информативному и понятному отображению информации. Применяя данные рекомендации, вы сможете эффективно разделить метки для двух групп и значительно улучшить визуальную привлекательность вашей диаграммы. Попробуйте использовать различные комбинации и настройки, чтобы найти оптимальный вариант для ваших данных.