Visx is a library that lets us add graphics to our React app easily.
In this article, we’ll look at how to use it to add chord diagrams into our React app.
Install Required Packages
We have to install a few modules.
To get started, we run:
npm i @visx/chord @visx/gradient @visx/group @visx/responsive @visx/scale @visx/shape
to install the packages.
Create the Diagram
We can create the chart by adding the items provided by the modules.
We use the data from the @visx/mock-data module.
To create the chord diagram, we write:
import React from "react";
import { Arc } from "@visx/shape";
import { Group } from "@visx/group";
import { Chord, Ribbon } from "@visx/chord";
import { scaleOrdinal } from "@visx/scale";
import { LinearGradient } from "@visx/gradient";
const pink = "#ff2fab";
const orange = "#ffc62e";
const purple = "#dc04ff";
const purple2 = "#7324ff";
const red = "#d04376";
const green = "#52f091";
const blue = "#04a6ff";
const lime = "#00ddc6";
const bg = "#e4e3d8";
const dataMatrix = [
[11975, 5871, 8916, 2868],
[1951, 10048, 2060, 6171],
[8010, 16145, 8090, 8045],
[1013, 990, 940, 6907]
];
function descending(a, b) {
return b < a ? -1 : b > a ? 1 : b >= a ? 0 : NaN;
}
const color = scaleOrdinal({
domain: [0, 1, 2, 3],
range: [
"url(#gpinkorange)",
"url(#gpurplered)",
"url(#gpurplegreen)",
"url(#gbluelime)"
]
});
function Example({ width, height, centerSize = 20, events = false }) {
height -= 77;
const outerRadius = Math.min(width, height) * 0.5 - (centerSize + 10);
const innerRadius = outerRadius - centerSize;
return width < 10 ? null : (
<div className="chords">
<svg width={width} height={height}>
<LinearGradient
id="gpinkorange"
from={pink}
to={orange}
vertical={false}
/>
<LinearGradient
id="gpurplered"
from={purple}
to={red}
vertical={false}
/>
<LinearGradient
id="gpurplegreen"
from={purple2}
to={green}
vertical={false}
/>
<LinearGradient id="gbluelime" from={blue} to={lime} vertical={false} />
<rect width={width} height={height} fill={bg} rx={14} />
<Group top={height / 2} left={width / 2}>
<Chord matrix={dataMatrix} padAngle={0.05} sortSubgroups={descending}>
{({ chords }) => (
<g>
{chords.groups.map((group, i) => (
<Arc
key={`key-${i}`}
data={group}
innerRadius={innerRadius}
outerRadius={outerRadius}
fill={color(i)}
onClick={() => {
if (events) alert(`${JSON.stringify(group)}`);
}}
/>
))}
{chords.map((chord, i) => {
return (
<Ribbon
key={`ribbon-${i}`}
chord={chord}
radius={innerRadius}
fill={color(chord.target.index)}
fillOpacity={0.75}
onClick={() => {
if (events) alert(`${JSON.stringify(chord)}`);
}}
/>
);
})}
</g>
)}
</Chord>
</Group>
</svg>
<style jsx>{`
.chords {
display: flex;
flex-direction: column;
user-select: none;
}
svg {
margin: 1rem 0;
cursor: pointer;
}
.deets {
display: flex;
flex-direction: row;
font-size: 12px;
}
.deets > div {
margin: 0.25rem;
}
`}</style>
</div>
);
}
export default function App() {
return (
<div className="App">
<Example width={500} height={300} />
</div>
);
}
We add the variables with the color codes to set the colors for the chords.
The dataMatrix variable has the data for the chords.
The descending function returns a number according to the values of a and b to change the sorting to descending order.
Next, we create the color variable to add the color range for the chords.
In the Example component, we add the chord diagram.
We add the LinearGradient component to add the gradient for the chords.
Then we add the Chord components inside the Group component to add the chords.
We create chord groups by rendering Arc components.
And we render the chords themselves with the Ribbon component.
Finally, we have some styles to position the chord diagram.
Conclusion
We can create the chord chart easily with the React components provided by the Visx library.