← Gallery

Chart grid

Requests and capacity

Explore the example, download the output or use the C# source in your own project.

Preview
Requests and capacityThree panels share the same axis domainsRequests and capacityThree panels share the same axis domainsObserved requestsMonTueWedThuFriSat02040Reviewed requestsNorthSouthEastWestCentralOnline02040Capacity usedMonTueWedThuFriSat02040
Requests and capacity
Requests and capacityThree panels share the same axis domainsRequests and capacityThree panels share the same axis domainsObserved requestsMonTueWedThuFriSat02040Reviewed requestsNorthSouthEastWestCentralOnline02040Capacity usedMonTueWedThuFriSat02040
Requests and capacity
960 × 700 pixels

Create this example

Create a console project, add the ChartForgeX package, and replace Program.cs with this source. Run it to write SVG, PNG and HTML with the default system fonts.

For the same typography as the gallery, download the gallery-font recipe and copy the gallery’s fonts directory beside your program.

using System;
using System.Collections.Generic;
using System.Globalization;
using System.IO;
using System.Linq;
using ChartForgeX.Core;
using ChartForgeX.Primitives;
using ChartForgeX.Rendering;
using ChartForgeX.Themes;
using ChartForgeX.Topology;
using ChartForgeX.Typography;
using ChartForgeX.VisualArtifacts;
using ChartForgeX.VisualBlocks;

var mode = VisualThemeMode.Light;
var theme = VisualTheme.Graphite();
var model = ChartGridRecipe.Create("wide", mode);
var context = new VisualRenderContext(
    new VisualLayoutOptions(new VisualSize(960, 700)), theme, mode,
    new VisualFrame("Requests and capacity", "Three panels share the same axis domains", showLegend: true, showSurface: false));
var prepared = model.Prepare(context);
File.WriteAllText("visual.svg", prepared.ToSvg());
File.WriteAllBytes("visual.png", prepared.ToPng());
File.WriteAllText("visual.html", prepared.ToArtifact("example", VisualArtifactKind.Chart).ToHtmlPage());

/// <summary>A three-panel comparison with shared Cartesian axes.</summary>
public static class ChartGridRecipe {
    public static ChartGrid Create(string variant = "wide", VisualThemeMode mode = VisualThemeMode.Light) {
        var observations = Enumerable.Range(1, 6).Select(index => new ChartPoint(index, 20 + index * 7 % 29)).ToArray();
        var requests = Chart.Create().WithTitle("Observed requests").WithXLabels("Mon", "Tue", "Wed", "Thu", "Fri", "Sat")
            .AddSeries(ChartSeries.CreateLine(new ChartSeriesId("requests"), "Requests", observations))
            .WithValueFormat(ChartValueFormat.Number("0.##", CultureInfo.InvariantCulture));
        var reviewed = Chart.Create().WithTitle("Reviewed requests").WithXLabels("North", "South", "East", "West", "Central", "Online")
            .AddSeries(ChartSeries.CreateBar(new ChartSeriesId("orders"), "Orders", observations))
            .WithValueFormat(ChartValueFormat.Number("0.##", CultureInfo.InvariantCulture));
        var capacity = Chart.Create().WithTitle("Capacity used").WithXLabels("Mon", "Tue", "Wed", "Thu", "Fri", "Sat")
            .AddSeries(ChartSeries.CreateArea(new ChartSeriesId("used-capacity"), "Used capacity", observations))
            .WithValueFormat(ChartValueFormat.Number("0.##", CultureInfo.InvariantCulture));
        return ChartGrid.Create().WithColumns(2).WithGap(16).WithPanelSize(640, 400)
            .Add(requests).Add(reviewed).Add(capacity, 2).WithSharedAxes();
    }
}
using System;
using System.Collections.Generic;
using System.Globalization;
using System.IO;
using System.Linq;
using ChartForgeX.Core;
using ChartForgeX.Primitives;
using ChartForgeX.Rendering;
using ChartForgeX.Themes;
using ChartForgeX.Topology;
using ChartForgeX.Typography;
using ChartForgeX.VisualArtifacts;
using ChartForgeX.VisualBlocks;

var mode = VisualThemeMode.Dark;
var theme = VisualTheme.Graphite();
var model = ChartGridRecipe.Create("wide", mode);
var context = new VisualRenderContext(
    new VisualLayoutOptions(new VisualSize(960, 700)), theme, mode,
    new VisualFrame("Requests and capacity", "Three panels share the same axis domains", showLegend: true, showSurface: false));
var prepared = model.Prepare(context);
File.WriteAllText("visual.svg", prepared.ToSvg());
File.WriteAllBytes("visual.png", prepared.ToPng());
File.WriteAllText("visual.html", prepared.ToArtifact("example", VisualArtifactKind.Chart).ToHtmlPage());

/// <summary>A three-panel comparison with shared Cartesian axes.</summary>
public static class ChartGridRecipe {
    public static ChartGrid Create(string variant = "wide", VisualThemeMode mode = VisualThemeMode.Light) {
        var observations = Enumerable.Range(1, 6).Select(index => new ChartPoint(index, 20 + index * 7 % 29)).ToArray();
        var requests = Chart.Create().WithTitle("Observed requests").WithXLabels("Mon", "Tue", "Wed", "Thu", "Fri", "Sat")
            .AddSeries(ChartSeries.CreateLine(new ChartSeriesId("requests"), "Requests", observations))
            .WithValueFormat(ChartValueFormat.Number("0.##", CultureInfo.InvariantCulture));
        var reviewed = Chart.Create().WithTitle("Reviewed requests").WithXLabels("North", "South", "East", "West", "Central", "Online")
            .AddSeries(ChartSeries.CreateBar(new ChartSeriesId("orders"), "Orders", observations))
            .WithValueFormat(ChartValueFormat.Number("0.##", CultureInfo.InvariantCulture));
        var capacity = Chart.Create().WithTitle("Capacity used").WithXLabels("Mon", "Tue", "Wed", "Thu", "Fri", "Sat")
            .AddSeries(ChartSeries.CreateArea(new ChartSeriesId("used-capacity"), "Used capacity", observations))
            .WithValueFormat(ChartValueFormat.Number("0.##", CultureInfo.InvariantCulture));
        return ChartGrid.Create().WithColumns(2).WithGap(16).WithPanelSize(640, 400)
            .Add(requests).Add(reviewed).Add(capacity, 2).WithSharedAxes();
    }
}