Aug 20, 2025
Let’s walk through the process of creating a simple pie chart using the PieChart component of ZoomCharts JavaScript library.
Let’s walk through the process of creating a simple pie chart using the PieChart component of ZoomCharts JavaScript library.
In just 3 steps, we’ll go from blank canvas to a fully functional pie chart with multiple drill down levels. We’ll also look at some of the configuration options and how to use them.
For more in-depth info, we also recommend watching our 6-part video tutorial series that covers not just chart configuration, but also event listeners and cross-chart filtering.
This tutorial is a companion piece to our article “Building Smarter JavaScript Pie Charts for Web, Apps, Dashboards and Big Data”, which explores JavaScript pie chart use cases and main considerations for choosing a visualization SDK.
For this example, we will create a JavaScript pie chart and add it to a blank HTML page for use in web browsers. Here, we will hotlink the library from ZoomCharts CDN – it’s a convenient way to try out the library and experiment with its features, but when deploying in live environments, it’s recommended to host the library on your own storage.
Our Get Started page provides the CDN and download links, the NPM package, and guides on how to integrate with frameworks like React, Next.js, Vue.js and Angular. Start a free 30-day trial or purchase license to use the visuals – you will get access to all ZoomCharts packages, all features and no watermark.
First, embed the ZoomCharts library within the HTML document by adding a <script> tag that points to its location – either our CDN link or the path to your own hosted library.
<script src="https://cdn.zoomcharts-cloud.com/1/nightly/zoomcharts.js"></script>
Now, we can reference the library to create as many charts as we want and place them anywhere in the HTML document. The only thing that we will need to provide on our own is configuration for each chart instance – everything else will be referenced from the library. Here, the <script> tag to the library is added to the head, and the body has a <div> tag that references “examplepiechart” – a chart that we created.
Of course, each chart instance must be configured in JavaScript. The ZoomCharts library contains five components, so we selected PieChart with const chart = new ZoomCharts.PieChart. Using a different tag would call other ZoomCharts components, for example, FacetChart, GeoChart, TimeChart, or NetChart.
Within the object, we defined container: “examplepiechart”, so that when we use this id in a <div> tag, the browser knows that this is the script that needs to be executed at that location. So, here’s what our code looks like right now:
<head>
<script src="https://cdn.zoomcharts-cloud.com/1/nightly/zoomcharts.js"></script>
</head>
<body>
<h2 align="center">Our Pie Chart</h2>
<div id="examplepiechart"></div>
<script type="text/javascript">
const chart= new ZoomCharts.PieChart({
container: "examplepiechart",
});
</script>
</body>
Something’s missing, right? Exactly – as it is now, the chart will be correctly loaded as a pie chart, but since it has no data to visualize, it will simply appear as a grey donut with nothing to display. In the next step, we will add data, and our JavaScript pie chart will finally take shape.
We will also need a data property, which will contain data to be visualized by the pie chart. As long as your data can be parsed in JSON format, it does not matter what database you are using or what backed language you prefer – this includes referencing JSON files, MySQL or MongoDB databases (read more in the Integrations section in our website's header menu), or you preloading the data directly so that is entirely contained within the script. For the former, it will look like this:
"data": [
{ "url": "/exampledataurl/piechartdata.json" }
],
However, for this JavaScript pie chart example, we will use the latter method and provide our data directly in the script. We will use a random example dataset of new car sales in a region (generated by an LLM), which has car makers, models, and sold units. Inherently, this already presents us with two drill down levels – brands and models. The initial view will show the sales per brand, and the user can click to reveal sales per model of that brand.
Manufacturer | Model | Sales |
---|---|---|
Volkswagen | Golf | 154 |
Volkswagen | Tiguan | 867 |
Volkswagen | Polo | 232 |
Volkswagen | Passat | 1032 |
Volkswagen | ID.4 | 694 |
Volkswagen | T-Roc | 927 |
Peugeot | 208 | 102 |
Peugeot | 2008 | 778 |
Peugeot | 308 | 269 |
Peugeot | 3008 | 530 |
Peugeot | 5008 | 542 |
Renault | Clio | 257 |
Renault | Captur | 351 |
Renault | Megane | 549 |
Renault | Austral | 235 |
Renault | Arkana | 765 |
Renault | Twingo | 169 |
BMW | 3 Series | 346 |
BMW | X1 | 479 |
BMW | 1 Series | 862 |
BMW | X3 | 626 |
BMW | 5 Series | 652 |
BMW | X5 | 329 |
Mercedes-Benz | A-Class | 496 |
Mercedes-Benz | C-Class | 667 |
Mercedes-Benz | GLA | 450 |
Mercedes-Benz | EQA | 314 |
Mercedes-Benz | GLC | 640 |
Mercedes-Benz | EQB | 543 |
Audi | A3 | 273 |
Audi | Q3 | 111 |
Audi | A4 | 665 |
Audi | Q2 | 245 |
Audi | Q5 | 183 |
Audi | A6 | 110 |
Skoda | Octavia | 132 |
Skoda | Fabia | 992 |
Skoda | Karoq | 111 |
Skoda | Superb | 181 |
Skoda | Kamiq | 104 |
Skoda | Enyaq | 624 |
Fiat | 500 | 333 |
Fiat | Panda | 346 |
Fiat | Tipo | 369 |
Fiat | 600e | 327 |
Fiat | Doblo | 419 |
Dacia | Sandero | 1169 |
Dacia | Duster | 576 |
Dacia | Jogger | 622 |
Dacia | Spring | 988 |
Dacia | Lodgy | 582 |
Toyota | Yaris | 124 |
Toyota | Corolla | 1027 |
Toyota | C-HR | 427 |
Toyota | RAV4 | 171 |
Toyota | Aygo X | 1151 |
Honda | Civic | 220 |
Honda | CR-V | 321 |
Honda | HR-V | 257 |
Honda | Jazz | 181 |
Honda | e:Ny1 | 232 |
Hyundai | i10 | 89 |
Hyundai | i20 | 90 |
Hyundai | i30 | 229 |
Hyundai | Tucson | 457 |
Hyundai | Kona | 97 |
Hyundai | Bayon | 389 |
Kia | Ceed | 423 |
Kia | Sportage | 375 |
Kia | Picanto | 347 |
Kia | Stonic | 211 |
Kia | Niro | 283 |
Opel | Corsa | 289 |
Opel | Astra | 369 |
Opel | Mokka | 398 |
Opel | Crossland | 190 |
Opel | Grandland | 386 |
Seat | Ibiza | 87 |
Seat | Leon | 450 |
Seat | Arona | 475 |
Seat | Ateca | 177 |
Seat | Tarraco | 165 |
You can provide the data using JSON data structure. Each value may have “subvalues” – that is the next drill down level, and it contains all values within that category. One thing to note is that for PieChart, the top level also must be formatted as “subvalues”, since they are technically subvalues that contribute to the total value (100%).
Here’s a live example where we added the dataset under preloaded: {}. Note that by default, slices will be sorted in the order of the appearance in data; we used sortField: “value” to apply a descending order.
<h3 align="center">New Car Sales (Sample Data)</h3>
<div id="example1"></div>
<script>
const chart = new ZoomCharts.PieChart({
container: "example1",
data: {
preloaded: {
subvalues: [
{
value: 3906,
name: "Volkswagen",
subvalues: [
{ value: 154, name: "Golf" },
{ value: 867, name: "Tiguan" },
{ value: 232, name: "Polo" },
{ value: 1032, name: "Passat" },
{ value: 694, name: "ID.4" },
{ value: 927, name: "T-Roc" }
]
},
{
value: 2221,
name: "Peugeot",
subvalues: [
{ value: 102, name: "208" },
{ value: 778, name: "2008" },
{ value: 269, name: "308" },
{ value: 530, name: "3008" },
{ value: 542, name: "5008" }
]
},
{
value: 2326,
name: "Renault",
subvalues: [
{ value: 257, name: "Clio" },
{ value: 351, name: "Captur" },
{ value: 549, name: "Megane" },
{ value: 235, name: "Austral" },
{ value: 765, name: "Arkana" },
{ value: 169, name: "Twingo" }
]
},
{
value: 3294,
name: "BMW",
subvalues: [
{ value: 346, name: "3 Series" },
{ value: 479, name: "X1" },
{ value: 862, name: "1 Series" },
{ value: 626, name: "X3" },
{ value: 652, name: "5 Series" },
{ value: 329, name: "X5" }
]
},
{
value: 3110,
name: "Mercedes-Benz",
subvalues: [
{ value: 496, name: "A-Class" },
{ value: 667, name: "C-Class" },
{ value: 450, name: "GLA" },
{ value: 314, name: "EQA" },
{ value: 640, name: "GLC" },
{ value: 543, name: "EQB" }
]
},
{
value: 1587,
name: "Audi",
subvalues: [
{ value: 273, name: "A3" },
{ value: 111, name: "Q3" },
{ value: 665, name: "A4" },
{ value: 245, name: "Q2" },
{ value: 183, name: "Q5" },
{ value: 110, name: "A6" }
]
},
{
value: 2144,
name: "Skoda",
subvalues: [
{ value: 132, name: "Octavia" },
{ value: 992, name: "Fabia" },
{ value: 111, name: "Karoq" },
{ value: 181, name: "Superb" },
{ value: 104, name: "Kamiq" },
{ value: 624, name: "Enyaq" }
]
},
{
value: 1794,
name: "Fiat",
subvalues: [
{ value: 333, name: "500" },
{ value: 346, name: "Panda" },
{ value: 369, name: "Tipo" },
{ value: 327, name: "600e" },
{ value: 419, name: "Doblo" }
]
},
{
value: 3937,
name: "Dacia",
subvalues: [
{ value: 1169, name: "Sandero" },
{ value: 576, name: "Duster" },
{ value: 622, name: "Jogger" },
{ value: 988, name: "Spring" },
{ value: 582, name: "Lodgy" }
]
},
{
value: 2900,
name: "Toyota",
subvalues: [
{ value: 124, name: "Yaris" },
{ value: 1027, name: "Corolla" },
{ value: 427, name: "C-HR" },
{ value: 171, name: "RAV4" },
{ value: 1151, name: "Aygo X" }
]
},
{
value: 1211,
name: "Honda",
subvalues: [
{ value: 220, name: "Civic" },
{ value: 321, name: "CR-V" },
{ value: 257, name: "HR-V" },
{ value: 181, name: "Jazz" },
{ value: 232, name: "e:Ny1" }
]
},
{
value: 1351,
name: "Hyundai",
subvalues: [
{ value: 89, name: "i10" },
{ value: 90, name: "i20" },
{ value: 229, name: "i30" },
{ value: 457, name: "Tucson" },
{ value: 97, name: "Kona" },
{ value: 389, name: "Bayon" }
]
},
{
value: 1639,
name: "Kia",
subvalues: [
{ value: 423, name: "Ceed" },
{ value: 375, name: "Sportage" },
{ value: 347, name: "Picanto" },
{ value: 211, name: "Stonic" },
{ value: 283, name: "Niro" }
]
},
{
value: 1632,
name: "Opel",
subvalues: [
{ value: 289, name: "Corsa" },
{ value: 369, name: "Astra" },
{ value: 398, name: "Mokka" },
{ value: 190, name: "Crossland" },
{ value: 386, name: "Grandland" }
]
},
{
value: 1354,
name: "Seat",
subvalues: [
{ value: 87, name: "Ibiza" },
{ value: 450, name: "Leon" },
{ value: 475, name: "Arona" },
{ value: 177, name: "Ateca" },
{ value: 165, name: "Tarraco" }
]
}
]
},
sortField: "value"
}
});
</script>
We now have a simple JavaScript pie chart. Since our categories have subvalues (Brand -> Model), the chart automatically enables drill down. For example, the Volkswagen slice shows the total number of VW sales, but if you click on it, it will drill down reveal how many of the total sold VWs were Passats, Golfs, ID.4, T-Rocs, or Tiguans.
The chart subtly indicates that there is a deeper level available with a thin line around the edge; and after drill down, the middle part will show a snapshot of the previous level, so that the user knows where they are. It also functions as a back button. Our dataset has only two levels, but you can create even more levels of drill down based on your provided subvalues.
At this stage, we have added the JavaScript pie chart to our project and provided data to visualize. Without any other parameters, PieChart will use the default settings. You can override the default settings or enable features like legends or ‘Others’ slice by adding properties to the script and configuring them with your own values – let’s dive in!
The pie object may contain various properties that define the appearance of the entire chart. By default, PieChart will render a donut chart – it will be completely circular and have a “hole” in the middle. There are many properties available, but in this section, we will focus on the following:
Here’s an example of how changing innerRadius will affect the chart. Not including this property will apply the default setting (0.3). The larger the value, the bigger the “donut hole”; use 0 if you want a classic pie chart, or increase this value if you want a JavaScript donut chart.
If a JavaScript gauge chart is what you’re looking for, you can use startAngle and endAngle properties. They set the start and end positions for the chart, and the value is provided in radians (you can convert degrees to radians with a tool like this).
The default value for these properties are -1.5707… and 4.7123…, which will place the start and end of the chart at -90° (-π/2) and 270° (3π/2) accordingly, making it a full circle. One way to use these properties is to rotate the chart – for example, using startAngle: 0, endAngle: 6.2831853072, will move the chart’s start and end point at 3 o’clock.
<h3 align="center">Default startAngle and endAngle</h3>
<div id="example2"></div>
<script>
const chart = new ZoomCharts.PieChart({
container: "example2",
data: {
preloaded: {
subvalues: [
{
value: 3906,
name: "Volkswagen",
subvalues: [
{ value: 154, name: "Golf" },
{ value: 867, name: "Tiguan" },
{ value: 232, name: "Polo" },
{ value: 1032, name: "Passat" },
{ value: 694, name: "ID.4" },
{ value: 927, name: "T-Roc" }
]
},
{
value: 2221,
name: "Peugeot",
subvalues: [
{ value: 102, name: "208" },
{ value: 778, name: "2008" },
{ value: 269, name: "308" },
{ value: 530, name: "3008" },
{ value: 542, name: "5008" }
]
},
{
value: 2326,
name: "Renault",
subvalues: [
{ value: 257, name: "Clio" },
{ value: 351, name: "Captur" },
{ value: 549, name: "Megane" },
{ value: 235, name: "Austral" },
{ value: 765, name: "Arkana" },
{ value: 169, name: "Twingo" }
]
},
{
value: 3294,
name: "BMW",
subvalues: [
{ value: 346, name: "3 Series" },
{ value: 479, name: "X1" },
{ value: 862, name: "1 Series" },
{ value: 626, name: "X3" },
{ value: 652, name: "5 Series" },
{ value: 329, name: "X5" }
]
},
{
value: 3110,
name: "Mercedes-Benz",
subvalues: [
{ value: 496, name: "A-Class" },
{ value: 667, name: "C-Class" },
{ value: 450, name: "GLA" },
{ value: 314, name: "EQA" },
{ value: 640, name: "GLC" },
{ value: 543, name: "EQB" }
]
},
{
value: 1587,
name: "Audi",
subvalues: [
{ value: 273, name: "A3" },
{ value: 111, name: "Q3" },
{ value: 665, name: "A4" },
{ value: 245, name: "Q2" },
{ value: 183, name: "Q5" },
{ value: 110, name: "A6" }
]
},
{
value: 2144,
name: "Skoda",
subvalues: [
{ value: 132, name: "Octavia" },
{ value: 992, name: "Fabia" },
{ value: 111, name: "Karoq" },
{ value: 181, name: "Superb" },
{ value: 104, name: "Kamiq" },
{ value: 624, name: "Enyaq" }
]
},
{
value: 1794,
name: "Fiat",
subvalues: [
{ value: 333, name: "500" },
{ value: 346, name: "Panda" },
{ value: 369, name: "Tipo" },
{ value: 327, name: "600e" },
{ value: 419, name: "Doblo" }
]
},
{
value: 3937,
name: "Dacia",
subvalues: [
{ value: 1169, name: "Sandero" },
{ value: 576, name: "Duster" },
{ value: 622, name: "Jogger" },
{ value: 988, name: "Spring" },
{ value: 582, name: "Lodgy" }
]
},
{
value: 2900,
name: "Toyota",
subvalues: [
{ value: 124, name: "Yaris" },
{ value: 1027, name: "Corolla" },
{ value: 427, name: "C-HR" },
{ value: 171, name: "RAV4" },
{ value: 1151, name: "Aygo X" }
]
},
{
value: 1211,
name: "Honda",
subvalues: [
{ value: 220, name: "Civic" },
{ value: 321, name: "CR-V" },
{ value: 257, name: "HR-V" },
{ value: 181, name: "Jazz" },
{ value: 232, name: "e:Ny1" }
]
},
{
value: 1351,
name: "Hyundai",
subvalues: [
{ value: 89, name: "i10" },
{ value: 90, name: "i20" },
{ value: 229, name: "i30" },
{ value: 457, name: "Tucson" },
{ value: 97, name: "Kona" },
{ value: 389, name: "Bayon" }
]
},
{
value: 1639,
name: "Kia",
subvalues: [
{ value: 423, name: "Ceed" },
{ value: 375, name: "Sportage" },
{ value: 347, name: "Picanto" },
{ value: 211, name: "Stonic" },
{ value: 283, name: "Niro" }
]
},
{
value: 1632,
name: "Opel",
subvalues: [
{ value: 289, name: "Corsa" },
{ value: 369, name: "Astra" },
{ value: 398, name: "Mokka" },
{ value: 190, name: "Crossland" },
{ value: 386, name: "Grandland" }
]
},
{
value: 1354,
name: "Seat",
subvalues: [
{ value: 87, name: "Ibiza" },
{ value: 450, name: "Leon" },
{ value: 475, name: "Arona" },
{ value: 177, name: "Ateca" },
{ value: 165, name: "Tarraco" }
]
}
]
},
sortField: "value"
}
});
</script>
<h3 align="center">startAngle: 0, endAngle: 6.2831853072</h3>
<div id="example2a"></div>
<script>
const chart2 = new ZoomCharts.PieChart({
container: "example2a",
pie: {
startAngle: 0,
endAngle: 6.2831853072
},
data: {
preloaded: {
subvalues: [
{
value: 3906,
name: "Volkswagen",
subvalues: [
{ value: 154, name: "Golf" },
{ value: 867, name: "Tiguan" },
{ value: 232, name: "Polo" },
{ value: 1032, name: "Passat" },
{ value: 694, name: "ID.4" },
{ value: 927, name: "T-Roc" }
]
},
{
value: 2221,
name: "Peugeot",
subvalues: [
{ value: 102, name: "208" },
{ value: 778, name: "2008" },
{ value: 269, name: "308" },
{ value: 530, name: "3008" },
{ value: 542, name: "5008" }
]
},
{
value: 2326,
name: "Renault",
subvalues: [
{ value: 257, name: "Clio" },
{ value: 351, name: "Captur" },
{ value: 549, name: "Megane" },
{ value: 235, name: "Austral" },
{ value: 765, name: "Arkana" },
{ value: 169, name: "Twingo" }
]
},
{
value: 3294,
name: "BMW",
subvalues: [
{ value: 346, name: "3 Series" },
{ value: 479, name: "X1" },
{ value: 862, name: "1 Series" },
{ value: 626, name: "X3" },
{ value: 652, name: "5 Series" },
{ value: 329, name: "X5" }
]
},
{
value: 3110,
name: "Mercedes-Benz",
subvalues: [
{ value: 496, name: "A-Class" },
{ value: 667, name: "C-Class" },
{ value: 450, name: "GLA" },
{ value: 314, name: "EQA" },
{ value: 640, name: "GLC" },
{ value: 543, name: "EQB" }
]
},
{
value: 1587,
name: "Audi",
subvalues: [
{ value: 273, name: "A3" },
{ value: 111, name: "Q3" },
{ value: 665, name: "A4" },
{ value: 245, name: "Q2" },
{ value: 183, name: "Q5" },
{ value: 110, name: "A6" }
]
},
{
value: 2144,
name: "Skoda",
subvalues: [
{ value: 132, name: "Octavia" },
{ value: 992, name: "Fabia" },
{ value: 111, name: "Karoq" },
{ value: 181, name: "Superb" },
{ value: 104, name: "Kamiq" },
{ value: 624, name: "Enyaq" }
]
},
{
value: 1794,
name: "Fiat",
subvalues: [
{ value: 333, name: "500" },
{ value: 346, name: "Panda" },
{ value: 369, name: "Tipo" },
{ value: 327, name: "600e" },
{ value: 419, name: "Doblo" }
]
},
{
value: 3937,
name: "Dacia",
subvalues: [
{ value: 1169, name: "Sandero" },
{ value: 576, name: "Duster" },
{ value: 622, name: "Jogger" },
{ value: 988, name: "Spring" },
{ value: 582, name: "Lodgy" }
]
},
{
value: 2900,
name: "Toyota",
subvalues: [
{ value: 124, name: "Yaris" },
{ value: 1027, name: "Corolla" },
{ value: 427, name: "C-HR" },
{ value: 171, name: "RAV4" },
{ value: 1151, name: "Aygo X" }
]
},
{
value: 1211,
name: "Honda",
subvalues: [
{ value: 220, name: "Civic" },
{ value: 321, name: "CR-V" },
{ value: 257, name: "HR-V" },
{ value: 181, name: "Jazz" },
{ value: 232, name: "e:Ny1" }
]
},
{
value: 1351,
name: "Hyundai",
subvalues: [
{ value: 89, name: "i10" },
{ value: 90, name: "i20" },
{ value: 229, name: "i30" },
{ value: 457, name: "Tucson" },
{ value: 97, name: "Kona" },
{ value: 389, name: "Bayon" }
]
},
{
value: 1639,
name: "Kia",
subvalues: [
{ value: 423, name: "Ceed" },
{ value: 375, name: "Sportage" },
{ value: 347, name: "Picanto" },
{ value: 211, name: "Stonic" },
{ value: 283, name: "Niro" }
]
},
{
value: 1632,
name: "Opel",
subvalues: [
{ value: 289, name: "Corsa" },
{ value: 369, name: "Astra" },
{ value: 398, name: "Mokka" },
{ value: 190, name: "Crossland" },
{ value: 386, name: "Grandland" }
]
},
{
value: 1354,
name: "Seat",
subvalues: [
{ value: 87, name: "Ibiza" },
{ value: 450, name: "Leon" },
{ value: 475, name: "Arona" },
{ value: 177, name: "Ateca" },
{ value: 165, name: "Tarraco" }
]
}
]
},
sortField: "value"
},
});
</script>
However, these values do not have to always make a full circle – you can place the start and end points at custom angles to create a gauge chart, half pie chart or other use cases. Here’s an example where we limited our chart to a half pie chart – we set the startAngle = -3.1415926536 (-180°, -π, 9 o’clock) and endAngle = 0 (0°, 0 rad, or 3 o’clock).
<h3 align="center">Gauge (startAngle: pi, endAngle: 0)</h3>
<div id="example3"></div>
<script>
const chart = new ZoomCharts.PieChart({
container: "example3",
pie: {
startAngle: -3.1415926536,
endAngle: 0
},
data: {
preloaded: {
subvalues: [
{
value: 3906,
name: "Volkswagen",
subvalues: [
{ value: 154, name: "Golf" },
{ value: 867, name: "Tiguan" },
{ value: 232, name: "Polo" },
{ value: 1032, name: "Passat" },
{ value: 694, name: "ID.4" },
{ value: 927, name: "T-Roc" }
]
},
{
value: 2221,
name: "Peugeot",
subvalues: [
{ value: 102, name: "208" },
{ value: 778, name: "2008" },
{ value: 269, name: "308" },
{ value: 530, name: "3008" },
{ value: 542, name: "5008" }
]
},
{
value: 2326,
name: "Renault",
subvalues: [
{ value: 257, name: "Clio" },
{ value: 351, name: "Captur" },
{ value: 549, name: "Megane" },
{ value: 235, name: "Austral" },
{ value: 765, name: "Arkana" },
{ value: 169, name: "Twingo" }
]
},
{
value: 3294,
name: "BMW",
subvalues: [
{ value: 346, name: "3 Series" },
{ value: 479, name: "X1" },
{ value: 862, name: "1 Series" },
{ value: 626, name: "X3" },
{ value: 652, name: "5 Series" },
{ value: 329, name: "X5" }
]
},
{
value: 3110,
name: "Mercedes-Benz",
subvalues: [
{ value: 496, name: "A-Class" },
{ value: 667, name: "C-Class" },
{ value: 450, name: "GLA" },
{ value: 314, name: "EQA" },
{ value: 640, name: "GLC" },
{ value: 543, name: "EQB" }
]
},
{
value: 1587,
name: "Audi",
subvalues: [
{ value: 273, name: "A3" },
{ value: 111, name: "Q3" },
{ value: 665, name: "A4" },
{ value: 245, name: "Q2" },
{ value: 183, name: "Q5" },
{ value: 110, name: "A6" }
]
},
{
value: 2144,
name: "Skoda",
subvalues: [
{ value: 132, name: "Octavia" },
{ value: 992, name: "Fabia" },
{ value: 111, name: "Karoq" },
{ value: 181, name: "Superb" },
{ value: 104, name: "Kamiq" },
{ value: 624, name: "Enyaq" }
]
},
{
value: 1794,
name: "Fiat",
subvalues: [
{ value: 333, name: "500" },
{ value: 346, name: "Panda" },
{ value: 369, name: "Tipo" },
{ value: 327, name: "600e" },
{ value: 419, name: "Doblo" }
]
},
{
value: 3937,
name: "Dacia",
subvalues: [
{ value: 1169, name: "Sandero" },
{ value: 576, name: "Duster" },
{ value: 622, name: "Jogger" },
{ value: 988, name: "Spring" },
{ value: 582, name: "Lodgy" }
]
},
{
value: 2900,
name: "Toyota",
subvalues: [
{ value: 124, name: "Yaris" },
{ value: 1027, name: "Corolla" },
{ value: 427, name: "C-HR" },
{ value: 171, name: "RAV4" },
{ value: 1151, name: "Aygo X" }
]
},
{
value: 1211,
name: "Honda",
subvalues: [
{ value: 220, name: "Civic" },
{ value: 321, name: "CR-V" },
{ value: 257, name: "HR-V" },
{ value: 181, name: "Jazz" },
{ value: 232, name: "e:Ny1" }
]
},
{
value: 1351,
name: "Hyundai",
subvalues: [
{ value: 89, name: "i10" },
{ value: 90, name: "i20" },
{ value: 229, name: "i30" },
{ value: 457, name: "Tucson" },
{ value: 97, name: "Kona" },
{ value: 389, name: "Bayon" }
]
},
{
value: 1639,
name: "Kia",
subvalues: [
{ value: 423, name: "Ceed" },
{ value: 375, name: "Sportage" },
{ value: 347, name: "Picanto" },
{ value: 211, name: "Stonic" },
{ value: 283, name: "Niro" }
]
},
{
value: 1632,
name: "Opel",
subvalues: [
{ value: 289, name: "Corsa" },
{ value: 369, name: "Astra" },
{ value: 398, name: "Mokka" },
{ value: 190, name: "Crossland" },
{ value: 386, name: "Grandland" }
]
},
{
value: 1354,
name: "Seat",
subvalues: [
{ value: 87, name: "Ibiza" },
{ value: 450, name: "Leon" },
{ value: 475, name: "Arona" },
{ value: 177, name: "Ateca" },
{ value: 165, name: "Tarraco" }
]
}
]
},
sortField: "value"
},
});
</script>
One of the most popular features of our PieChart component and its related Donut PRO and Pie PRO custom visuals for Power BI is the interactive ‘Others’ slice, which was created to solve one of the biggest issues with pie charts as a data visualization type.
When there are too many slices on a pie chart (especially if they are small), the chart may become difficult to read. But, if you combine them into an “Others” category, they become hidden from the chart. How to hide the small slices but give the user a way to access them when needed?
With the ‘Others’ slice, you can combine smaller slices into one and declutter the chart, while allowing the user to see exactly what categories are there. Similar to previously discussed drill down, clicking the ‘Others’ slice will reveal all categories that are within it and see the slices that were hidden from the initial view.
The ‘Others’ slice can be configured under interaction object using others. It is already enabled by default, and if your chart has more than 15 slices, it will show only the first fifteen. You can disable it with enabled: false if you wish.
In our car sales pie chart example, we have exactly fifteen slices for the car brands, which means that the ‘Others’ slice is not triggered. What if we want to declutter the chart and show only the biggest car brands? If we use maxSlicesVisible: 8, only the top 8 slices will be displayed, with the rest combined into ‘Others’.
<h3 align="center">'Others' Slice Enabled</h3>
<div id="example4"></div>
<script>
const chart = new ZoomCharts.PieChart({
container: "example4",
interaction: {
others: {
enabled: true,
maxSlicesVisible: 8
},
},
data: {
preloaded: {
subvalues: [
{
value: 3906,
name: "Volkswagen",
subvalues: [
{ value: 154, name: "Golf" },
{ value: 867, name: "Tiguan" },
{ value: 232, name: "Polo" },
{ value: 1032, name: "Passat" },
{ value: 694, name: "ID.4" },
{ value: 927, name: "T-Roc" }
]
},
{
value: 2221,
name: "Peugeot",
subvalues: [
{ value: 102, name: "208" },
{ value: 778, name: "2008" },
{ value: 269, name: "308" },
{ value: 530, name: "3008" },
{ value: 542, name: "5008" }
]
},
{
value: 2326,
name: "Renault",
subvalues: [
{ value: 257, name: "Clio" },
{ value: 351, name: "Captur" },
{ value: 549, name: "Megane" },
{ value: 235, name: "Austral" },
{ value: 765, name: "Arkana" },
{ value: 169, name: "Twingo" }
]
},
{
value: 3294,
name: "BMW",
subvalues: [
{ value: 346, name: "3 Series" },
{ value: 479, name: "X1" },
{ value: 862, name: "1 Series" },
{ value: 626, name: "X3" },
{ value: 652, name: "5 Series" },
{ value: 329, name: "X5" }
]
},
{
value: 3110,
name: "Mercedes-Benz",
subvalues: [
{ value: 496, name: "A-Class" },
{ value: 667, name: "C-Class" },
{ value: 450, name: "GLA" },
{ value: 314, name: "EQA" },
{ value: 640, name: "GLC" },
{ value: 543, name: "EQB" }
]
},
{
value: 1587,
name: "Audi",
subvalues: [
{ value: 273, name: "A3" },
{ value: 111, name: "Q3" },
{ value: 665, name: "A4" },
{ value: 245, name: "Q2" },
{ value: 183, name: "Q5" },
{ value: 110, name: "A6" }
]
},
{
value: 2144,
name: "Skoda",
subvalues: [
{ value: 132, name: "Octavia" },
{ value: 992, name: "Fabia" },
{ value: 111, name: "Karoq" },
{ value: 181, name: "Superb" },
{ value: 104, name: "Kamiq" },
{ value: 624, name: "Enyaq" }
]
},
{
value: 1794,
name: "Fiat",
subvalues: [
{ value: 333, name: "500" },
{ value: 346, name: "Panda" },
{ value: 369, name: "Tipo" },
{ value: 327, name: "600e" },
{ value: 419, name: "Doblo" }
]
},
{
value: 3937,
name: "Dacia",
subvalues: [
{ value: 1169, name: "Sandero" },
{ value: 576, name: "Duster" },
{ value: 622, name: "Jogger" },
{ value: 988, name: "Spring" },
{ value: 582, name: "Lodgy" }
]
},
{
value: 2900,
name: "Toyota",
subvalues: [
{ value: 124, name: "Yaris" },
{ value: 1027, name: "Corolla" },
{ value: 427, name: "C-HR" },
{ value: 171, name: "RAV4" },
{ value: 1151, name: "Aygo X" }
]
},
{
value: 1211,
name: "Honda",
subvalues: [
{ value: 220, name: "Civic" },
{ value: 321, name: "CR-V" },
{ value: 257, name: "HR-V" },
{ value: 181, name: "Jazz" },
{ value: 232, name: "e:Ny1" }
]
},
{
value: 1351,
name: "Hyundai",
subvalues: [
{ value: 89, name: "i10" },
{ value: 90, name: "i20" },
{ value: 229, name: "i30" },
{ value: 457, name: "Tucson" },
{ value: 97, name: "Kona" },
{ value: 389, name: "Bayon" }
]
},
{
value: 1639,
name: "Kia",
subvalues: [
{ value: 423, name: "Ceed" },
{ value: 375, name: "Sportage" },
{ value: 347, name: "Picanto" },
{ value: 211, name: "Stonic" },
{ value: 283, name: "Niro" }
]
},
{
value: 1632,
name: "Opel",
subvalues: [
{ value: 289, name: "Corsa" },
{ value: 369, name: "Astra" },
{ value: 398, name: "Mokka" },
{ value: 190, name: "Crossland" },
{ value: 386, name: "Grandland" }
]
},
{
value: 1354,
name: "Seat",
subvalues: [
{ value: 87, name: "Ibiza" },
{ value: 450, name: "Leon" },
{ value: 475, name: "Arona" },
{ value: 177, name: "Ateca" },
{ value: 165, name: "Tarraco" }
]
}
]
},
sortField: "value"
},
});
</script>
By default, PieChart will use the ZoomCharts default theme to assign colors to each slice. This means that the slices will be colorful and contrast from each other to ensure good readability. However, if you wish to customize appearance and better integrate the chart in your project’s design, there are multiple ways to do that.
The pie object, which we already mentioned in a previous section, can also be used to apply color rules to the entire chart at once. Use style within pie to adjust how the colors are applied to the pie chart (unless overridden by slice-specific settings):
Here’s a comparison of how the three colorDistribution modes work two scenarios – when the sliceColor has multiple colors (in this case, an array of hex codes), and when there’s just one color available (here – “green”).
As you can see, list setting works best when you have manually provided a suitable amount of slice colors – with just one color available, it tried to provide colors for other slices on its own, and it may not always produce the results you want. For such cases, the gradient mode is really useful as a quick way to create a visually pleasing color palette.
However, these settings will be used as defaults across all categories – if you want to have full control over specific slices, you can use the slice object. There, you can customize settings like fill color and gradient, outline color, dashing and thickness, labels and more – for normal slices, ‘Others’ and ‘Previous’, and in selected or hovered states.
What if you want to apply a specific color to each slice? In our car sales example, it would make sense to assign colors based on the car brands – green for Škoda, yellow for Renault, dark blue for VW and so on. One way to do that would be creating a styleFunction, whereas another method is by supplying style rules directly in data.
For each slice object in data, you can also provide a style object which may contain properties like fillcolor, icon, label, url, and others – they will be applied only to that specific slice. Basically, it achieves the same result as giving these values in slice object, but since they are provided within data, this means that you can update them in your data and all visuals that reference them will instantly reflect the changes. See the full list of available properties here.
In this example, we provided each manufacturer’s brand color as style: {fillColor: “#EXAMPLE”}, and their respective slices use that color. You can also provide color values as simple color names (“red”, “blue”, “yellow”) or RGB/RGBA codes (“rgb(255, 255, 255, 1)”).
<h3 align="center">Slice fillColor referenced from 'style' in data</h3>
<div id="example5"></div>
<script>
const chart = new ZoomCharts.PieChart({
container: "example5",
data: {
preloaded: {
subvalues: [
{
value: 3906,
name: "Volkswagen",
style: { fillColor: "#001e50" },
subvalues: [
{ value: 154, name: "Golf" },
{ value: 867, name: "Tiguan" },
{ value: 232, name: "Polo" },
{ value: 1032, name: "Passat" },
{ value: 694, name: "ID.4" },
{ value: 927, name: "T-Roc" }
]
},
{
value: 2221,
name: "Peugeot",
style: { fillColor: "#003478" },
subvalues: [
{ value: 102, name: "208" },
{ value: 778, name: "2008" },
{ value: 269, name: "308" },
{ value: 530, name: "3008" },
{ value: 542, name: "5008" }
]
},
{
value: 2326,
name: "Renault",
style: { fillColor: "#f7cb15" },
subvalues: [
{ value: 257, name: "Clio" },
{ value: 351, name: "Captur" },
{ value: 549, name: "Megane" },
{ value: 235, name: "Austral" },
{ value: 765, name: "Arkana" },
{ value: 169, name: "Twingo" }
]
},
{
value: 3294,
name: "BMW",
style: { fillColor: "#2e9fff" },
subvalues: [
{ value: 346, name: "3 Series" },
{ value: 479, name: "X1" },
{ value: 862, name: "1 Series" },
{ value: 626, name: "X3" },
{ value: 652, name: "5 Series" },
{ value: 329, name: "X5" }
]
},
{
value: 3110,
name: "Mercedes-Benz",
style: { fillColor: "#222222" },
subvalues: [
{ value: 496, name: "A-Class" },
{ value: 667, name: "C-Class" },
{ value: 450, name: "GLA" },
{ value: 314, name: "EQA" },
{ value: 640, name: "GLC" },
{ value: 543, name: "EQB" }
]
},
{
value: 1587,
name: "Audi",
style: { fillColor: "#c0c0c0" },
subvalues: [
{ value: 273, name: "A3" },
{ value: 111, name: "Q3" },
{ value: 665, name: "A4" },
{ value: 245, name: "Q2" },
{ value: 183, name: "Q5" },
{ value: 110, name: "A6" }
]
},
{
value: 2144,
name: "Skoda",
style: { fillColor: "#007c30" },
subvalues: [
{ value: 132, name: "Octavia" },
{ value: 992, name: "Fabia" },
{ value: 111, name: "Karoq" },
{ value: 181, name: "Superb" },
{ value: 104, name: "Kamiq" },
{ value: 624, name: "Enyaq" }
]
},
{
value: 1794,
name: "Fiat",
style: { fillColor: "#941c2f" },
subvalues: [
{ value: 333, name: "500" },
{ value: 346, name: "Panda" },
{ value: 369, name: "Tipo" },
{ value: 327, name: "600e" },
{ value: 419, name: "Doblo" }
]
},
{
value: 3937,
name: "Dacia",
style: { fillColor: "#003279" },
subvalues: [
{ value: 1169, name: "Sandero" },
{ value: 576, name: "Duster" },
{ value: 622, name: "Jogger" },
{ value: 988, name: "Spring" },
{ value: 582, name: "Lodgy" }
]
},
{
value: 2900,
name: "Toyota",
style: { fillColor: "#eb0a1e" },
subvalues: [
{ value: 124, name: "Yaris" },
{ value: 1027, name: "Corolla" },
{ value: 427, name: "C-HR" },
{ value: 171, name: "RAV4" },
{ value: 1151, name: "Aygo X" }
]
},
{
value: 1211,
name: "Honda",
style: { fillColor: "#da215d" },
subvalues: [
{ value: 220, name: "Civic" },
{ value: 321, name: "CR-V" },
{ value: 257, name: "HR-V" },
{ value: 181, name: "Jazz" },
{ value: 232, name: "e:Ny1" }
]
},
{
value: 1351,
name: "Hyundai",
style: { fillColor: "#002c5f" },
subvalues: [
{ value: 89, name: "i10" },
{ value: 90, name: "i20" },
{ value: 229, name: "i30" },
{ value: 457, name: "Tucson" },
{ value: 97, name: "Kona" },
{ value: 389, name: "Bayon" }
]
},
{
value: 1639,
name: "Kia",
style: { fillColor: "#c4172c" },
subvalues: [
{ value: 423, name: "Ceed" },
{ value: 375, name: "Sportage" },
{ value: 347, name: "Picanto" },
{ value: 211, name: "Stonic" },
{ value: 283, name: "Niro" }
]
},
{
value: 1632,
name: "Opel",
style: { fillColor: "#ffd700" },
subvalues: [
{ value: 289, name: "Corsa" },
{ value: 369, name: "Astra" },
{ value: 398, name: "Mokka" },
{ value: 190, name: "Crossland" },
{ value: 386, name: "Grandland" }
]
},
{
value: 1354,
name: "Seat",
style: { fillColor: "#e50012" },
subvalues: [
{ value: 87, name: "Ibiza" },
{ value: 450, name: "Leon" },
{ value: 475, name: "Arona" },
{ value: 177, name: "Ateca" },
{ value: 165, name: "Tarraco" }
]
}
]
},
sortField: "value"
}
});
</script>
Manually providing color values isn’t the only way to stylize your pie chart. You can use the theme property to apply a preset – convenient if you want to unify styling across multiple visuals in your project. By default, ZoomCharts flat theme will be used, but you can reference your own configuration object, or choose any of our prebuilt themes. For example, this is the same car sales chart, but with the dark theme:
<h3 align="center">Theme: Dark</h3>
<div id="example-dark"></div>
<script>
const chart = new ZoomCharts.PieChart({
container: "example-dark",
theme: PieChart.themes.dark,
data: {
preloaded: {
subvalues: [
{
value: 3906,
name: "Volkswagen",
subvalues: [
{ value: 154, name: "Golf" },
{ value: 867, name: "Tiguan" },
{ value: 232, name: "Polo" },
{ value: 1032, name: "Passat" },
{ value: 694, name: "ID.4" },
{ value: 927, name: "T-Roc" }
]
},
{
value: 2221,
name: "Peugeot",
subvalues: [
{ value: 102, name: "208" },
{ value: 778, name: "2008" },
{ value: 269, name: "308" },
{ value: 530, name: "3008" },
{ value: 542, name: "5008" }
]
},
{
value: 2326,
name: "Renault",
subvalues: [
{ value: 257, name: "Clio" },
{ value: 351, name: "Captur" },
{ value: 549, name: "Megane" },
{ value: 235, name: "Austral" },
{ value: 765, name: "Arkana" },
{ value: 169, name: "Twingo" }
]
},
{
value: 3294,
name: "BMW",
subvalues: [
{ value: 346, name: "3 Series" },
{ value: 479, name: "X1" },
{ value: 862, name: "1 Series" },
{ value: 626, name: "X3" },
{ value: 652, name: "5 Series" },
{ value: 329, name: "X5" }
]
},
{
value: 3110,
name: "Mercedes-Benz",
subvalues: [
{ value: 496, name: "A-Class" },
{ value: 667, name: "C-Class" },
{ value: 450, name: "GLA" },
{ value: 314, name: "EQA" },
{ value: 640, name: "GLC" },
{ value: 543, name: "EQB" }
]
},
{
value: 1587,
name: "Audi",
subvalues: [
{ value: 273, name: "A3" },
{ value: 111, name: "Q3" },
{ value: 665, name: "A4" },
{ value: 245, name: "Q2" },
{ value: 183, name: "Q5" },
{ value: 110, name: "A6" }
]
},
{
value: 2144,
name: "Skoda",
subvalues: [
{ value: 132, name: "Octavia" },
{ value: 992, name: "Fabia" },
{ value: 111, name: "Karoq" },
{ value: 181, name: "Superb" },
{ value: 104, name: "Kamiq" },
{ value: 624, name: "Enyaq" }
]
},
{
value: 1794,
name: "Fiat",
subvalues: [
{ value: 333, name: "500" },
{ value: 346, name: "Panda" },
{ value: 369, name: "Tipo" },
{ value: 327, name: "600e" },
{ value: 419, name: "Doblo" }
]
},
{
value: 3937,
name: "Dacia",
subvalues: [
{ value: 1169, name: "Sandero" },
{ value: 576, name: "Duster" },
{ value: 622, name: "Jogger" },
{ value: 988, name: "Spring" },
{ value: 582, name: "Lodgy" }
]
},
{
value: 2900,
name: "Toyota",
subvalues: [
{ value: 124, name: "Yaris" },
{ value: 1027, name: "Corolla" },
{ value: 427, name: "C-HR" },
{ value: 171, name: "RAV4" },
{ value: 1151, name: "Aygo X" }
]
},
{
value: 1211,
name: "Honda",
subvalues: [
{ value: 220, name: "Civic" },
{ value: 321, name: "CR-V" },
{ value: 257, name: "HR-V" },
{ value: 181, name: "Jazz" },
{ value: 232, name: "e:Ny1" }
]
},
{
value: 1351,
name: "Hyundai",
subvalues: [
{ value: 89, name: "i10" },
{ value: 90, name: "i20" },
{ value: 229, name: "i30" },
{ value: 457, name: "Tucson" },
{ value: 97, name: "Kona" },
{ value: 389, name: "Bayon" }
]
},
{
value: 1639,
name: "Kia",
subvalues: [
{ value: 423, name: "Ceed" },
{ value: 375, name: "Sportage" },
{ value: 347, name: "Picanto" },
{ value: 211, name: "Stonic" },
{ value: 283, name: "Niro" }
]
},
{
value: 1632,
name: "Opel",
subvalues: [
{ value: 289, name: "Corsa" },
{ value: 369, name: "Astra" },
{ value: 398, name: "Mokka" },
{ value: 190, name: "Crossland" },
{ value: 386, name: "Grandland" }
]
},
{
value: 1354,
name: "Seat",
subvalues: [
{ value: 87, name: "Ibiza" },
{ value: 450, name: "Leon" },
{ value: 475, name: "Arona" },
{ value: 177, name: "Ateca" },
{ value: 165, name: "Tarraco" }
]
}
]
},
sortField: "value"
}
});
</script>
By default, each slice will show a label outside of the slice that is connected with a thin line. It will display the category name and the percentage. The label settings are governed by the labels object, with some of the properties being:
Click here to visit an example from our Gallery that showcases different label types – toggle between them to see the difference.
For additional customization, you can use label and insideLabel objects under slice->style, with things like alignment, background style (fill color, outline, etc.), text style (font, color, size etc.), margins and even images. You can also modify the label content with text property, for example, to display a suffix or prefix, or reference a value from your data.
In ZoomCharts JavaScript visualizations, legends are not just helpful visual aids for the user, but also a crucial navigation element – clicking them can drill down or select the slice (depending on your interaction settings; the default mode is “drilldown”).
You can configure them in legend object; use enabled: true to show the legend items (by default, they are disabled). Here’s what they will look like with default settings:
<h3 align="center">Legend enabled (default settings)</h3>
<div id="example6"></div>
<script>
const chart = new ZoomCharts.PieChart({
container: "example6",
labels: {enabled: false},
legend: {enabled: true},
data: {
preloaded: {
subvalues: [
{
value: 3906,
name: "Volkswagen",
subvalues: [
{ value: 154, name: "Golf" },
{ value: 867, name: "Tiguan" },
{ value: 232, name: "Polo" },
{ value: 1032, name: "Passat" },
{ value: 694, name: "ID.4" },
{ value: 927, name: "T-Roc" }
]
},
{
value: 2221,
name: "Peugeot",
subvalues: [
{ value: 102, name: "208" },
{ value: 778, name: "2008" },
{ value: 269, name: "308" },
{ value: 530, name: "3008" },
{ value: 542, name: "5008" }
]
},
{
value: 2326,
name: "Renault",
subvalues: [
{ value: 257, name: "Clio" },
{ value: 351, name: "Captur" },
{ value: 549, name: "Megane" },
{ value: 235, name: "Austral" },
{ value: 765, name: "Arkana" },
{ value: 169, name: "Twingo" }
]
},
{
value: 3294,
name: "BMW",
subvalues: [
{ value: 346, name: "3 Series" },
{ value: 479, name: "X1" },
{ value: 862, name: "1 Series" },
{ value: 626, name: "X3" },
{ value: 652, name: "5 Series" },
{ value: 329, name: "X5" }
]
},
{
value: 3110,
name: "Mercedes-Benz",
subvalues: [
{ value: 496, name: "A-Class" },
{ value: 667, name: "C-Class" },
{ value: 450, name: "GLA" },
{ value: 314, name: "EQA" },
{ value: 640, name: "GLC" },
{ value: 543, name: "EQB" }
]
},
{
value: 1587,
name: "Audi",
subvalues: [
{ value: 273, name: "A3" },
{ value: 111, name: "Q3" },
{ value: 665, name: "A4" },
{ value: 245, name: "Q2" },
{ value: 183, name: "Q5" },
{ value: 110, name: "A6" }
]
},
{
value: 2144,
name: "Skoda",
subvalues: [
{ value: 132, name: "Octavia" },
{ value: 992, name: "Fabia" },
{ value: 111, name: "Karoq" },
{ value: 181, name: "Superb" },
{ value: 104, name: "Kamiq" },
{ value: 624, name: "Enyaq" }
]
},
{
value: 1794,
name: "Fiat",
subvalues: [
{ value: 333, name: "500" },
{ value: 346, name: "Panda" },
{ value: 369, name: "Tipo" },
{ value: 327, name: "600e" },
{ value: 419, name: "Doblo" }
]
},
{
value: 3937,
name: "Dacia",
subvalues: [
{ value: 1169, name: "Sandero" },
{ value: 576, name: "Duster" },
{ value: 622, name: "Jogger" },
{ value: 988, name: "Spring" },
{ value: 582, name: "Lodgy" }
]
},
{
value: 2900,
name: "Toyota",
subvalues: [
{ value: 124, name: "Yaris" },
{ value: 1027, name: "Corolla" },
{ value: 427, name: "C-HR" },
{ value: 171, name: "RAV4" },
{ value: 1151, name: "Aygo X" }
]
},
{
value: 1211,
name: "Honda",
subvalues: [
{ value: 220, name: "Civic" },
{ value: 321, name: "CR-V" },
{ value: 257, name: "HR-V" },
{ value: 181, name: "Jazz" },
{ value: 232, name: "e:Ny1" }
]
},
{
value: 1351,
name: "Hyundai",
subvalues: [
{ value: 89, name: "i10" },
{ value: 90, name: "i20" },
{ value: 229, name: "i30" },
{ value: 457, name: "Tucson" },
{ value: 97, name: "Kona" },
{ value: 389, name: "Bayon" }
]
},
{
value: 1639,
name: "Kia",
subvalues: [
{ value: 423, name: "Ceed" },
{ value: 375, name: "Sportage" },
{ value: 347, name: "Picanto" },
{ value: 211, name: "Stonic" },
{ value: 283, name: "Niro" }
]
},
{
value: 1632,
name: "Opel",
subvalues: [
{ value: 289, name: "Corsa" },
{ value: 369, name: "Astra" },
{ value: 398, name: "Mokka" },
{ value: 190, name: "Crossland" },
{ value: 386, name: "Grandland" }
]
},
{
value: 1354,
name: "Seat",
subvalues: [
{ value: 87, name: "Ibiza" },
{ value: 450, name: "Leon" },
{ value: 475, name: "Arona" },
{ value: 177, name: "Ateca" },
{ value: 165, name: "Tarraco" }
]
}
]
},
sortField: "value"
},
pie: {
innerRadius: 0
}
});
</script>
There are various properties pertaining to their style, placement, alignment, and behavior. You can see the full list in the documentation page, but the main ones include:
In this example, we used inline display mode, placed them on the bottom of the chart, limited height, enabled scroll buttons, and customized font and markers. We used Monserrat from the Google Fonts library, which we referenced in the HTML.
<head>
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Montserrat:ital,wght@0,100..900;1,100..900&display=swap" rel="stylesheet">
</head>
<h3 align="center">Customized legends</h3>
<p align="center">inline mode, scroll buttons, bottom placement, Montserrat 14px font, circle markers, etc.</p>
<div id="example7"></div>
<script>
const chart = new ZoomCharts.PieChart({
container: "example7",
labels: {
enabled: false
},
legend: {
enabled: true,
displayMode: "inline",
height: 25,
padding: 3,
panel: {
align: "left",
side: "bottom"
},
text: {
font: "14px Montserrat",
fillColor: "grey"
},
marker: {
shape: "circle",
lineColor: "grey"
},
scrollButtons: {
style: {
fillColor: "lightgrey",
hoverFillColor: "grey"
}
}
},
data: {
preloaded: {
subvalues: [
{
value: 3906,
name: "Volkswagen",
subvalues: [
{ value: 154, name: "Golf" },
{ value: 867, name: "Tiguan" },
{ value: 232, name: "Polo" },
{ value: 1032, name: "Passat" },
{ value: 694, name: "ID.4" },
{ value: 927, name: "T-Roc" }
]
},
{
value: 2221,
name: "Peugeot",
subvalues: [
{ value: 102, name: "208" },
{ value: 778, name: "2008" },
{ value: 269, name: "308" },
{ value: 530, name: "3008" },
{ value: 542, name: "5008" }
]
},
{
value: 2326,
name: "Renault",
subvalues: [
{ value: 257, name: "Clio" },
{ value: 351, name: "Captur" },
{ value: 549, name: "Megane" },
{ value: 235, name: "Austral" },
{ value: 765, name: "Arkana" },
{ value: 169, name: "Twingo" }
]
},
{
value: 3294,
name: "BMW",
subvalues: [
{ value: 346, name: "3 Series" },
{ value: 479, name: "X1" },
{ value: 862, name: "1 Series" },
{ value: 626, name: "X3" },
{ value: 652, name: "5 Series" },
{ value: 329, name: "X5" }
]
},
{
value: 3110,
name: "Mercedes-Benz",
subvalues: [
{ value: 496, name: "A-Class" },
{ value: 667, name: "C-Class" },
{ value: 450, name: "GLA" },
{ value: 314, name: "EQA" },
{ value: 640, name: "GLC" },
{ value: 543, name: "EQB" }
]
},
{
value: 1587,
name: "Audi",
subvalues: [
{ value: 273, name: "A3" },
{ value: 111, name: "Q3" },
{ value: 665, name: "A4" },
{ value: 245, name: "Q2" },
{ value: 183, name: "Q5" },
{ value: 110, name: "A6" }
]
},
{
value: 2144,
name: "Skoda",
subvalues: [
{ value: 132, name: "Octavia" },
{ value: 992, name: "Fabia" },
{ value: 111, name: "Karoq" },
{ value: 181, name: "Superb" },
{ value: 104, name: "Kamiq" },
{ value: 624, name: "Enyaq" }
]
},
{
value: 1794,
name: "Fiat",
subvalues: [
{ value: 333, name: "500" },
{ value: 346, name: "Panda" },
{ value: 369, name: "Tipo" },
{ value: 327, name: "600e" },
{ value: 419, name: "Doblo" }
]
},
{
value: 3937,
name: "Dacia",
subvalues: [
{ value: 1169, name: "Sandero" },
{ value: 576, name: "Duster" },
{ value: 622, name: "Jogger" },
{ value: 988, name: "Spring" },
{ value: 582, name: "Lodgy" }
]
},
{
value: 2900,
name: "Toyota",
subvalues: [
{ value: 124, name: "Yaris" },
{ value: 1027, name: "Corolla" },
{ value: 427, name: "C-HR" },
{ value: 171, name: "RAV4" },
{ value: 1151, name: "Aygo X" }
]
},
{
value: 1211,
name: "Honda",
subvalues: [
{ value: 220, name: "Civic" },
{ value: 321, name: "CR-V" },
{ value: 257, name: "HR-V" },
{ value: 181, name: "Jazz" },
{ value: 232, name: "e:Ny1" }
]
},
{
value: 1351,
name: "Hyundai",
subvalues: [
{ value: 89, name: "i10" },
{ value: 90, name: "i20" },
{ value: 229, name: "i30" },
{ value: 457, name: "Tucson" },
{ value: 97, name: "Kona" },
{ value: 389, name: "Bayon" }
]
},
{
value: 1639,
name: "Kia",
subvalues: [
{ value: 423, name: "Ceed" },
{ value: 375, name: "Sportage" },
{ value: 347, name: "Picanto" },
{ value: 211, name: "Stonic" },
{ value: 283, name: "Niro" }
]
},
{
value: 1632,
name: "Opel",
subvalues: [
{ value: 289, name: "Corsa" },
{ value: 369, name: "Astra" },
{ value: 398, name: "Mokka" },
{ value: 190, name: "Crossland" },
{ value: 386, name: "Grandland" }
]
},
{
value: 1354,
name: "Seat",
subvalues: [
{ value: 87, name: "Ibiza" },
{ value: 450, name: "Leon" },
{ value: 475, name: "Arona" },
{ value: 177, name: "Ateca" },
{ value: 165, name: "Tarraco" }
]
}
]
},
sortField: "value"
}
});
</script>
We just scratched the surface of all the configuration options available in ZoomCharts PieChart. For most use cases, the out-of-the-box experience will provide all that is needed to create slick and interactive JavaScript data visualizations, but if you want to create a chart that is truly yours, feel free to explore the available properties in the documentation.
We also recommend exploring the Gallery to see various different configurations of our JavaScript charts in action, with code and live demos. Some highlights:
Start creating your own charts with the free trial – you will get full access to all five ZoomCharts components (PieChart, FacetChart, TimeChart, NetChart, GeoChart) for 30 days!
Subscribe to our newsletter and be the first to read our latest articles and expert data visualization tips!