Chart.js根据选择显示数据

u7up0aaq  于 2024-01-07  发布在  Chart.js
关注(0)|答案(2)|浏览(201)

我正在寻找一个解决方案,以显示基于你在图表内悬停的一些数据。这里是我的jsfiddle和我想要的演示。gif image
我希望我已经把一切都说清楚了,提前感谢!

  1. const chart = document.getElementById('chart');
  2. new Chart(chart, {
  3. type: 'doughnut',
  4. data: {
  5. labels: ['Bitcoin', 'Ethereum', 'Litecoin', 'Tether'],
  6. datasets: [{
  7. data: [50, 30, 10, 10],
  8. backgroundColor: [
  9. 'orange',
  10. 'purple',
  11. 'darkblue',
  12. 'green'
  13. ],
  14. borderWidth: 2,
  15. }]
  16. },
  17. options: {
  18. responsive: false,
  19. cutout: '72%',
  20. plugins: {
  21. legend: {
  22. display: false,
  23. },
  24. },
  25. }
  26. });
  1. .chart-wrap {
  2. display: flex;
  3. align-items: center;
  4. justify-content: center;
  5. }
  6. .chart-balance {
  7. position: absolute;
  8. }
  1. <script src="https://cdn.jsdelivr.net/npm/chart.js"></script>
  2. <div class="chart-wrap">
  3. <canvas id="chart" class="kz-relative kz-index-10" width="224" height="224"></canvas>
  4. <div class="chart-balance">
  5. <p class="chart-asset-type">Ethereum</p>
  6. <h5 class="chart-asset-value">$1,000</h5>
  7. </div>
  8. </div>
hmtdttj4

hmtdttj41#

您可以使用onHover钩子来更新HTML

  1. const chart = document.getElementById('chart');
  2. new Chart(chart, {
  3. type: 'doughnut',
  4. data: {
  5. labels: ['Bitcoin', 'Ethereum', 'Litecoin', 'Tether'],
  6. datasets: [{
  7. data: [50, 30, 10, 10],
  8. backgroundColor: [
  9. 'orange',
  10. 'purple',
  11. 'darkblue',
  12. 'green'
  13. ],
  14. borderWidth: 2,
  15. }]
  16. },
  17. options: {
  18. responsive: false,
  19. onHover: (evt, activeEls) => {
  20. if (activeEls.length === 0)
  21. return;
  22. const label = document.getElementsByClassName("chart-asset-type")[0];
  23. const value = document.getElementsByClassName("chart-asset-value")[0];
  24. label.innerHTML = evt.chart.data.labels[activeEls[0].index];
  25. value.innerHTML = evt.chart.data.datasets[activeEls[0].datasetIndex].data[activeEls[0].index];
  26. },
  27. cutout: '72%',
  28. plugins: {
  29. legend: {
  30. display: false,
  31. },
  32. },
  33. }
  34. });
  1. .chart-wrap {
  2. display: flex;
  3. align-items: center;
  4. justify-content: center;
  5. }
  6. .chart-balance {
  7. position: absolute;
  8. }
  1. <script src="https://cdn.jsdelivr.net/npm/chart.js"></script>
  2. <div class="chart-wrap">
  3. <canvas id="chart" class="kz-relative kz-index-10" width="224" height="224"></canvas>
  4. <div class="chart-balance">
  5. <p class="chart-asset-type">Ethereum</p>
  6. <h5 class="chart-asset-value">$1,000</h5>
  7. </div>
  8. </div>
展开查看全部
oewdyzsn

oewdyzsn2#

Chart.js的问题是它创建了一个画布,你不能用外部JavaScript代码来操作这些元素。我真的不知道是否有可能的配置来模拟你在Chart.js中想要的东西,因为我对它知之甚少。无论如何,我设法用Plotly库做到了这一点。有了它,我用圆形图表做了一部分工作,之后,我们在HTML中有SVG元素。2有了这个,我可以操纵默认的工具提示值,使它出现在自定义元素的中心。
完整的代码在那里,但我建议您查看Plotly文档,如果您不了解MutationObserver

  1. // https://cdn.jsdelivr.net/npm/[email protected]/plotly.min.js
  2. const data = {
  3. labels: ["Bitcoin", "Ethereum", "Litecoin", "Tether"],
  4. values: [50, 30, 10, 10],
  5. name: "",
  6. hoverinfo: "label+percent+name",
  7. hole: 0.65,
  8. type: "pie",
  9. marker: {
  10. colors: ["orange", "purple", "darkblue", "green"],
  11. line: {
  12. color: "white",
  13. width: 4
  14. }
  15. }
  16. }
  17. const layout = {
  18. paper_bgcolor: "transparent",
  19. height: 550,
  20. width: 550,
  21. showlegend: false
  22. }
  23. const chartElement = document.querySelector("#chart"),
  24. chartLabelElement = document.querySelector(".chart-label"),
  25. chartValueElement = document.querySelector(".chart-value")
  26. chartLabelElement.textContent = data.labels[0]
  27. chartValueElement.textContent = data.values[0]
  28. Plotly.newPlot(chartElement, [data], layout).then(() => {
  29. observeTooltip()
  30. })
  31. function observeTooltip() {
  32. window.MutationObserver = window.MutationObserver ||
  33. window.WebKitMutationObserver || window.MozMutationObserver
  34. const observer = new MutationObserver(mutations => {
  35. const tooltipElement = chartElement.querySelector(".hovertext")
  36. if (tooltipElement) {
  37. tooltipElement.remove()
  38. const textElements = tooltipElement.querySelectorAll("tspan")
  39. const label = textElements[0].textContent.trim(),
  40. value = textElements[1].textContent.trim()
  41. chartLabelElement.textContent = label
  42. chartValueElement.textContent = value
  43. }
  44. })
  45. observer.observe(chartElement, {
  46. childList: true,
  47. subtree: true
  48. })
  49. }
  1. .modebar-container {
  2. display: none;
  3. }
  4. #chart {
  5. width: fit-content;
  6. margin: 0 auto;
  7. }
  8. #chart path.surface:hover {
  9. cursor: pointer;
  10. filter: opacity(0.7);
  11. }
  12. #chart .hovertext {
  13. display: none;
  14. }
  15. .chart-block {
  16. position: relative;
  17. }
  18. .chart-center {
  19. position: absolute;
  20. top: 0;
  21. width: 0;
  22. height: 100%;
  23. width: 100%;
  24. display: flex;
  25. flex-wrap: nowrap;
  26. justify-content: center;
  27. align-items: center;
  28. text-align: center;
  29. font-family: "Segoe UI", sans-serif;
  30. }
  31. .chart-label {
  32. color: #555;
  33. font-size: 18px;
  34. font-weight: 700;
  35. }
  36. .chart-value {
  37. color: #000;
  38. font-size: 48px;
  39. font-weight: 700;
  40. }
  1. <script src="https://cdn.jsdelivr.net/npm/[email protected]/plotly.min.js"></script>
  2. <div class="chart-block">
  3. <div class="chart-center">
  4. <div>
  5. <div class="chart-label"></div>
  6. <div class="chart-value"></div>
  7. </div>
  8. </div>
  9. <div id="chart"></div>
  10. </div>
展开查看全部

相关问题