我有一个图表,除了数据点之外,我还需要绘制一个图表,我想要一个带有自定义文本字符串的图标永久位于(某些)数据点上方。
我不需要默认值popover,因为我可以使用自定义图例,但是我需要在一个或两点上方添加一个图标,并在该图标上悬停时显示一个popover。我需要从与图表无关的数据构建弹出文本字符串。
自定义数据标签似乎不够灵活,无法在不同数据点上使用不同的图标/弹出框,但是我可能是错的。
另一种可能性是chartjs-plugin-datalabels,但我不确定。
您可以通过添加一个附加的dataset
来轻松解决此问题,该{
data: data2.map((v, i) => imageIndexes.includes(i) ? v + 1.2 : null),
fill: false,
pointStyle: icon,
pointRadius: 22,
pointHoverRadius: 22
}
除了图表中显示的图标外,什么都没有指定。
data2
考虑到数据数组
imageIndexes
和数组data
,可以使用dataset
构建图标Array.map
的Array.map
。请注意,这些值(如果有的话)是从data2
中的相应值派生而来的,但要稍加增加以使图像显示在它们的顶部。
data2.map((v, i) => imageIndexes.includes(i) ? v + 1.2 : null)
此外,您需要在图表
tooltips
内定义一个tooltips
对象,以设置弹出窗口的样式,并确保仅当鼠标悬停在图标上时才显示工具提示。
options
请看下面的可运行代码。
tooltips: { filter: tooltipItem => tooltipItem.datasetIndex == 2, titleFontSize: 16, titleAlign: 'center', callbacks: { title: (tooltipItem) => tooltipItem.length == 0 ? null : tooltipText, label: () => null } },
const labels = ['A', 'B', 'C', 'D', 'E', 'F']; const alerts = ['B', 'D']; const data1 = [0, 2, 1, 3, 2, 1]; const data2 = [1, 3, 3, 4, 3, 2]; const imageIndexes = [1, 3]; const tooltipText = 'Efficiency of Standard Curve\nnot opimal'; var icon = new Image(); icon.src = 'https://i.stack.imgur.com/YvlWY.png'; const chart = new Chart(document.getElementById("myChart"), { type: "line", data: { labels: labels, datasets: [{ data: data1, fill: false, backgroundColor: 'blue', borderColor: 'blue', lineTension: 0, pointRadius: 5, pointHoverRadius: 5, pointBorderWidth: 3, pointHoverBorderWidth: 3, pointBorderColor: 'white', pointHoverBorderColor: 'white' }, { data: data2, fill: false, showLine: false, backgroundColor: 'orange', pointRadius: 4, pointHoverRadius: 4 }, { data: data2.map((v, i) => imageIndexes.includes(i) ? v + 1.2 : null), fill: false, pointStyle: icon, pointRadius: 22, pointHoverRadius: 22 } ] }, options: { responsive: true, title: { display: false }, legend: { display: false }, tooltips: { filter: tooltipItem => tooltipItem.datasetIndex == 2, titleFontSize: 16, titleAlign: 'center', callbacks: { title: (tooltipItem) => tooltipItem.length == 0 ? null : tooltipText, label: () => null } }, scales: { yAxes: [{ ticks: { min: 0, max: 6, stepSize: 1 } }], xAxes: [{ gridLines: { display: false } }] } } });