Skip to main content

Donut

Basic Configuration​

The minimum configuration for the Donut component looks like:

component.tsx
import { VisSingleContainer, VisDonut } from '@unovis/react'

function Component(props) {
const data: number[] = props.data
const value = (d: number) => d

return (
<VisSingleContainer data={data}>
<VisDonut value={value}/>
</VisSingleContainer>
)
}
Loading...

Labels​

Donut can have a label and a smaller sub-label in the center. You can provide them by using the centralLabel and centralSubLabel config properties. The sub-label will automatically wrap onto multiple lines (unless you set the centralSubLabelWrap property to false), while the main label is supposed to be short and doesn't have wrapping implemented.

<VisDonut
value={value}
centralLabel="Label"
centralSubLabel="Long sub-label wraps onto the next line"
/>
Loading...

Label Position​

You can adjust the position of both the central label and sub-label using offset properties:

Horizontal Offset​

Use centralLabelOffsetX to move the labels left or right (negative values move left, positive values move right):

<VisDonut
value={value}
centralLabel="Offset Label"
centralSubLabel="Moved horizontally"
centralLabelOffsetX={20}
/>
Loading...

Vertical Offset​

Use centralLabelOffsetY to move the labels up or down (negative values move up, positive values move down):

<VisDonut
value={value}
centralLabel="Offset Label"
centralSubLabel="Moved vertically"
centralLabelOffsetY={-15}
/>
Loading...

You can combine both offsets to position the labels exactly where you need them.

Angle Range​

By default, a Donut will populate values in the angle range [0, 2Ï€]. You can adjust your Donut's angleRange property to a [a,b] of type [number, number] where a[0] = the starting position and a[1] = the ending position (in radians). A common example might be when you want an incomplete/semi circle:

<VisDonut value={value} angleRange={[1,3.141592653589793]}/>
Loading...

Half Donut Charts​

For convenience, Unovis provides preset angle ranges to create half donut charts in different orientations. You can import these constants from @unovis/ts:

import {
DONUT_HALF_ANGLE_RANGE_TOP,
DONUT_HALF_ANGLE_RANGE_RIGHT,
DONUT_HALF_ANGLE_RANGE_BOTTOM,
DONUT_HALF_ANGLE_RANGE_LEFT
} from '@unovis/ts'

Sorting​

By default, each segment is placed in order of appearance within your data array, from To change this, provide a sorting function to the sortFunction property. The following example displays the segments in descending order:

component.tsx
import { VisSingleContainer, VisDonut } from '@unovis/react'

function Component(props) {
const data: number[] = props.data
const value = (d: number) => d
const sortFunction = (a, b) => a - b

return (
<VisSingleContainer data={data}>
<VisDonut value={value} sortFunction={sortFunction}/>
</VisSingleContainer>
)
}
Loading...

Size​

You can change the size of your Donut with the following properties:

Radius​

radius defines the outer/overall radius:

<VisDonut radius={50} value={value}/>
Loading...

Arc Width​

arcWidth defines the width of the circle's outer ring in pixels.

<VisDonut arcWidth={50} value={value}/>
Loading...

note

For the appearance of a traditional pie chart, set Donut's arcWidth to 0.

Segment Appearance​

Custom Color​

Customize the colors for each segment with a colorAccessor function:

component.tsx
function Component(props) {
const data: number[] = props.data
const value = (d: number) => d
const color = (d: number, i: number) => ['red', 'orange', 'blue', 'green'][i]

return (
<VisDonut value={value} color={color}/>
)
}
Loading...

Corner Radius​

Providing a value to the cornerRadius property adds rounded corners to your Donut's segments proportional to the Donut's arcWidth.

<VisDonut cornerRadius={5} value={value}/>
Loading...

Pad angle​

Pad each segment with the padAngle property.

<VisDonut value={value} padAngle={0.1}/>
Loading...

Empty Segments​

When segments are empty (i.e. when their values are 0), you may still want them displayed in your Donut as thin slices. To do this, set showEmptySegments to true:

<VisDonut showEmptySegments={true} value={value} padAngle={0.03}/>
Loading...

Customizing empty segment size​

When showEmptySegments is enabled, the default size for empty segments is 0.5 * π / 180 radians. You can tweak this to your liking with the emptySegmentAngle property which accepts a number in radians. For example, setting emptySegmentAngle to Math.PI / 12 looks like:

Loading...

Note that this property will have no effect if showEmptySegments is false.

Background​

By default, Donut has a background underneath the segments, which is useful when your chart is empty. You can turn it off by setting showBackground to false.

<VisDonut
showBackground={true}
value={value}
angleRange={[-1.5707963267948966,1.5707963267948966]}
/>
Loading...

Also, you can change the angular range of the background by providing a [number, number] value (in radians) to backgroundAngleRange. By default, the background angular range will be the same as angleRange.

<VisDonut
value={value}
showBackground={true}
angleRange={[0,1.0471975511965976]}
backgroundAngleRange={[0,6.283185307179586]}
/>
Loading...

The color of the background can be changed via the --vis-donut-background-color and --vis-dark-donut-background-color CSS variables.

Events​

The following selectors are available for events:

import { Donut } from '@unovis/ts'
...
events = {
[Donut.selectors.segment]: { },
[Donut.selectors.background]: { },
[Donut.selectors.centralLabel]: { },
[Donut.selectors.centralSubLabel]: { },
}
<VisDonut value={value} events={events}/>

CSS Variables​

All supported CSS variables and their default values

--vis-donut-central-label-font-size: 16px;
--vis-donut-central-label-text-color: #5b5f6d;
--vis-donut-central-label-font-family
--vis-donut-central-label-font-weight: 600;

--vis-donut-central-sub-label-font-size: 12px;
--vis-donut-central-sub-label-text-color: #5b5f6d;
--vis-donut-central-sub-label-font-family
--vis-donut-central-sub-label-font-weight: 500;

--vis-donut-background-color: #E7E9F3;

--vis-dark-donut-central-label-text-color: #C2BECE;
--vis-dark-donut-central-sub-label-text-color: #C2BECE;
--vis-dark-donut-background-color: #18160C;

Component Props​

NameTypeDescription
* required property