Heim > Web-Frontend > js-Tutorial > Hauptteil

Donut-Diagramm mit Visx in React

Patricia Arquette
Freigeben: 2024-09-21 18:31:02
Original
299 Leute haben es durchsucht

Donut Chart With visx in React

Hallo, in dieser Anleitung erfahren wir, wie man mit Visx ein Fortschritts-Donut-Diagramm erstellt. Ein Donut-Diagramm ist eine Variante eines Kreisdiagramms mit einem zentralen Loch, das einem Donut ähnelt.

Die Mathematik verstehen

Um die Funktionen unseres Diagramms effektiv umzusetzen, ist es wichtig, die dahinter stehenden mathematischen Prinzipien zu verstehen. Das Diagramm ist ein Kreis mit 360 Grad oder 2 * Pi im Bogenmaß. So bestimmen wir die Winkel für jedes Fortschrittssegment:

2 * PI / (number of progress data points)
Nach dem Login kopieren

Der Startwinkel für jedes Fortschrittssegment wird durch Multiplikation des Index mit 2 * Pi dividiert durch die Gesamtzahl der Fortschrittsdatenpunkte abgeleitet:

(index) * 2 * PI / (number of progress data points )
Nach dem Login kopieren

Der Endwinkel eines Fortschrittssegments wird berechnet, indem der Fortschrittsprozentsatz zum Index addiert und dann mit 2 * Pi dividiert durch die Gesamtzahl der Fortschrittsdatenpunkte multipliziert wird:

(index + (progress / 100)) * 2 * PI / (number of progress data points  )
Nach dem Login kopieren
Nach dem Login kopieren

Für die Trackleiste, die den verbleibenden Fortschritt darstellt, ist der Startwinkel derselbe wie der Endwinkel des Fortschrittssegments, während der Endwinkel der Startwinkel des Fortschrittssegments plus dem Gesamtfortschritt dieses Segments ist.

(index + (progress / 100)) * 2 * PI / (number of progress data points  )
Nach dem Login kopieren
Nach dem Login kopieren

der Spurstangen-Endwinkel:

(index + 1) * 2 * PI / (number of progress data points)
Nach dem Login kopieren

Donut-Diagrammcode

Der erste Schritt bei der Entwicklung des Diagramms besteht darin, die erforderlichen Daten zu organisieren. In der Datei data.js definieren Sie Symbole für Fortschrittsdaten, den Fortschrittsbetrag und entsprechende Farben.

export const coins = [
    { symbol: "r", color: "#121212", progress: 30, },
    { symbol: "l", color: "#91235d", progress: 37,  },
    { symbol: "s", color: "#5ef13f", progress: 90,  },
    { symbol: "w", color: "#643dfe", progress: 50, },
    { symbol: "d", color: "#ef0de6", progress: 45, },
];

Nach dem Login kopieren

Als nächstes implementieren wir die Donut-Diagrammkomponente. Nutzen Sie die oben beschriebenen mathematischen Berechnungen, um die Winkel jedes Fortschrittssegments und die dazugehörige Spurleiste dynamisch zu generieren.

import { Pie } from "@visx/shape";
import { Group } from "@visx/group";
import { scaleOrdinal } from "@visx/scale";
import { Text } from "@visx/text";

const margin = { top: 10, right: 10, bottom: 10, left: 10 };
const thickness = 25;

export default function Donut({
    width,
    height,
    data,
    title,
}: {
    width: number;
    height: number;
    data: { symbol: string; progress: number; color: string }[];
    title: string;
}) {

    const innerWidth = width - margin.left - margin.right;
    const innerHeight = height - margin.top - margin.bottom;
    const radius = Math.min(innerWidth, innerHeight) / 2;
    const centerY = innerHeight / 2;
    const centerX = innerWidth / 2;

    const getBrowserColor = scaleOrdinal({
        domain: data.map((d) => d.symbol),
        range: data.map(item => item.color),
    });

    return (
        <svg width={width} height={height}>
            <Group top={centerY + margin.top} left={centerX + margin.left}>
                <Pie
                    data={data}
                    pieValue={(d) => d.progress / 100}
                    outerRadius={radius}
                    innerRadius={radius - thickness + 21}
                >
                    {({ arcs, path }) => {
                        arcs = arcs.map((item, index) => {
                            return ({
                            ...item, 
                                startAngle: (index) * (Math.PI * 2 / data.length),
                                endAngle: (((index + (item.data.progress / 100)) * (Math.PI * 2 / data.length))),
                            })
                        })
                        return (
                            <g >
                                {arcs.map((arc, i) => {
                                    const firstArc = { ...arc, startAngle: arc.startAngle, endAngle: arc.endAngle }
                                    const second = { ...arc, startAngle: arc.endAngle, endAngle: arc.startAngle + Math.PI * 2 /data.length}

                                    return (
                                        <>
                                            <g key={`pie-arc-${i}+1`}>
                                                <path
                                                    className={`arc${i}`}
                                                    d={path(firstArc)}
                                                    fill={getBrowserColor(arc.data.symbol)}
                                                />
                                            </g>
                                            <g key={`pie-arc-${i}+2`}>
                                            <path
                                                className={`arc${i}`}
                                                d={path(second)}
                                                fill={'#E4E4E4'}
                                            />
                                        </g>

                                        </>
                                    )
                                })}
                            </g>
                        )
                    }}
                </Pie>
                <Text className="whitespace-wrap" textAnchor="middle" verticalAnchor={'middle'} fill="black" scaleToFit fontFamily="sans-serif" >
                    {title}
                </Text>
            </Group>

        </svg>)
}

Nach dem Login kopieren

Bitte zögern Sie nicht, uns zu kontaktieren, wenn Sie weitere Erläuterungen oder Hilfe beim Aufbau der Donut-Diagramm-Komponente benötigen. Vielen Dank, dass Sie diesen Artikel gelesen haben. Die Live-Demo ist hier.

Das obige ist der detaillierte Inhalt vonDonut-Diagramm mit Visx in React. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:dev.to
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!