chart.js: Поместить всплывающую подсказку для столбчатых диаграмм с накоплением сверху - PullRequest
4 голосов
/ 16 мая 2019

Когда у меня есть гистограмма на простой гистограмме, всплывающая подсказка помещается в верхнюю часть гистограммы:

top positioned tooltip

Если я наведите курсор на гистограмму с накоплением, всплывающая подсказка помещается в позицию average:

average positioning of tooltip

Вместо этого поведения я хочу всегда размещать всплывающую подсказку сверху для гистограмм с накоплением (как для простых гистограмм). Единственными двумя вариантами настройки положения являются average и nearest (https://www.chartjs.org/docs/latest/configuration/tooltip.html#position-modes).

Я знаю, что есть упомянутый способ использования Chart.Tooltip.positioners.custom, но, с одной стороны, это переписало бы поведение для всех графиков (но мне просто нужно его для гистограмм с накоплением), а с другой стороны, даже если бы я мог использовать что я понятия не имею, как получить или рассчитать верхнюю позицию бара диаграммы.

Итак, есть ли способ разместить всплывающую подсказку поверх столбика с накоплением? Спасибо!

1 Ответ

1 голос
/ 05 июля 2019

Спасибо, что ответили, я нашел способ, но он взломан и может не сработать для вас.учитывать следующее:

//register custom positioner
Chart.Tooltip.positioners.custom = function(elements, position) {
  //debugger;
  return {
    x: position.x,
    y: elements[0]._view.base - (elements[0].height() + elements[1].height())
  }
}


//Individual chart config
var ctx = "myChart";
var myChart = new Chart(ctx, {
  type: 'bar',
  options: {
    title: {
      display: true,
      text: 'Precision-Recall Curve',
    },
    layout: {
      padding: 32
    },
    tooltips: {
      mode: 'index',
      intersect: true,
      position: 'custom',
      yAlign: 'bottom'
    },
    scales: {
      xAxes: [{
        stacked: true
      }],
      yAxes: [{
        stacked: true
      }]
    }
  },
  data: {
    labels: ['0%', '10%', '20%', '30%', '40%', '50%', '60%', '70%', '80%', '90%', '100%'],
    datasets: [{
      label: 'data1',
      data: [5, 56, 90, 6, 42, 67, 32, 24, 20, 18, 56],
      borderColor: '#1acc1c',
      backgroundColor: 'rgba(26, 10, 55, .1)',
      pointBorderColor: "#4Bd1C0",
      pointBackgroundColor: "#fff",
      pointHitRadius: 10
    }, {
      label: 'data2',
      data: [2, 12, 24, 30, 39, 58, 10, 82, 34, 89, 5],
      borderColor: '#34315a',
      backgroundColor: 'rgba(132, 2, 34, .7)',
      pointBorderColor: "#34495e",
      pointBackgroundColor: "#fff",
      pointHitRadius: 10
    }]
  }
});
<div class="container">
  <div>
    <canvas id="myChart"></canvas>
  </div>
</div>

<script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.4.0/Chart.bundle.min.js"></script>
...