Flower Chart
A radar column chart where the columns fill only the middle of each slice, so they stand apart like petals. Here, two coffees scored on eight tasting notes.
About this chart
When a flower chart works
A flower chart compares two or three profiles across the same criteria, petal by petal. Unlike a filled radar, the petals don’t cover each other, so every score stays visible. It reads best when the scores share one scale, here 0 to 10.
Good for
- Tasting notes, reviews and ratings
- Two products or players side by side
- Profiles where every criterion counts on its own
Think twice when
- More than three profiles: the petals get thin
- Criteria on different scales
- Exact differences: a grouped bar chart lines them up
For developers
Get the code.
Built with amCharts 5, a JavaScript library. The JavaScript includes your theme and renderer (canvas or SVG); the JSON also follows the changes you make with the controls.
For projects that use npm:
How it reads:
npm install @amcharts/amcharts5. See Getting started.
The same chart as a JSON config. Chart Maker reads and writes this format, the library's JSON parser turns it into a chart, and the <am5-chart> element puts it on a page with no code.How it reads:
"type" is the class to create and "settings" what you would pass to its new() in code; "properties" fill in its parts, lists such as series and axes or templates such as columns.template; "refs" holds objects used in more than one place ("#series-0" stands for the one named series-0); a string starting with "@" takes a value from another object, such as "@series.get('fill')".
A complete page. Save it as an .html file and open it in a browser.
Paste this into an AI coding assistant to build the chart from scratch. More in amCharts & AI.
// Create root element
// https://docs.amcharts.com/v5/getting-started/#root-element
var root = am5.Root.new("chartdiv");
// Set themes
// https://docs.amcharts.com/v5/concepts/themes/
root.setThemes([
am5themes_Animated.new(root),
am5themes_Responsive.new(root)
]);
// Data: two coffees scored from 0 to 10 on eight tasting notes (sample data)
// https://docs.amcharts.com/v5/charts/radar-chart/#setting-data
var data = [{
note: "Acidity",
light: 8,
dark: 3
}, {
note: "Fruit",
light: 8,
dark: 2
}, {
note: "Floral",
light: 7,
dark: 1
}, {
note: "Sweetness",
light: 6,
dark: 5
}, {
note: "Body",
light: 4,
dark: 8
}, {
note: "Chocolate",
light: 3,
dark: 8
}, {
note: "Nutty",
light: 4,
dark: 6
}, {
note: "Bitterness",
light: 2,
dark: 8
}];
// Create chart
// https://docs.amcharts.com/v5/charts/radar-chart/
var chart = root.container.children.push(
am5radar.RadarChart.new(root, {
panX: false, // no panning: a drag zooms in instead
// a vertical layout puts the legend under the chart
layout: root.verticalLayout,
panY: false,
wheelX: "panX", // a horizontal wheel or trackpad swipe pans...
wheelY: "zoomX" // ...and the vertical wheel zooms in on the notes
})
);
// each new series moves three colors on in the palette, so the two coffees don't take look-alike neighbors
chart.get("colors").set("step", 3);
// Add cursor
// https://docs.amcharts.com/v5/charts/radar-chart/#cursor
var cursor = chart.set("cursor", am5radar.RadarCursor.new(root, {
behavior: "zoomX" // drag around the circle to zoom in on a few notes
}));
cursor.lineY.set("visible", false); // no ring at the pointer's distance, just the line from the center
// Create axes and their renderers
// https://docs.amcharts.com/v5/charts/radar-chart/#adding-axes
// The columns fill only the middle of each slice (from 20% to 80%), so they stand apart like petals
var xRenderer = am5radar.AxisRendererCircular.new(root, {
cellStartLocation: 0.2,
cellEndLocation: 0.8,
minGridDistance: 20 // at least 20px between labels around the circle
});
xRenderer.labels.template.setAll({
radius: 10 // the labels 10px outside the circle
});
var xAxis = chart.xAxes.push(
am5xy.CategoryAxis.new(root, {
maxDeviation: 0, // no panning past the first or last note
categoryField: "note",
renderer: xRenderer,
tooltip: am5.Tooltip.new(root, {}) // shows the hovered note
})
);
xAxis.data.setAll(data);
var yAxis = chart.yAxes.push(
am5xy.ValueAxis.new(root, {
min: 0, // the scale runs from 0...
max: 10, // ...to 10
// the scale stays exactly 0 to 10 instead of being rounded out
strictMinMax: true,
renderer: am5radar.AxisRendererRadial.new(root, {})
})
);
// Create series: one per coffee, side by side in each slice
// https://docs.amcharts.com/v5/charts/radar-chart/#adding-series
function createSeries(name, field) {
var series = chart.series.push(
am5radar.RadarColumnSeries.new(root, {
name: name,
xAxis: xAxis,
yAxis: yAxis,
valueYField: field,
categoryXField: "note"
})
);
series.columns.template.setAll({
tooltipText: "{name}: {valueY} of 10", // as "Light roast: 8 of 10"
width: am5.percent(100) // the two columns together fill the slice's middle, with no gap
});
series.data.setAll(data);
series.appear(1000);
}
createSeries("Light roast", "light");
createSeries("Dark roast", "dark");
// Add legend: click a coffee to hide it
// https://docs.amcharts.com/v5/charts/radar-chart/#legend
var legend = chart.children.push(am5.Legend.new(root, {
centerX: am5.p50, // the legend's middle...
x: am5.p50 // ...at the middle of the chart
}));
legend.data.setAll(chart.series.values);
// Animate chart
// https://docs.amcharts.com/v5/concepts/animations/#initial-animation
chart.appear(1000, 100);
{
"type": "RadarChart",
"settings": {
"panX": false,
"layout": {
"type": "VerticalLayout"
},
"panY": false,
"wheelX": "panX",
"wheelY": "zoomX",
"cursor": {
"type": "RadarCursor",
"settings": {
"behavior": "zoomX"
},
"properties": {
"lineY": {
"settings": {
"visible": false
}
}
}
},
"colors": {
"type": "ColorSet",
"settings": {
"step": 3
}
}
},
"properties": {
"series": [
"#series-0",
"#series-1"
],
"xAxes": [
"#axis-0"
],
"yAxes": [
"#axis-1"
]
},
"children": [
{
"type": "Legend",
"settings": {
"centerX": {
"type": "Percent",
"value": 50
},
"x": {
"type": "Percent",
"value": 50
}
},
"properties": {
"data": [
"#series-0",
"#series-1"
]
}
}
],
"refs": [
{
"data-0": [
{
"note": "Acidity",
"light": 8,
"dark": 3
},
{
"note": "Fruit",
"light": 8,
"dark": 2
},
{
"note": "Floral",
"light": 7,
"dark": 1
},
{
"note": "Sweetness",
"light": 6,
"dark": 5
},
{
"note": "Body",
"light": 4,
"dark": 8
},
{
"note": "Chocolate",
"light": 3,
"dark": 8
},
{
"note": "Nutty",
"light": 4,
"dark": 6
},
{
"note": "Bitterness",
"light": 2,
"dark": 8
}
]
},
{
"axis-0": {
"type": "CategoryAxis",
"settings": {
"maxDeviation": 0,
"categoryField": "note",
"renderer": {
"type": "AxisRendererCircular",
"settings": {
"cellStartLocation": 0.2,
"cellEndLocation": 0.8,
"minGridDistance": 20
},
"properties": {
"labels": {
"properties": {
"template": {
"settings": {
"radius": 10
}
}
}
}
}
},
"tooltip": {
"type": "Tooltip"
}
},
"properties": {
"data": "#data-0"
}
}
},
{
"axis-1": {
"type": "ValueAxis",
"settings": {
"min": 0,
"max": 10,
"strictMinMax": true,
"renderer": {
"type": "AxisRendererRadial"
}
}
}
},
{
"series-0": {
"type": "RadarColumnSeries",
"settings": {
"name": "Light roast",
"xAxis": "#axis-0",
"yAxis": "#axis-1",
"valueYField": "light",
"categoryXField": "note"
},
"properties": {
"data": "#data-0",
"columns": {
"properties": {
"template": {
"settings": {
"tooltipText": "{name}: {valueY} of 10",
"width": {
"type": "Percent",
"value": 100
}
}
}
}
}
}
}
},
{
"series-1": {
"type": "RadarColumnSeries",
"settings": {
"name": "Dark roast",
"xAxis": "#axis-0",
"yAxis": "#axis-1",
"valueYField": "dark",
"categoryXField": "note"
},
"properties": {
"data": "#data-0",
"columns": {
"properties": {
"template": {
"settings": {
"tooltipText": "{name}: {valueY} of 10",
"width": {
"type": "Percent",
"value": 100
}
}
}
}
}
}
}
}
]
}



