2016-12-05 3 views
1

WPFを使用して、http://prntscr.com/dfn836(複数のプレーンに4つのグラフがあります)を作成する必要があります。DynamicDataDisplayを使用してwpfの1つのx-y平面に複数のグラフを追加する方法

私は、正弦グラフを1つしか表示しないDynamicDataDisplaySampleを持っていますが、私の状況では同じx-y軸(電圧 - 時間軸)に複数のグラフを表示する必要があります。私は、両方のグラフを同じ平面上に作るためのポイントのセットを持っています。私はこのようなグラフの両方のためにポイントを追加さ​​れた1電圧時間軸に二つのグラフを作成する方法についての私の心の中に持っている何

List<double> points_x_y_Graph1 = new List<double>() { 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0, 0.1, 0.2, 0.3 }; 
    List<double> points_x_y_Graph2 = new List<double>() { 0.9, 0.8, 0.7, 0.6, 0.5, 0.4, 0.3, 0.2, 0.1, 0.0,0.1, 0.2, 0.3 }; 

//This is for first graph 
voltagePointCollection.Add(new VoltagePoint(points_x_y_Graph2[i], points_x_y_Graph2[i])); 
//This is for second Graph 
voltagePointCollection.Add(new VoltagePoint(points_x_y_Graph1[i], points_x_y_Graph1[i])); 

しかし、どのような私が見つけた(こちらを参照http://prntscr.com/dfsy5e)。

私の完全なコードは次のとおりです。

public partial class MainWindow : Window, INotifyPropertyChanged 
    { 
     List<double> points_x_y_Graph1 = new List<double>() { 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0, 0.1, 0.2, 0.3 }; 
     List<double> points_x_y_Graph2 = new List<double>() { 0.9, 0.8, 0.7, 0.6, 0.5, 0.4, 0.3, 0.2, 0.1, 0.0,0.1, 0.2, 0.3 }; 
     private int _maxVoltage; private int _minVoltage; 
     public int MaxVoltage 
     { 
      get { return _maxVoltage; } 
      set { _maxVoltage = value; this.OnPropertyChanged("MaxVoltage"); } 
     }  
     public int MinVoltage 
     { 
      get { return _minVoltage; } 
      set { _minVoltage = value; this.OnPropertyChanged("MinVoltage"); } 
     } 

     public VoltagePointCollection voltagePointCollection; 
     DispatcherTimer updateCollectionTimer; 
     private int i = 0; 

     public MainWindow() 
     { 
      InitializeComponent(); 
      this.DataContext = this; 

      voltagePointCollection = new VoltagePointCollection(); 

      updateCollectionTimer = new DispatcherTimer(); 
      updateCollectionTimer.Interval = TimeSpan.FromMilliseconds(10); 
      updateCollectionTimer.Tick += new EventHandler(updateCollectionTimer_Tick); 
      updateCollectionTimer.Start();   

      var ds = new EnumerableDataSource<VoltagePoint>(voltagePointCollection); 
      ds.SetXMapping(x => x.time); 
      ds.SetYMapping(y => y.Voltage); 

      plotter.AddLineGraph(ds, Colors.Green, 2, "Volts"); 
      MaxVoltage = 1; 
      MinVoltage = -1;    
     } 

     void updateCollectionTimer_Tick(object sender, EventArgs e) 
     { 
      if (i >= points_x_y.Count) 
      { i = 0; } 
     //For first graph 
     voltagePointCollection.Add(new VoltagePoint(points_x_y_Graph2[i], points_x_y_Graph2[i])); 
     //For second graph 
     voltagePointCollection.Add(new VoltagePoint(points_x_y_Graph1[i], points_x_y_Graph1[i])); // To add one more graph 
      i++; 
     }  

     #region INotifyPropertyChanged members 
     public event PropertyChangedEventHandler PropertyChanged; 
     protected void OnPropertyChanged(string propertyName) 
     { 
      if (PropertyChanged != null) 
       this.PropertyChanged(this, new System.ComponentModel.PropertyChangedEventArgs(propertyName)); 
     } 
     #endregion 
    } 

XAMLコード:

<Window x:Class="DynamicDataDisplaySample.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:d3="http://research.microsoft.com/DynamicDataDisplay/1.0" 
     Title="MainWindow" Height="600" Width="800"> 
    <Grid> 
     <d3:ChartPlotter x:Name="plotter" Grid.Row="1" Grid.Column="1"> 
      <d3:ChartPlotter.HorizontalAxis> 
       <d3:HorizontalDateTimeAxis Name="dateAxis"/> 
      </d3:ChartPlotter.HorizontalAxis> 
      <d3:Header FontFamily="Georgia" Content="Voltage chart"/> 
      <d3:VerticalAxisTitle FontFamily="Georgia" Content="Voltage [V]" /> 
      <d3:HorizontalAxisTitle FontFamily="Georgia" Content="Time"/> 
      <d3:HorizontalLine Value="{Binding MaxVoltage}" Stroke="Red" StrokeThickness="2"/> 
      <d3:HorizontalLine Value="{Binding MinVoltage}" Stroke="Red" StrokeThickness="2"/> 
     </d3:ChartPlotter> 
    </Grid> 
</Window> 

他の二つのクラス:1つのXY軸にグラフのこれらの二つのグラフを作成する方法

public class VoltagePointCollection : RingArray <VoltagePoint> 
    { 
     private const int TOTAL_POINTS = 300; 

     public VoltagePointCollection() 
      : base(TOTAL_POINTS) // here i set how much values to show 
     {  
     } 
    } 

    public class VoltagePoint 
    {   
     public DateTime Date { get; set; } 
     public double time { get; set; } 

     public double Voltage { get; set; } 

     public VoltagePoint(double voltage, double time) 
     { 
      this.Voltage = voltage; 
      this.time = time; 
     } 
    } 

1つのxy軸に4つのグラフを含む開始時に示されたリンクのように。

答えて

1

基本的には、AddLineGraphへの2番目の呼び出しと、対応する関連データが必要です。私はあなたのデータを含め、それを動作させるのに十分なだけの最小限の修正を加えました。以下を参照してください:

enter image description here

XAML:

<Grid> 
    <d3:ChartPlotter x:Name="plotter" Grid.Row="1" Grid.Column="1"> 
     <!-- 
     <d3:ChartPlotter.HorizontalAxis> 
      <d3:HorizontalDateTimeAxis Name="dateAxis"/> 
     </d3:ChartPlotter.HorizontalAxis> 
     --> 
     <d3:Header FontFamily="Georgia" Content="Voltage chart"/> 
     <d3:VerticalAxisTitle FontFamily="Georgia" Content="Voltage [V]" /> 
     <d3:HorizontalAxisTitle FontFamily="Georgia" Content="Time"/> 
     <d3:HorizontalLine Value="{Binding MaxVoltage}" Stroke="Red" StrokeThickness="2"/> 
     <d3:HorizontalLine Value="{Binding MinVoltage}" Stroke="Red" StrokeThickness="2"/> 
    </d3:ChartPlotter> 
</Grid> 

メインウィンドウ:

public partial class MainWindow : Window, INotifyPropertyChanged 
{ 
    List<double> points_x_y_Graph1 = new List<double>() { 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0, 0.9, 0.8, 0.7 }; 
    List<double> points_x_y_Graph2 = new List<double>() { 0.9, 0.8, 0.7, 0.6, 0.5, 0.4, 0.3, 0.2, 0.1, 0.0, 0.1, 0.2, 0.3 }; 
    private int _maxVoltage; private int _minVoltage; 

    public int MaxVoltage 
    { 
     get { return _maxVoltage; } 
     set { _maxVoltage = value; this.OnPropertyChanged("MaxVoltage"); } 
    } 
    public int MinVoltage 
    { 
     get { return _minVoltage; } 
     set { _minVoltage = value; this.OnPropertyChanged("MinVoltage"); } 
    } 

    public VoltagePointCollection voltagePointCollection1; 
    public VoltagePointCollection voltagePointCollection2; 
    DispatcherTimer updateCollectionTimer; 
    private int i = 0; 

    public MainWindow() 
    { 
     InitializeComponent(); 
     this.DataContext = this; 


     updateCollectionTimer = new DispatcherTimer(); 
     updateCollectionTimer.Interval = TimeSpan.FromMilliseconds(500); 
     updateCollectionTimer.Tick += new EventHandler(updateCollectionTimer_Tick); 
     updateCollectionTimer.Start(); 

     voltagePointCollection1 = new VoltagePointCollection(); 
     var ds1 = new EnumerableDataSource<VoltagePoint>(voltagePointCollection1); 
     ds1.SetXMapping(x => x.time); 
     ds1.SetYMapping(y => y.Voltage); 

     plotter.AddLineGraph(ds1, Colors.Green, 2, "Volts 1"); 
     MaxVoltage = 1; 
     MinVoltage = -1; 

     voltagePointCollection2 = new VoltagePointCollection(); 
     var ds2 = new EnumerableDataSource<VoltagePoint>(voltagePointCollection2); 
     ds2.SetXMapping(x => x.time); 
     ds2.SetYMapping(y => y.Voltage); 

     plotter.AddLineGraph(ds2, Colors.Blue, 2, "Volts 2"); 
    } 

    void updateCollectionTimer_Tick(object sender, EventArgs e) 
    { 
     if (i < points_x_y_Graph1.Count) 
     { 
      //{ i = 0; } 
      //For first graph 
      voltagePointCollection1.Add(new VoltagePoint(points_x_y_Graph1[i], i)); 
      //For second graph 
      voltagePointCollection2.Add(new VoltagePoint(points_x_y_Graph2[i], i)); // To add one more graph 
      i++; 
     } 
    } 

    #region INotifyPropertyChanged members 
    public event PropertyChangedEventHandler PropertyChanged; 
    protected void OnPropertyChanged(string propertyName) 
    { 
     if (PropertyChanged != null) 
      this.PropertyChanged(this, new System.ComponentModel.PropertyChangedEventArgs(propertyName)); 
    } 
    #endregion 
} 
関連する問題