gpt4 book ai didi

wpf - 如何使用DynamicDataDisplay在wpf中的一个x-y平面中添加多个图形

转载 作者:行者123 更新时间:2023-12-03 10:34:04 25 4
gpt4 key购买 nike

我必须使用WPF创建多个像http://prntscr.com/dfn836这样的图形(一个平面上有4个图形,使用不同的颜色)。

我有DynamicDataDisplaySample,它只显示一个正弦图,但我的情况是我必须在同一x-y轴(电压-时间轴)上显示多个图(在这里说)。我设置了一些点以使两个图都在同一平面上。

  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 };

我对如何在一个Volt-Time轴上制作两个图形的想法是将两个图形的点相加,如下所示:
//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>

其他两类:
 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;
}
}

如何在一个x-y轴上绘制这两张图,就像开头所示的链接一样,在一个x-y轴上包含4张图。

最佳答案

基本上,您需要再次调用AddLineGraph以及相应的关联数据。我做了一些最小的修改,足以使其正常工作,包括您的数据。请看下面:

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
}

关于wpf - 如何使用DynamicDataDisplay在wpf中的一个x-y平面中添加多个图形,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40984082/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com