Canvas.Views.Web
1.0.0-prerelease
See the version list below for details.
dotnet add package Canvas.Views.Web --version 1.0.0-prerelease
NuGet\Install-Package Canvas.Views.Web -Version 1.0.0-prerelease
<PackageReference Include="Canvas.Views.Web" Version="1.0.0-prerelease" />
paket add Canvas.Views.Web --version 1.0.0-prerelease
#r "nuget: Canvas.Views.Web, 1.0.0-prerelease"
// Install Canvas.Views.Web as a Cake Addin #addin nuget:?package=Canvas.Views.Web&version=1.0.0-prerelease&prerelease // Install Canvas.Views.Web as a Cake Tool #tool nuget:?package=Canvas.Views.Web&version=1.0.0-prerelease&prerelease
Canvas and Open GL Stock and Financial Charts
Generic cross-platform real-time charts for Web and Desktop apps.
The main purpose of this app is to be used as a charting tool for real-time financial applications, e.g. backtesters for trading strategies.
Here is the most comprehensive guide dedicated to charting in .NET that I have seen so far.
Nevertheless, trying various options from that guide I wasn't able to find anything flexible enough for my needs, so created my own. Available in Nuget as CrossCanvas
. Usage samples can be found here or as more complete example in a separate repository.
Drawing Methods
Currently available controls.
- CanvasControl - base
Canvas
control exposingDrawingContext
used withShapes
andGeometries
- CanvasPanelControl - a wrapper around SkiaSharp and Open GL
In order to add a different type of panel, e.g. GDI+
or Direct 2D
, you need to implement ICanvasControl
interface.
Chart Types
At the moment, there are four built-in chart types.
- Line - line
- Bar - polygon
- Area - polygon
- Candle - OHLC box, a mix of a line and a rectangle polygon
If there is a need to create a new chart type, then you need to implement IShape
interface.
Pan and Zoom
The chart is completely data-centric, thus in order to scale the chart you need to change the data source.
By default, the chart displays last 100 data points, as defined in IndexCount
property.
MinIndex = Items.Count - IndexCount
MaxIndex = Items.Count
To pan the chart to the left, subtract arbitrary value from both MinIndex
and MaxIndex
.
MinIndex -= 1
MaxIndex -= 1
To pan the chart to the right, do the opposite.
MinIndex += 1
MaxIndex += 1
To zoom in, increase MinIndex
and decrease MaxIndex
to decrease number of visible points.
MinIndex += 1
MaxIndex -= 1
To zoom out, do the opposite.
MinIndex -= 1
MaxIndex += 1
Data source structure
The simplest format used by the library is a list of model with a single Point
property.
// Blazor example
<CanvasWebView @ref="ViewControl"></CanvasWebView>
@code
{
public CanvasWebView ViewControl { get; set; }
protected override async Task OnAfterRenderAsync(bool setup)
{
if (setup)
{
ViewControl.OnSize = ViewControl.OnCreate = message => OnCreate(nameof(ViewControl), message);
}
}
protected void OnCreate(string name, ViewMessage message)
{
var points = Enumerable.Range(1, 100).Select(i => new BarGroupModel
{
Index = i,
Value = new Model { ["Point"] = new Random().Next(-5000, 5000) }
} as IPointModel);
var composer = new Composer
{
Name = name,
Points = points.ToList(),
Engine = new CanvasEngine(message.Width, message.Height)
};
ViewControl.Composer = composer;
ViewControl.Update();
}
}
In case when charts have to be subchronizaed or overlapped within the same viewport, data source should have format of a list where each entry point has a time stamp and a set of Areas and Series that will be rendered in the relevant viewport.
[
DateTime
{
Area A
{
Line Series => double,
Candle Series => OHLC
},
Area B
{
Line Series => double,
Line Series => double
},
Area C
{
Bar Series => double
}
},
DateTime { ... },
DateTime { ... },
DateTime { ... }
]
- Area is a viewport, an actual chart, each viewport can show several types of series, e.g. a mix of candles and lines.
- Series is a single chart type to be displayed in the viewport, e.g. lines.
- Model is a data point of
dynamic
type, can accept different type of inputs, e.g. double or OHLC box.
At this moment, Painter
supports only horizontal orientation, so the axis X is used as an index scale that picks data points from the source list and axis Y is a value scale that represents the actual value of each data point.
Preview
Product | Versions Compatible and additional computed target framework versions. |
---|---|
.NET | net7.0 is compatible. net7.0-android was computed. net7.0-ios was computed. net7.0-maccatalyst was computed. net7.0-macos was computed. net7.0-tvos was computed. net7.0-windows was computed. net8.0 was computed. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. |
-
net7.0
- Core (>= 1.0.0)
- ScriptContainer (>= 1.0.5-prerelease)
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.
Version | Downloads | Last updated |
---|---|---|
4.5.5 | 129 | 10/26/2024 |
4.5.4 | 69 | 10/26/2024 |
4.5.3 | 94 | 10/25/2024 |
4.5.2 | 69 | 10/24/2024 |
4.5.1 | 75 | 10/24/2024 |
4.5.0 | 76 | 10/24/2024 |
4.0.0 | 101 | 10/9/2024 |
3.3.0 | 90 | 10/6/2024 |
3.2.9 | 99 | 9/28/2024 |
3.2.8 | 89 | 9/25/2024 |
3.2.7 | 85 | 9/25/2024 |
3.2.6 | 77 | 9/25/2024 |
3.2.5 | 86 | 9/24/2024 |
3.2.4 | 136 | 8/27/2024 |
3.2.3 | 110 | 8/24/2024 |
3.2.2 | 111 | 8/19/2024 |
3.2.1 | 120 | 8/18/2024 |
3.2.0 | 113 | 8/16/2024 |
3.1.5 | 113 | 6/24/2024 |
3.1.4 | 130 | 6/2/2024 |
3.1.3 | 110 | 5/29/2024 |
3.1.2 | 108 | 5/26/2024 |
3.1.1 | 101 | 5/23/2024 |
3.1.0 | 132 | 5/21/2024 |
3.0.9 | 101 | 5/21/2024 |
3.0.8 | 138 | 3/25/2024 |
3.0.7 | 118 | 3/24/2024 |
3.0.6 | 108 | 3/20/2024 |
3.0.5 | 127 | 3/18/2024 |
3.0.4 | 106 | 3/18/2024 |
3.0.3 | 115 | 3/18/2024 |
3.0.1 | 111 | 3/17/2024 |
3.0.0 | 116 | 3/15/2024 |
2.0.7 | 115 | 3/14/2024 |
2.0.6 | 113 | 3/14/2024 |
2.0.5 | 100 | 3/7/2024 |
2.0.3 | 129 | 3/3/2024 |
2.0.2 | 110 | 3/3/2024 |
2.0.1 | 107 | 3/1/2024 |
2.0.0 | 107 | 2/26/2024 |
1.9.9 | 96 | 2/25/2024 |
1.9.8 | 105 | 2/24/2024 |
1.9.6 | 113 | 2/17/2024 |
1.9.5 | 105 | 2/17/2024 |
1.9.4 | 106 | 2/15/2024 |
1.9.3 | 138 | 2/11/2024 |
1.9.2 | 105 | 2/11/2024 |
1.9.1 | 93 | 2/11/2024 |
1.9.0 | 106 | 2/9/2024 |
1.8.9 | 126 | 2/8/2024 |
1.8.8 | 113 | 2/8/2024 |
1.8.7 | 111 | 2/5/2024 |
1.8.6 | 117 | 2/5/2024 |
1.8.5 | 126 | 1/28/2024 |
1.8.4 | 119 | 1/26/2024 |
1.8.3 | 100 | 1/26/2024 |
1.8.2 | 105 | 1/25/2024 |
1.8.1 | 133 | 1/18/2024 |
1.8.0 | 250 | 5/29/2023 |
1.7.9-prerelease | 152 | 3/12/2023 |
1.7.8-prerelease | 167 | 3/5/2023 |
1.7.7-prerelease | 147 | 2/24/2023 |
1.7.6-prerelease | 170 | 2/20/2023 |
1.7.5-prerelease | 149 | 2/14/2023 |
1.7.1-prerelease | 164 | 2/9/2023 |
1.7.0-prerelease | 152 | 2/5/2023 |
1.6.7-prerelease | 167 | 2/4/2023 |
1.6.6-prerelease | 182 | 2/1/2023 |
1.6.5-prerelease | 223 | 1/12/2023 |
1.6.4-prerelease | 154 | 1/8/2023 |
1.6.3-prerelease | 172 | 12/18/2022 |
1.6.2-prerelease | 165 | 12/4/2022 |
1.6.1-prerelease | 183 | 11/24/2022 |
1.6.0-prerelease | 178 | 11/19/2022 |
1.5.9-prerelease | 176 | 11/6/2022 |
1.5.6-prerelease | 186 | 11/3/2022 |
1.5.5-prerelease | 154 | 11/2/2022 |
1.5.3-prerelease | 165 | 10/29/2022 |
1.5.2-prerelease | 171 | 10/2/2022 |
1.5.1-prerelease | 183 | 10/2/2022 |
1.5.0-prerelease | 176 | 9/21/2022 |
1.4.0-prerelease | 181 | 8/7/2022 |
1.3.9-prerelease | 205 | 8/7/2022 |
1.3.8-prerelease | 204 | 8/7/2022 |
1.3.7-prerelease | 174 | 8/2/2022 |
1.3.6-prerelease | 165 | 8/1/2022 |
1.3.5-prerelease | 170 | 8/1/2022 |
1.3.4-prerelease | 173 | 8/1/2022 |
1.3.3-prerelease | 170 | 8/1/2022 |
1.3.2-prerelease | 183 | 7/29/2022 |
1.3.1-prerelease | 201 | 7/21/2022 |
1.3.0-prerelease | 188 | 7/13/2022 |
1.2.9-prerelease | 198 | 7/11/2022 |
1.2.8-prerelease | 179 | 7/9/2022 |
1.2.7-prerelease | 182 | 7/9/2022 |
1.2.6-prerelease | 203 | 7/7/2022 |
1.2.5-prerelease | 189 | 7/1/2022 |
1.2.4-prerelease | 215 | 5/8/2022 |
1.2.3-prerelease | 198 | 4/18/2022 |
1.2.2-prerelease | 184 | 4/17/2022 |
1.2.1-prerelease | 205 | 4/16/2022 |
1.2.0-prerelease | 190 | 4/16/2022 |
1.1.9-prerelease | 201 | 4/15/2022 |
1.1.8-prerelease | 188 | 4/15/2022 |
1.1.7-prerelease | 197 | 4/14/2022 |
1.1.6-prerelease | 199 | 4/12/2022 |
1.1.5-prerelease | 185 | 4/9/2022 |
1.1.4-prerelease | 182 | 4/7/2022 |
1.1.3-prerelease | 211 | 4/6/2022 |
1.1.2-prerelease | 168 | 4/5/2022 |
1.1.1-prerelease | 175 | 4/4/2022 |
1.1.0-prerelease | 193 | 4/3/2022 |
1.0.9-prerelease | 189 | 4/3/2022 |
1.0.8-prerelease | 206 | 4/3/2022 |
1.0.7-prerelease | 182 | 4/3/2022 |
1.0.6-prerelease | 196 | 4/3/2022 |
1.0.5-prerelease | 199 | 3/26/2022 |
1.0.0-prerelease | 197 | 3/24/2022 |