Как сделать диаграмму в форме половины доната?

Ссылка скопирована
1 ответ

Я пытаюсь построить диаграмму в форме половины бублика с необычным скруглением делений.

Дизайн выглядит следующим образом:

Как сделать диаграмму в форме половины доната?

Решил использовать chart.js. Проект написан на vue 3, данные динамические.

В целом удалось повторить дизайн, но никак не получается скругулить боковые углы, в итоге имею вот это:

Как сделать диаграмму в форме половины доната?

Мой код выглядит следующим образом:

<template>     <div class="doughnut">         <canvas ref="chart"></canvas>     </div> </template>  <script setup>  import {onMounted, ref} from "vue"; import {     Chart,     DoughnutController,     ArcElement, } from 'https://cdn.skypack.dev/chart.js@4.2.1';    Chart.register(     DoughnutController,     ArcElement, );  const chart = ref(null); const data = {     datasets: [         {             data: [33, 23, 8, 7],             backgroundColor: [                 "#F04B92",                 "#54B2FD",                 "#FFC24B",                 "#49EBCE",             ],             display: true,             offset: 0,             spacing: -30,             borderColor: "#fff",             borderWidth: 2,             borderRadius: {outerStart: 16,  outerEnd: 0, innerStart: 16},             cutout: "58%",         }     ],     labels: false };  const config = {     type: 'doughnut',     data,     options: {         rotation: 270,         circumference: 180,         maintainAspectRatio: false,         responsive: true,         animation: {             animateRotate: true         },     }, }

<template> <div class="doughnut"> <canvas ref="chart"></canvas> </div> </template> <script setup> import {onMounted, ref} from "vue"; import { Chart, DoughnutController, ArcElement, } from 'https://cdn.skypack.dev/chart.js@4.2.1'; Chart.register( DoughnutController, ArcElement, ); const chart = ref(null); const data = { datasets: [ { data: [33, 23, 8, 7], backgroundColor: [ "#F04B92", "#54B2FD", "#FFC24B", "#49EBCE", ], display: true, offset: 0, spacing: -30, borderColor: "#fff", borderWidth: 2, borderRadius: {outerStart: 16, outerEnd: 0, innerStart: 16}, cutout: "58%", } ], labels: false }; const config = { type: 'doughnut', data, options: { rotation: 270, circumference: 180, maintainAspectRatio: false, responsive: true, animation: { animateRotate: true }, }, }

Так же вот тут есть полностью рабочий пример https://codepen.io/yurikssi/pen/yLGVBPm

Подскажите, как выполнить нужное скругление и в целом избавиться от зазоров между делениями? Возможно ли это сделать с помощью этого инструмента, или необходимо использовать что-то другое?

Дополнительно:

Закругления работают. Ваша проблема в смещении spacing на -30:

<template>     <div class="doughnut">         <canvas ref="chart"></canvas>     </div> </template>  <script setup>  import {onMounted, ref} from "vue"; import {     Chart,     DoughnutController,     ArcElement, } from 'https://cdn.skypack.dev/chart.js@4.2.1';    Chart.register(     DoughnutController,     ArcElement, );  const chart = ref(null);  const data = {     datasets: [         {             data: [40, 22, 8, 30],             backgroundColor: [                 "#F04B92",                 "#54B2FD",                 "#FFC24B",                 "#49EBCE",             ],             display: true,             offset: 2,             spacing: -30,             borderColor: "#fff",             borderWidth: 2,             borderRadius: [                 {outerStart: 16,  outerEnd: 2, innerStart: 16},                 {outerStart: 16,  outerEnd: 2, innerStart: 16},                 {outerStart: 16,  outerEnd: 2, innerStart: 16},                 {outerStart: 16,  outerEnd: 16, innerStart: 16, innerEnd: 16}             ],             cutout: "58%",         }     ],     labels: false };  const config = {     type: 'doughnut',     data,     options: {         rotation: 270,         circumference: 180,         maintainAspectRatio: false,         responsive: true,         animation: {             animateRotate: true         }     }, }  onMounted(() => {        const myChart = new Chart(         chart.value,         config     );        const ctx = myChart.canvas.getContext("2d");      ctx.scale(0.8, 0.8); });        </script>

<template> <div class="doughnut"> <canvas ref="chart"></canvas> </div> </template> <script setup> import {onMounted, ref} from "vue"; import { Chart, DoughnutController, ArcElement, } from 'https://cdn.skypack.dev/chart.js@4.2.1'; Chart.register( DoughnutController, ArcElement, ); const chart = ref(null); const data = { datasets: [ { data: [40, 22, 8, 30], backgroundColor: [ "#F04B92", "#54B2FD", "#FFC24B", "#49EBCE", ], display: true, offset: 2, spacing: -30, borderColor: "#fff", borderWidth: 2, borderRadius: [ {outerStart: 16, outerEnd: 2, innerStart: 16}, {outerStart: 16, outerEnd: 2, innerStart: 16}, {outerStart: 16, outerEnd: 2, innerStart: 16}, {outerStart: 16, outerEnd: 16, innerStart: 16, innerEnd: 16} ], cutout: "58%", } ], labels: false }; const config = { type: 'doughnut', data, options: { rotation: 270, circumference: 180, maintainAspectRatio: false, responsive: true, animation: { animateRotate: true } }, } onMounted(() => { const myChart = new Chart( chart.value, config ); const ctx = myChart.canvas.getContext("2d"); ctx.scale(0.8, 0.8); }); </script>

  • Без смещения блоки не будут заходить друг за друга, как того требует дизайн, для этого оно и добавлено
  • Арсений, поправил ответ, ваша задача поместить диаграмму внутри canvas. В моём примере я использую scale.
  • Арсений, при наведении баг появился, но сути не меняет, копайте в направлении масштабирования. Т.к. ваше смещение в отрицательную сторону, прячет кусок диаграммы за видимой областью canvas.
  • Спасибо! Буду докручивать тогда, чтобы нижние грани были на одной линии
  • Арсений, я ничего толкового не нашёл, но если отключить responsive: true результат более контролируемый, возможно даже баг исчезнет, попробуйте.
  • Если отключить, то всё ломается, но поэкспериментирую.
    А вообще, ваше решение работает для меня, благодарю!
Нужно решить такую задачу?

Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

Заказать помощь
Лучший ответ
1
Юрий Linux Ответ

Для создания диаграммы в форме половины доната, можно воспользоваться библиотекой для создания графиков, такой как Chart.js. В данном случае, я предположу, что вы работаете с языком программирования PHP.

Прежде всего, вам необходимо подключить библиотеку Chart.js к вашему проекту. Вы можете сделать это, добавив ссылку на CDN в вашем HTML файле:

<script src="https://cdn.jsdelivr.net/npm/chart.js"></script>

<script src="https://cdn.jsdelivr.net/npm/chart.js"></script>

Затем, вам необходимо создать HTML элемент, в котором будет отображаться ваш график:

<canvas id="myChart"></canvas>

<canvas id="myChart"></canvas>

Далее, вам нужно написать JavaScript код, который будет инициализировать и настраивать ваш график. Вот пример кода для создания диаграммы в форме половины доната:

var ctx = document.getElementById('myChart').getContext('2d');
var myChart = new Chart(ctx, {
    type: 'doughnut',
    data: {
        datasets: [{
            data: [40, 60],
            backgroundColor: [
                'rgba(255, 99, 132, 0.5)',
                'rgba(54, 162, 235, 0.5)'
            ]
        }]
    },
    options: {
        cutoutPercentage: 50
    }
});

var ctx = document.getElementById('myChart').getContext('2d'); var myChart = new Chart(ctx, { type: 'doughnut', data: { datasets: [{ data: [40, 60], backgroundColor: [ 'rgba(255, 99, 132, 0.5)', 'rgba(54, 162, 235, 0.5)' ] }] }, options: { cutoutPercentage: 50 } });

В этом коде мы создаем новый график типа 'doughnut' (донат), передавая данные в формате процентного соотношения для каждой части диаграммы. Свойство cutoutPercentage позволяет установить процент обрезки внутренней части диаграммы, что и создает форму половины доната.

Надеюсь, это поможет вам создать диаграмму в форме половины доната в вашем проекте на PHP. Если у вас возникнут дополнительные вопросы, не стесняйтесь задавать их.

Другие ответы (0)

Пока нет других ответов. Будьте первым, кто поможет автору.

Ответить на вопрос

комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Вам также может быть интересно