Circular Charts

Pie Chart

using VegaLite

@vgplot(
    height=200,
    marks=[
        {
            encode={
                update={
                    innerRadius={
                        signal="innerRadius"
                    },
                    startAngle={
                        field="startAngle"
                    },
                    cornerRadius={
                        signal="cornerRadius"
                    },
                    padAngle={
                        signal="padAngle"
                    },
                    endAngle={
                        field="endAngle"
                    },
                    outerRadius={
                        signal="width / 2"
                    }
                },
                enter={
                    x={
                        signal="width / 2"
                    },
                    fill={
                        field="id",
                        scale="color"
                    },
                    y={
                        signal="height / 2"
                    }
                }
            },
            from={
                data="table"
            },
            type="arc"
        }
    ],
    data=[
        {
            name="table",
            values=[
                {
                    id=1,
                    field=4
                },
                {
                    id=2,
                    field=6
                },
                {
                    id=3,
                    field=10
                },
                {
                    id=4,
                    field=3
                },
                {
                    id=5,
                    field=7
                },
                {
                    id=6,
                    field=8
                }
            ],
            transform=[
                {
                    startAngle={
                        signal="startAngle"
                    },
                    sort={
                        signal="sort"
                    },
                    field="field",
                    endAngle={
                        signal="endAngle"
                    },
                    type="pie"
                }
            ]
        }
    ],
    scales=[
        {
            name="color",
            range={
                scheme="category20"
            },
            domain={
                data="table",
                field="id"
            },
            type="ordinal"
        }
    ],
    width=200,
    autosize="none",
    signals=[
        {
            name="startAngle",
            bind={
                step=0.01,
                max=6.29,
                min=0,
                input="range"
            },
            value=0
        },
        {
            name="endAngle",
            bind={
                step=0.01,
                max=6.29,
                min=0,
                input="range"
            },
            value=6.29
        },
        {
            name="padAngle",
            bind={
                max=0.1,
                min=0,
                input="range"
            },
            value=0
        },
        {
            name="innerRadius",
            bind={
                step=1,
                max=90,
                min=0,
                input="range"
            },
            value=0
        },
        {
            name="cornerRadius",
            bind={
                step=0.5,
                max=10,
                min=0,
                input="range"
            },
            value=0
        },
        {
            name="sort",
            bind={
                input="checkbox"
            },
            value=false
        }
    ]
)

Donut Chart

using VegaLite

@vgplot(
    height=200,
    marks=[
        {
            encode={
                update={
                    innerRadius={
                        signal="innerRadius"
                    },
                    startAngle={
                        field="startAngle"
                    },
                    cornerRadius={
                        signal="cornerRadius"
                    },
                    padAngle={
                        signal="padAngle"
                    },
                    endAngle={
                        field="endAngle"
                    },
                    outerRadius={
                        signal="width / 2"
                    }
                },
                enter={
                    x={
                        signal="width / 2"
                    },
                    fill={
                        field="id",
                        scale="color"
                    },
                    y={
                        signal="height / 2"
                    }
                }
            },
            from={
                data="table"
            },
            type="arc"
        }
    ],
    data=[
        {
            name="table",
            values=[
                {
                    id=1,
                    field=4
                },
                {
                    id=2,
                    field=6
                },
                {
                    id=3,
                    field=10
                },
                {
                    id=4,
                    field=3
                },
                {
                    id=5,
                    field=7
                },
                {
                    id=6,
                    field=8
                }
            ],
            transform=[
                {
                    startAngle={
                        signal="startAngle"
                    },
                    sort={
                        signal="sort"
                    },
                    field="field",
                    endAngle={
                        signal="endAngle"
                    },
                    type="pie"
                }
            ]
        }
    ],
    scales=[
        {
            name="color",
            range={
                scheme="category20"
            },
            domain={
                data="table",
                field="id"
            },
            type="ordinal"
        }
    ],
    width=200,
    autosize="none",
    signals=[
        {
            name="startAngle",
            bind={
                step=0.01,
                max=6.29,
                min=0,
                input="range"
            },
            value=0
        },
        {
            name="endAngle",
            bind={
                step=0.01,
                max=6.29,
                min=0,
                input="range"
            },
            value=6.29
        },
        {
            name="padAngle",
            bind={
                max=0.1,
                min=0,
                input="range"
            },
            value=0
        },
        {
            name="innerRadius",
            bind={
                step=1,
                max=90,
                min=0,
                input="range"
            },
            value=60
        },
        {
            name="cornerRadius",
            bind={
                step=0.5,
                max=10,
                min=0,
                input="range"
            },
            value=0
        },
        {
            name="sort",
            bind={
                input="checkbox"
            },
            value=false
        }
    ]
)

Radial Plot

using VegaLite

@vgplot(
    height=200,
    marks=[
        {
            encode={
                update={
                    fill={
                        value="#ccc"
                    }
                },
                hover={
                    fill={
                        value="pink"
                    }
                },
                enter={
                    innerRadius={
                        value=20
                    },
                    startAngle={
                        field="startAngle"
                    },
                    stroke={
                        value="#fff"
                    },
                    x={
                        mult=0.5,
                        field={
                            group="width"
                        }
                    },
                    endAngle={
                        field="endAngle"
                    },
                    outerRadius={
                        field="data",
                        scale="r"
                    },
                    y={
                        mult=0.5,
                        field={
                            group="height"
                        }
                    }
                }
            },
            from={
                data="table"
            },
            type="arc"
        },
        {
            encode={
                enter={
                    align={
                        value="center"
                    },
                    theta={
                        signal="(datum.startAngle + datum.endAngle)/2"
                    },
                    x={
                        mult=0.5,
                        field={
                            group="width"
                        }
                    },
                    radius={
                        offset=8,
                        field="data",
                        scale="r"
                    },
                    fill={
                        value="#000"
                    },
                    baseline={
                        value="middle"
                    },
                    text={
                        field="data"
                    },
                    y={
                        mult=0.5,
                        field={
                            group="height"
                        }
                    }
                }
            },
            from={
                data="table"
            },
            type="text"
        }
    ],
    data=[
        {
            name="table",
            values=[
                12,
                23,
                47,
                6,
                52,
                19
            ],
            transform=[
                {
                    field="data",
                    type="pie"
                }
            ]
        }
    ],
    scales=[
        {
            name="r",
            zero=true,
            range=[
                20,
                100
            ],
            domain={
                data="table",
                field="data"
            },
            type="sqrt"
        }
    ],
    width=200
)

Radar Chart

using VegaLite

@vgplot(
    height=400,
    padding=40,
    marks=[
        {
            name="categories",
            marks=[
                {
                    name="category-line",
                    encode={
                        enter={
                            stroke={
                                field="category",
                                scale="color"
                            },
                            interpolate={
                                value="linear-closed"
                            },
                            x={
                                signal="scale('radial', datum.value) * cos(scale('angular', datum.key))"
                            },
                            strokeWidth={
                                value=1
                            },
                            fillOpacity={
                                value=0.1
                            },
                            fill={
                                field="category",
                                scale="color"
                            },
                            y={
                                signal="scale('radial', datum.value) * sin(scale('angular', datum.key))"
                            }
                        }
                    },
                    from={
                        data="facet"
                    },
                    type="line"
                },
                {
                    name="value-text",
                    encode={
                        enter={
                            align={
                                value="center"
                            },
                            x={
                                signal="datum.x"
                            },
                            text={
                                signal="datum.datum.value"
                            },
                            baseline={
                                value="middle"
                            },
                            fill={
                                value="black"
                            },
                            y={
                                signal="datum.y"
                            }
                        }
                    },
                    from={
                        data="category-line"
                    },
                    type="text"
                }
            ],
            zindex=1,
            from={
                facet={
                    name="facet",
                    data="table",
                    groupby=[
                        "category"
                    ]
                }
            },
            type="group"
        },
        {
            name="radial-grid",
            encode={
                enter={
                    stroke={
                        value="lightgray"
                    },
                    x2={
                        signal="radius * cos(scale('angular', datum.key))"
                    },
                    x={
                        value=0
                    },
                    y2={
                        signal="radius * sin(scale('angular', datum.key))"
                    },
                    strokeWidth={
                        value=1
                    },
                    y={
                        value=0
                    }
                }
            },
            zindex=0,
            from={
                data="keys"
            },
            type="rule"
        },
        {
            name="key-label",
            encode={
                enter={
                    align=[
                        {
                            test="abs(scale('angular', datum.key)) > PI / 2",
                            value="right"
                        },
                        {
                            value="left"
                        }
                    ],
                    fontWeight={
                        value="bold"
                    },
                    x={
                        signal="(radius + 5) * cos(scale('angular', datum.key))"
                    },
                    text={
                        field="key"
                    },
                    baseline=[
                        {
                            test="scale('angular', datum.key) > 0",
                            value="top"
                        },
                        {
                            test="scale('angular', datum.key) == 0",
                            value="middle"
                        },
                        {
                            value="bottom"
                        }
                    ],
                    fill={
                        value="black"
                    },
                    y={
                        signal="(radius + 5) * sin(scale('angular', datum.key))"
                    }
                }
            },
            zindex=1,
            from={
                data="keys"
            },
            type="text"
        },
        {
            name="outer-line",
            encode={
                enter={
                    stroke={
                        value="lightgray"
                    },
                    interpolate={
                        value="linear-closed"
                    },
                    x={
                        field="x2"
                    },
                    strokeWidth={
                        value=1
                    },
                    y={
                        field="y2"
                    }
                }
            },
            from={
                data="radial-grid"
            },
            type="line"
        }
    ],
    encode={
        enter={
            x={
                signal="radius"
            },
            y={
                signal="radius"
            }
        }
    },
    data=[
        {
            name="table",
            values=[
                {
                    key="key-0",
                    value=19,
                    category=0
                },
                {
                    key="key-1",
                    value=22,
                    category=0
                },
                {
                    key="key-2",
                    value=14,
                    category=0
                },
                {
                    key="key-3",
                    value=38,
                    category=0
                },
                {
                    key="key-4",
                    value=23,
                    category=0
                },
                {
                    key="key-5",
                    value=5,
                    category=0
                },
                {
                    key="key-6",
                    value=27,
                    category=0
                },
                {
                    key="key-0",
                    value=13,
                    category=1
                },
                {
                    key="key-1",
                    value=12,
                    category=1
                },
                {
                    key="key-2",
                    value=42,
                    category=1
                },
                {
                    key="key-3",
                    value=13,
                    category=1
                },
                {
                    key="key-4",
                    value=6,
                    category=1
                },
                {
                    key="key-5",
                    value=15,
                    category=1
                },
                {
                    key="key-6",
                    value=8,
                    category=1
                }
            ]
        },
        {
            name="keys",
            source="table",
            transform=[
                {
                    groupby=[
                        "key"
                    ],
                    type="aggregate"
                }
            ]
        }
    ],
    scales=[
        {
            name="angular",
            padding=0.5,
            range={
                signal="[-PI, PI]"
            },
            domain={
                data="table",
                field="key"
            },
            type="point"
        },
        {
            name="radial",
            zero=true,
            nice=false,
            range={
                signal="[0, radius]"
            },
            domain={
                data="table",
                field="value"
            },
            domainMin=0,
            type="linear"
        },
        {
            name="color",
            range={
                scheme="category10"
            },
            domain={
                data="table",
                field="category"
            },
            type="ordinal"
        }
    ],
    width=400,
    autosize={
        contains="padding",
        type="none"
    },
    signals=[
        {
            name="radius",
            update="width / 2"
        }
    ]
)