Radar Chart


Explore interactive Blazor Radar Chart examples with source code. Learn how to visualize categorical data, customize chart appearance, and enhance your Blazor applications using the Radar Chart component. Try live demos and discover practical usage scenarios.

API Documentation

Chart setup #

Before using any chart demo: install BlazorExpress.ChartJS 1.2.2, load Chart.js 4.4.1, chartjs-plugin-datalabels 2.2.0, and _content/BlazorExpress.ChartJS/blazorexpress.chartjs.js, then add @using BlazorExpress.ChartJS to your chart page or chart folder.

Follow the shared chart setup guide, the .NET 8 WebAssembly guide, or the .NET 8 Web App Server guide. For full chart component guidance and examples, visit chartjs.blazorexpress.com.

How it works #

The Radar Chart component visualizes multivariate data with each variable represented on axes starting from the same point, making it ideal for comparing multiple groups across several categories.

How to use:
  1. Add the RadarChart component to your page and set its dimensions (e.g., Width="600").
  2. Prepare your chart data by specifying Labels for each axis and one or more Datasets with values and styling options.
  3. Configure chart options such as Responsive using the RadarChartOptions object.
  4. Initialize the chart in OnAfterRenderAsync by calling radarChart.InitializeAsync(chartData, radarChartOptions).
  5. Use the demo's interactive buttons to randomize data, add datasets, or add new data points dynamically and see the chart update in real time.
  6. Refer to the demo code below for practical examples of data preparation, dynamic updates, and chart customization.
This demo demonstrates how to set up a Radar Chart, bind your data, and interactively update the chart to fit your application's needs.
<RadarChart @ref="radarChart" Width="600" />

<div class="mt-5">
    <Button Color="ButtonColor.Primary" Size="ButtonSize.Small" @onclick="RandomizeAsync"> Randomize </Button>
    <Button Color="ButtonColor.Link" Size="ButtonSize.Small" @onclick="AddDatasetAsync"> Add Dataset </Button>
    <Button Color="ButtonColor.Info" Size="ButtonSize.Small" @onclick="AddDataAsync"> Add Data </Button>
</div>

@code {
    private RadarChart radarChart = default!;
    private RadarChartOptions radarChartOptions = default!;
    private ChartData chartData = default!;
    private string[]? chartColors;

    private int datasetsCount;
    private int dataLabelsCount;

    private Random random = new();

    protected override void OnInitialized()
    {
        chartColors = ChartJsColorUtility.CategoricalTwelveColors;
        chartData = new ChartData { Labels = GetDefaultDataLabels(6), Datasets = GetDefaultDataSets(3) };
        radarChartOptions = new() { Responsive = true };
    }

    protected override async Task OnAfterRenderAsync(bool firstRender)
    {
        if (firstRender)
        {
            await radarChart.InitializeAsync(chartData, radarChartOptions);
        }
        await base.OnAfterRenderAsync(firstRender);
    }

    private async Task RandomizeAsync()
    {
        if (chartData is null || chartData.Datasets is null || !chartData.Datasets.Any()) return;

        var newDatasets = new List<IChartDataset>();

        foreach (var dataset in chartData.Datasets)
        {
            if (dataset is RadarChartDataset radarChartDataset
                && radarChartDataset is not null
                && radarChartDataset.Data is not null)
            {
                var count = radarChartDataset.Data.Count;

                var newData = new List<double?>();
                for (var i = 0; i < count; i++)
                {
                    newData.Add(random.Next(200));
                }

                radarChartDataset.Data = newData;
                newDatasets.Add(radarChartDataset);
            }
        }

        chartData.Datasets = newDatasets;

        await radarChart.UpdateAsync(chartData, radarChartOptions);
    }

    private async Task AddDatasetAsync()
    {
        if (datasetsCount >= 12)
            return;

        if (chartData is null || chartData.Datasets is null) return;

        var chartDataset = GetRandomRadarChartDataset();
        chartData = await radarChart.AddDatasetAsync(chartData, chartDataset, radarChartOptions);
    }

    private async Task AddDataAsync()
    {
        if (dataLabelsCount >= 12)
            return;

        if (chartData is null || chartData.Datasets is null)
            return;

        dataLabelsCount += 1;

        var data = new List<IChartDatasetData>();
        foreach (var dataset in chartData.Datasets)
        {
            if (dataset is RadarChartDataset radarChartDataset)
                data.Add(new RadarChartDatasetData(radarChartDataset.Label, random.Next(200)));
        }

        chartData = await radarChart.AddDataAsync(chartData, GetNextDataLabel(), data);
    }

    #region Data Preparation

    private List<string> GetDefaultDataLabels(int numberOfLabels)
    {
        var labels = new List<string>();
        for (var index = 0; index < numberOfLabels; index++)
        {
            dataLabelsCount += 1;
            labels.Add(GetNextDataLabel());
        }

        return labels;
    }

    private string GetNextDataLabel() => $"Day {dataLabelsCount}";

    private List<IChartDataset> GetDefaultDataSets(int numberOfDatasets)
    {
        var datasets = new List<IChartDataset>();

        for (var index = 0; index < numberOfDatasets; index++)
        {
            datasets.Add(GetRandomRadarChartDataset());
        }

        return datasets;
    }

    private RadarChartDataset GetRandomRadarChartDataset()
    {
        var c = ChartJsColorExtensions.ToColor(chartColors![datasetsCount]);

        datasetsCount += 1;

        return new RadarChartDataset
            {
                Label = $"Team {datasetsCount}",
                Data = GetRandomData(),
                BackgroundColor = ChartJsColorExtensions.ToRgbaString(c),
                BorderColor = ChartJsColorExtensions.ToRgbaString(c, 0.8),
                BorderWidth = 2,
                Fill = true,
                HoverBorderWidth = 4,
            };
    }

    private List<double?> GetRandomData()
    {
        var data = new List<double?>();
        for (var index = 0; index < dataLabelsCount; index++)
        {
            data.Add(random.Next(200));
        }

        return data;
    }

    #endregion Data Preparation
}
DO YOU KNOW?
This demo website is built using the BlazorExpress.Bulma library and published on the Azure Web App. See our source code on GitHub.