Apache ECharts
An Open Source JavaScript Visualization Library
The theme provides an alpha version of an echarts
extensions, allowing to render
charts based on the provided options.
Configuration
# mkdocs.yml
markdown_extensions:
- shadcn.extensions.echarts.alpha
Syntax
From a js
config it basically plots charts through the Apache ECharts library. The uses the PyMdown Blocks Extension API so its syntax (similar to tab or details).
/// echarts
{
/* echarts js config */
}
///
Currently, the extension does not support dark mode.
Important
The js
config is passed to the .setOption
method. The extension crops the input so that it keeps the outtermost curly braces ({
and }
) and removes what is outside. You can look at the library API. In a nutshell, it removes code outside of the config object.
Tip
You can either inline all the config within the block or insert snippets from file thanks to the pymdownx.snippets
extension.
/// echarts
––8<-- "example.js"
///
Options
You can pass attributes to the chart container through the builtin attrs
key. The attributes are passed to the div
element that contains the chart. In addition e expose a renderer
key that defines the output format of the chart (svg
or canvas
). The default values are given below.
/// echarts
renderer: "svg"
attrs:
class: "echarts"
style: "width:100%;height:500px;"
/* config here */
///
In the following example we use the canvas
renderer and re-define style
to width:100%;height:60vh;
(note also that it resizes with the window).
/// echarts
renderer: "canvas"
attrs:
style: "width:100%;height:60vh;"
const option = {
tooltip: {
trigger: "none",
axisPointer: {
type: "cross",
},
},
legend: {},
grid: {
top: 70,
bottom: 50,
},
xAxis: [
{
type: "category",
axisTick: {
alignWithLabel: true,
},
axisLine: {
onZero: false,
},
axisPointer: {
label: {
formatter: function (params) {
return (
"Precipitation " +
params.value +
(params.seriesData.length ? ":" + params.seriesData[0].data : "")
);
},
},
},
data: [
"2016-1",
"2016-2",
"2016-3",
"2016-4",
"2016-5",
"2016-6",
"2016-7",
"2016-8",
"2016-9",
"2016-10",
"2016-11",
"2016-12",
],
},
{
type: "category",
axisTick: {
alignWithLabel: true,
},
axisLine: {
onZero: false,
},
axisPointer: {
label: {
formatter: function (params) {
return (
"Precipitation " +
params.value +
(params.seriesData.length ? ":" + params.seriesData[0].data : "")
);
},
},
},
data: [
"2015-1",
"2015-2",
"2015-3",
"2015-4",
"2015-5",
"2015-6",
"2015-7",
"2015-8",
"2015-9",
"2015-10",
"2015-11",
"2015-12",
],
},
],
yAxis: [
{
type: "value",
},
],
series: [
{
name: "Precipitation(2015)",
type: "line",
xAxisIndex: 1,
smooth: true,
emphasis: {
focus: "series",
},
data: [
2.6, 5.9, 9.0, 26.4, 28.7, 70.7, 175.6, 182.2, 48.7, 18.8, 6.0, 2.3,
],
},
{
name: "Precipitation(2016)",
type: "line",
smooth: true,
emphasis: {
focus: "series",
},
data: [
3.9, 5.9, 11.1, 18.7, 48.3, 69.2, 231.6, 46.6, 55.4, 18.4, 10.3, 0.7,
],
},
],
};
///
Examples
Line
/// echarts
const option = {
tooltip: {
trigger: "none",
axisPointer: {
type: "cross",
},
},
legend: {},
grid: {
top: 70,
bottom: 50,
},
xAxis: [
{
type: "category",
axisTick: {
alignWithLabel: true,
},
axisLine: {
onZero: false,
},
axisPointer: {
label: {
formatter: function (params) {
return (
"Precipitation " +
params.value +
(params.seriesData.length ? ":" + params.seriesData[0].data : "")
);
},
},
},
data: [
"2016-1",
"2016-2",
"2016-3",
"2016-4",
"2016-5",
"2016-6",
"2016-7",
"2016-8",
"2016-9",
"2016-10",
"2016-11",
"2016-12",
],
},
{
type: "category",
axisTick: {
alignWithLabel: true,
},
axisLine: {
onZero: false,
},
axisPointer: {
label: {
formatter: function (params) {
return (
"Precipitation " +
params.value +
(params.seriesData.length ? ":" + params.seriesData[0].data : "")
);
},
},
},
data: [
"2015-1",
"2015-2",
"2015-3",
"2015-4",
"2015-5",
"2015-6",
"2015-7",
"2015-8",
"2015-9",
"2015-10",
"2015-11",
"2015-12",
],
},
],
yAxis: [
{
type: "value",
},
],
series: [
{
name: "Precipitation(2015)",
type: "line",
xAxisIndex: 1,
smooth: true,
emphasis: {
focus: "series",
},
data: [
2.6, 5.9, 9.0, 26.4, 28.7, 70.7, 175.6, 182.2, 48.7, 18.8, 6.0, 2.3,
],
},
{
name: "Precipitation(2016)",
type: "line",
smooth: true,
emphasis: {
focus: "series",
},
data: [
3.9, 5.9, 11.1, 18.7, 48.3, 69.2, 231.6, 46.6, 55.4, 18.4, 10.3, 0.7,
],
},
],
};
///
Bars
/// echarts
const option = {
legend: {
data: ["bar", "bar2", "bar3", "bar4"],
left: "10%",
},
brush: {
toolbox: ["rect", "polygon", "lineX", "lineY", "keep", "clear"],
xAxisIndex: 0,
},
toolbox: {
feature: {
magicType: {
type: ["stack"],
},
dataView: {},
},
},
tooltip: {},
xAxis: {
data: (() => {
let xAxisData = [];
for (let i = 0; i < 10; i++) {
xAxisData.push("Class" + i);
}
return xAxisData;
})(),
name: "X Axis",
axisLine: { onZero: true },
splitLine: { show: false },
splitArea: { show: false },
},
yAxis: {},
grid: {
bottom: 100,
},
series: [
{
name: "bar",
type: "bar",
stack: "one",
emphasis: {
itemStyle: {
shadowBlur: 10,
shadowColor: "rgba(0,0,0,0.3)",
},
},
data: (() => {
let data1 = [];
for (let i = 0; i < 10; i++) {
data1.push(+(Math.random() * 2).toFixed(2));
}
return data1;
})(),
},
{
name: "bar2",
type: "bar",
stack: "one",
emphasis: {
itemStyle: {
shadowBlur: 10,
shadowColor: "rgba(0,0,0,0.3)",
},
},
data: (() => {
let data2 = [];
for (let i = 0; i < 10; i++) {
data2.push(+(Math.random() * 5).toFixed(2));
}
return data2;
})(),
},
{
name: "bar3",
type: "bar",
stack: "two",
emphasis: {
itemStyle: {
shadowBlur: 10,
shadowColor: "rgba(0,0,0,0.3)",
},
},
data: (() => {
let data3 = [];
for (let i = 0; i < 10; i++) {
data3.push(+(Math.random() + 0.3).toFixed(2));
}
return data3;
})(),
},
{
name: "bar4",
type: "bar",
stack: "two",
emphasis: {
itemStyle: {
shadowBlur: 10,
shadowColor: "rgba(0,0,0,0.3)",
},
},
data: (() => {
let data4 = [];
for (let i = 0; i < 10; i++) {
data4.push(+Math.random().toFixed(2));
}
return data4;
})(),
},
],
};
///
Pie
/// echarts
const option = {
tooltip: {
trigger: "item",
},
legend: {
top: "5%",
left: "center",
},
series: [
{
name: "Access From",
type: "pie",
radius: ["40%", "70%"],
avoidLabelOverlap: false,
itemStyle: {
borderRadius: 10,
borderColor: "#fff",
borderWidth: 2,
},
label: {
show: false,
position: "center",
},
emphasis: {
label: {
show: true,
fontSize: 40,
fontWeight: "bold",
},
},
labelLine: {
show: false,
},
data: [
{ value: 1048, name: "Search Engine" },
{ value: 735, name: "Direct" },
{ value: 580, name: "Email" },
{ value: 484, name: "Union Ads" },
{ value: 300, name: "Video Ads" },
],
},
],
};
///
Scatter
/// echarts
const option = {
xAxis: {
scale: true,
},
yAxis: {
scale: true,
},
series: [
{
type: "effectScatter",
symbolSize: 20,
data: [
[172.7, 105.2],
[153.4, 42],
],
},
{
type: "scatter",
// prettier-ignore
data: [[161.2, 51.6], [167.5, 59.0], [159.5, 49.2], [157.0, 63.0], [155.8, 53.6],
[170.0, 59.0], [159.1, 47.6], [166.0, 69.8], [176.2, 66.8], [160.2, 75.2],
[172.5, 55.2], [170.9, 54.2], [172.9, 62.5], [153.4, 42.0], [160.0, 50.0],
[147.2, 49.8], [168.2, 49.2], [175.0, 73.2], [157.0, 47.8], [167.6, 68.8],
[159.5, 50.6], [175.0, 82.5], [166.8, 57.2], [176.5, 87.8], [170.2, 72.8],
[174.0, 54.5], [173.0, 59.8], [179.9, 67.3], [170.5, 67.8], [160.0, 47.0],
[154.4, 46.2], [162.0, 55.0], [176.5, 83.0], [160.0, 54.4], [152.0, 45.8],
[162.1, 53.6], [170.0, 73.2], [160.2, 52.1], [161.3, 67.9], [166.4, 56.6],
[168.9, 62.3], [163.8, 58.5], [167.6, 54.5], [160.0, 50.2], [161.3, 60.3],
[167.6, 58.3], [165.1, 56.2], [160.0, 50.2], [170.0, 72.9], [157.5, 59.8],
[167.6, 61.0], [160.7, 69.1], [163.2, 55.9], [152.4, 46.5], [157.5, 54.3],
[168.3, 54.8], [180.3, 60.7], [165.5, 60.0], [165.0, 62.0], [164.5, 60.3],
[156.0, 52.7], [160.0, 74.3], [163.0, 62.0], [165.7, 73.1], [161.0, 80.0],
[162.0, 54.7], [166.0, 53.2], [174.0, 75.7], [172.7, 61.1], [167.6, 55.7],
[151.1, 48.7], [164.5, 52.3], [163.5, 50.0], [152.0, 59.3], [169.0, 62.5],
[164.0, 55.7], [161.2, 54.8], [155.0, 45.9], [170.0, 70.6], [176.2, 67.2],
[170.0, 69.4], [162.5, 58.2], [170.3, 64.8], [164.1, 71.6], [169.5, 52.8],
[163.2, 59.8], [154.5, 49.0], [159.8, 50.0], [173.2, 69.2], [170.0, 55.9],
[161.4, 63.4], [169.0, 58.2], [166.2, 58.6], [159.4, 45.7], [162.5, 52.2],
[159.0, 48.6], [162.8, 57.8], [159.0, 55.6], [179.8, 66.8], [162.9, 59.4],
[161.0, 53.6], [151.1, 73.2], [168.2, 53.4], [168.9, 69.0], [173.2, 58.4],
[171.8, 56.2], [178.0, 70.6], [164.3, 59.8], [163.0, 72.0], [168.5, 65.2],
[166.8, 56.6], [172.7, 105.2], [163.5, 51.8], [169.4, 63.4], [167.8, 59.0],
[159.5, 47.6], [167.6, 63.0], [161.2, 55.2], [160.0, 45.0], [163.2, 54.0],
[162.2, 50.2], [161.3, 60.2], [149.5, 44.8], [157.5, 58.8], [163.2, 56.4],
[172.7, 62.0], [155.0, 49.2], [156.5, 67.2], [164.0, 53.8], [160.9, 54.4],
[162.8, 58.0], [167.0, 59.8], [160.0, 54.8], [160.0, 43.2], [168.9, 60.5],
[158.2, 46.4], [156.0, 64.4], [160.0, 48.8], [167.1, 62.2], [158.0, 55.5],
[167.6, 57.8], [156.0, 54.6], [162.1, 59.2], [173.4, 52.7], [159.8, 53.2],
[170.5, 64.5], [159.2, 51.8], [157.5, 56.0], [161.3, 63.6], [162.6, 63.2],
[160.0, 59.5], [168.9, 56.8], [165.1, 64.1], [162.6, 50.0], [165.1, 72.3],
[166.4, 55.0], [160.0, 55.9], [152.4, 60.4], [170.2, 69.1], [162.6, 84.5],
[170.2, 55.9], [158.8, 55.5], [172.7, 69.5], [167.6, 76.4], [162.6, 61.4],
[167.6, 65.9], [156.2, 58.6], [175.2, 66.8], [172.1, 56.6], [162.6, 58.6],
[160.0, 55.9], [165.1, 59.1], [182.9, 81.8], [166.4, 70.7], [165.1, 56.8],
[177.8, 60.0], [165.1, 58.2], [175.3, 72.7], [154.9, 54.1], [158.8, 49.1],
[172.7, 75.9], [168.9, 55.0], [161.3, 57.3], [167.6, 55.0], [165.1, 65.5],
[175.3, 65.5], [157.5, 48.6], [163.8, 58.6], [167.6, 63.6], [165.1, 55.2],
[165.1, 62.7], [168.9, 56.6], [162.6, 53.9], [164.5, 63.2], [176.5, 73.6],
[168.9, 62.0], [175.3, 63.6], [159.4, 53.2], [160.0, 53.4], [170.2, 55.0],
[162.6, 70.5], [167.6, 54.5], [162.6, 54.5], [160.7, 55.9], [160.0, 59.0],
[157.5, 63.6], [162.6, 54.5], [152.4, 47.3], [170.2, 67.7], [165.1, 80.9],
[172.7, 70.5], [165.1, 60.9], [170.2, 63.6], [170.2, 54.5], [170.2, 59.1],
[161.3, 70.5], [167.6, 52.7], [167.6, 62.7], [165.1, 86.3], [162.6, 66.4],
[152.4, 67.3], [168.9, 63.0], [170.2, 73.6], [175.2, 62.3], [175.2, 57.7],
[160.0, 55.4], [165.1, 104.1], [174.0, 55.5], [170.2, 77.3], [160.0, 80.5],
[167.6, 64.5], [167.6, 72.3], [167.6, 61.4], [154.9, 58.2], [162.6, 81.8],
[175.3, 63.6], [171.4, 53.4], [157.5, 54.5], [165.1, 53.6], [160.0, 60.0],
[174.0, 73.6], [162.6, 61.4], [174.0, 55.5], [162.6, 63.6], [161.3, 60.9],
[156.2, 60.0], [149.9, 46.8], [169.5, 57.3], [160.0, 64.1], [175.3, 63.6],
[169.5, 67.3], [160.0, 75.5], [172.7, 68.2], [162.6, 61.4], [157.5, 76.8],
[176.5, 71.8], [164.4, 55.5], [160.7, 48.6], [174.0, 66.4], [163.8, 67.3]
],
},
],
};
///
Radar
/// echarts
const option = {
title: {
text: "Basic Radar Chart",
},
legend: {
data: ["Allocated Budget", "Actual Spending"],
},
radar: {
// shape: 'circle',
indicator: [
{ name: "Sales", max: 6500 },
{ name: "Administration", max: 16000 },
{ name: "Information Technology", max: 30000 },
{ name: "Customer Support", max: 38000 },
{ name: "Development", max: 52000 },
{ name: "Marketing", max: 25000 },
],
},
series: [
{
name: "Budget vs spending",
type: "radar",
data: [
{
value: [4200, 3000, 20000, 35000, 50000, 18000],
name: "Allocated Budget",
},
{
value: [5000, 14000, 28000, 26000, 42000, 21000],
name: "Actual Spending",
},
],
},
],
};
///