Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Dynamic Line chart in C# WPF Application

Tags:

c#

wpf

xaml

charts

Im developing one GUI in C#.Net under WPF.Actually its an application for serial communication with the embedded device,I want to show a line chart with the frequently recieved data.And also I should provide an option to save those charts and to give an option to print it.How can I draw this dynamically with the support of free libraries or softwares?

like image 527
Mukthi Avatar asked Aug 17 '11 09:08

Mukthi


1 Answers

I use Dynamic Data Display for all my WPF charting needs. It supports saving the charts, is very quick, provides seamless zooming and panning. Namespace: xmlns:d3="http://research.microsoft.com/DynamicDataDisplay/1.0"

XAML:

 <d3:ChartPlotter Name="plotter" Background="White">
    <d3:ChartPlotter.Resources>
        <conv:Date2AxisConverter x:Key="Date2AxisConverter"/>
    </d3:ChartPlotter.Resources>
    <d3:ChartPlotter.HorizontalAxis>
        <d3:HorizontalDateTimeAxis Name="dateAxis"/>
    </d3:ChartPlotter.HorizontalAxis>
    <d3:Header Content="{Binding PlotHeader}"/>
    <d3:VerticalAxisTitle Content="Value"/>
    <d3:HorizontalAxisTitle Content="Date"/>
</d3:ChartPlotter>

C# Code: Converter used

public class Date2AxisConverter : IValueConverter
{
    #region IValueConverter Members
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        if (value is DateTime && targetType == typeof(double))
        {
            return ((DateTime)value).Ticks / 10000000000.0;
            // See constructor of class Microsoft.Research.DynamicDataDisplay.Charts.DateTimeAxis
            // File: DynamicDataDisplay.Charts.Axes.DateTime.DateTimeAxis.cs

            // alternatively, see the internal class Microsoft.Research.DynamicDataDisplay.Charts.DateTimeToDoubleConversion

        }
        return null;
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        // try Microsoft.Research.DynamicDataDisplay.Charts.DateTimeAxis.DoubleToDate
        throw new NotSupportedException();
    }

    #endregion
}

C# Code: Clearing Graph and Creating line graph, Here my StockasticProcessPoint is a structure with a field "DateTime t" and a field "Double value".

using Microsoft.Research.DynamicDataDisplay;
using System.Collections.ObjectModel;
using Microsoft.Research.DynamicDataDisplay.DataSources;

public void ClearLines()
{
    var lgc = new Collection<IPlotterElement>();
    foreach (var x in plotter.Children)
    {
        if (x is LineGraph || x is ElementMarkerPointsGraph)
            lgc.Add(x);
    }

    foreach (var x in lgc)
    {
        plotter.Children.Remove(x);
    }
}

internal void SendToGraph() {

    IPointDataSource _eds = null;
    LineGraph line;

    ClearLines();

    EnumerableDataSource<StochasticProcessPoint> _edsSPP;
    _edsSPP = new EnumerableDataSource<StochasticProcessPoint>(myListOfStochasticProcessPoints);
    _edsSPP.SetXMapping(p => dateAxis.ConvertToDouble(p.t));
    _edsSPP.SetYMapping(p => p.value);
    _eds = _edsSPP;

    line = new LineGraph(_eds);
    line.LinePen = new Pen(Brushes.Black, 2);
    line.Description = new PenDescription(Description);
    plotter.Children.Add(line);
    plotter.FitToView();
}

With this, you should be able to plot a chart in WPF. Adding data live when it comes back from the serial port should be no problem. You can also look at the binding examples from DynamicDataDisplay.

like image 146
NetSquirrel Avatar answered Sep 22 '22 05:09

NetSquirrel