Time Series Chart

A chart which displays values over time.

Basic Usage

To get a Line Chart use Type="TimeSeriesDiplayType.Line" to render the configured TimeSeriesChartSeries as a line graph. To get an Area Chart use Type="TimeSeriesDiplayType.Area" to render the configured TimeSeriesChartSeries as a area graph. Like in the other chart types, the Series in the chart are clickable. You can bind SelectedIndex to make your chart interactive. Using the ChartOptions you can change the thickness of the lines by setting the parameter LineStrokeWidth.

0200040006000800010000120001400016000 15:5115:5616:0116:0616:1116:1616:2116:2616:3116:3616:4116:46
Series 1
Series 2
Series 3

Selected: None

Line Width: 1

Label Extra Height

Label Rotation

<MudPaper Class="doc-section-component-container">
    <MudTimeSeriesChart ChartSeries="@_series"
                        @bind-SelectedIndex="_index"
                        Width="@_width"
                        Height="@_height"
                        ChartOptions="@_options"
                        AxisChartOptions="@_axisChartOptions"
                        CanHideSeries="true"
                        TimeLabelSpacing="TimeSpan.FromMinutes(5)"
                        TimeLabelSpacingRounding="_roundedLabelSpacing"
                        TimeLabelSpacingRoundingPadSeries="_roundedLabelSpacingPadSeries"
                        DataMarkerTooltipTimeLabelFormat="yyyy MMM dd HH:mm:ss" />
</MudPaper>

<MudGrid>
    <MudItem md="6" xs="12">
        <MudText Typo="Typo.body1" Class="py-3">Selected: @(_index < 0 ? "None" : _series[_index].Name)</MudText>
    </MudItem>
    <MudItem md="6" xs="12">
        <MudSlider @bind-Value="_options.LineStrokeWidth" Min="1" Max="10" Color="Color.Info">Line Width: @_options.LineStrokeWidth.ToString()</MudSlider>
    </MudItem>
    <MudItem md="6" xs="12">
        <MudCheckBox @bind-Value="_roundedLabelSpacing" Color="Color.Info" Label="TimeLabelSpacing Rounding"></MudCheckBox>
    </MudItem>
    <MudItem md="6" xs="12">
        <MudCheckBox @bind-Value="_roundedLabelSpacingPadSeries" Color="Color.Info" Label="TimeLabelSpacing Rounding - Pad Series"></MudCheckBox>
    </MudItem>
    <MudItem md="6" xs="12">
        <MudCheckBox @bind-Value="_axisChartOptions.MatchBoundsToSize" Color="Color.Info" Label="MatchBoundsToSize"></MudCheckBox>
    </MudItem>
    <MudItem md="6" xs="12">
        <MudTextField @bind-Value="_width" Label="Chart Width"></MudTextField>
    </MudItem>
    <MudItem md="6" xs="12">
        <MudTextField @bind-Value="_height" Label="Chart Height"></MudTextField>
    </MudItem>
    <MudItem md="6" xs="12">
        <MudStack>
            <MudText Typo="Typo.body1">Label Extra Height</MudText>
            <MudSlider @bind-Value="_axisChartOptions.LabelExtraHeight" Min="0" Max="40" Step="5"></MudSlider>
        </MudStack>
    </MudItem>
    <MudItem md="6" xs="12">
        <MudStack>
            <MudText Typo="Typo.body1">Label Rotation</MudText>
            <MudSlider @bind-Value="_axisChartOptions.LabelRotation" Min="0" Max="90" Step="15"></MudSlider>
        </MudStack>
    </MudItem>
    <MudItem md="6" xs="12">
        <MudCheckBox T="bool" ValueChanged="(v)=> _series.ForEach(x => x.ShowDataMarkers = v)" Label="Show Data Markers"></MudCheckBox>
    </MudItem>
</MudGrid>
@code
{
    private int _index = -1; //default value cannot be 0 -> first selectedindex is 0.
    private ChartOptions _options = new ChartOptions
        {
            YAxisLines = false,
            YAxisTicks = 500,
            MaxNumYAxisTicks = 10,
            YAxisRequireZeroPoint = true,
            XAxisLines = false,
            LineStrokeWidth = 1,
        };

    private AxisChartOptions _axisChartOptions = new();

    private TimeSeriesChartSeries _chart1 = new();
    private TimeSeriesChartSeries _chart2 = new();
    private TimeSeriesChartSeries _chart3 = new();

    private List<TimeSeriesChartSeries> _series = new();

    private readonly Random _random = new Random();

    private bool _roundedLabelSpacing = false;
    private bool _roundedLabelSpacingPadSeries = false;

    private string _width = "650px";
    private string _height = "350px";

    protected override void OnInitialized()
    {
        base.OnInitialized();

        var now = DateTime.Now;
        _chart1 = new TimeSeriesChartSeries
            {
                Index = 0,
                Name = "Series 1",
                Data = Enumerable.Range(-360, 360).Select(x => new TimeSeriesChartSeries.TimeValue(now.AddSeconds(x * 10), _random.Next(6000, 15000))).ToList(),
                IsVisible = true,
                LineDisplayType = LineDisplayType.Line,
                DataMarkerTooltipTitleFormat = "{{X_VALUE}}",
                DataMarkerTooltipSubtitleFormat = "{{Y_VALUE}}"
            };

        _chart2 = new TimeSeriesChartSeries
            {
                Index = 1,
                Name = "Series 2",
                Data = Enumerable.Range(-360, 360).Select(x => new TimeSeriesChartSeries.TimeValue(now.AddSeconds(x * 10), _random.Next(0, 7000))).ToList(),
                IsVisible = true,
                LineDisplayType = LineDisplayType.Area,
                DataMarkerTooltipTitleFormat = "{{X_VALUE}}",
                DataMarkerTooltipSubtitleFormat = "{{Y_VALUE}}"
            };

        _chart3 = new TimeSeriesChartSeries
            {
                Index = 2,
                Name = "Series 3",
                Data = Enumerable.Range(-90, 60).Select(x => new TimeSeriesChartSeries.TimeValue(now.AddSeconds(x * 30), _random.Next(4000, 10000))).ToList(),
                IsVisible = true,
                LineDisplayType = LineDisplayType.Line,
                DataMarkerTooltipTitleFormat = "{{X_VALUE}}",
                DataMarkerTooltipSubtitleFormat = "{{Y_VALUE}}"
            };

        _series.Add(_chart1);
        _series.Add(_chart2);
        _series.Add(_chart3);

        StateHasChanged();
    }
}
An unhandled error has occurred. Reload 🗙