namespace ParallelCoordinates
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
///
public partial class MainWindow : Window
{
//List of persons
private List<BasicPersonInfo> m_listPersons = new List<BasicPersonInfo>();
private int AttributeCount = 6;
public MainWindow()
{
InitializeComponent();
//Create person attributes data, some info gathered when visiting a nurse
m_listPersons.Add(new BasicPersonInfo(70, 175, EyeColor.Brown, 25, 125, 70));
m_listPersons.Add(new BasicPersonInfo(85, 160, EyeColor.Blue, 48, 168, 92));
m_listPersons.Add(new BasicPersonInfo(68, 169, EyeColor.Blue, 32, 151, 84));
m_listPersons.Add(new BasicPersonInfo(90, 186, EyeColor.Gray, 40, 132, 77));
m_listPersons.Add(new BasicPersonInfo(48, 155, EyeColor.Green, 22, 115, 68));
CreateChart();
}
private void CreateChart()
{
m_chart.BeginUpdate();
//Chart parent must be set
// m_chart.Parent = this;
//Fill parent area with chart
//(Content as Grid).Children.Add(m_chart); ;
//Chart name
// m_chart.Name = "Parallel coordinates chart";
//Hide legend box
m_chart.ViewXY.AutoSpaceLegendBoxes = true;
//Create an Y axis for each attribute
m_chart.ViewXY.YAxes.Clear();
double dPositionInterval = 100.0 / ((double)AttributeCount - 1.0); //interval of categories in range 0...100
//Weight axis. This is the 'master' axis
AxisY axisYWeight = new AxisY(m_chart.ViewXY);
axisYWeight.SetRange(40, 100);
axisYWeight.Title.Text = "Weight / kg";
axisYWeight.Position = m_chart.ViewXY.YAxes.Count * dPositionInterval;
m_chart.ViewXY.YAxes.Add(axisYWeight);
//Height axis, 'slave' axis
AxisY axisYHeight = new AxisY(m_chart.ViewXY);
axisYHeight.SetRange(140, 200);
axisYHeight.Title.Text = "Height / cm";
axisYHeight.Position = m_chart.ViewXY.YAxes.Count * dPositionInterval;
m_chart.ViewXY.YAxes.Add(axisYHeight);
//Eye color axis 'slave' axis
AxisY axisYEyeColor = new AxisY(m_chart.ViewXY);
axisYEyeColor.SetRange(1, 4);
axisYEyeColor.Title.Text = "Eye color";
axisYEyeColor.CustomTicks.AddRange(new List<CustomAxisTick>()
{
new CustomAxisTick (axisYEyeColor, 1, "Blue"),
new CustomAxisTick(axisYEyeColor,2, "Brown"),
new CustomAxisTick(axisYEyeColor,3, "Green"),
new CustomAxisTick(axisYEyeColor,4, "Gray"),
});
axisYEyeColor.CustomTicksEnabled = true;
axisYEyeColor.AutoFormatLabels = false;
axisYEyeColor.Position = m_chart.ViewXY.YAxes.Count * dPositionInterval;
m_chart.ViewXY.YAxes.Add(axisYEyeColor);
//Age axis 'slave' axis
AxisY axisYAge = new AxisY(m_chart.ViewXY);
axisYAge.SetRange(10, 90);
axisYAge.Title.Text = "Age / years";
axisYAge.Position = m_chart.ViewXY.YAxes.Count * dPositionInterval;
m_chart.ViewXY.YAxes.Add(axisYAge);
//Blood pressure, systolic, 'slave' axis
AxisY axisYBpSys = new AxisY(m_chart.ViewXY);
axisYBpSys.SetRange(60, 180);
axisYBpSys.Title.Text = "Blood pressure (sys)/ mmHg ";
axisYBpSys.Position = m_chart.ViewXY.YAxes.Count * dPositionInterval;
m_chart.ViewXY.YAxes.Add(axisYBpSys);
//Blood pressure, diastolic, 'slave' axis
AxisY axisYBpDia = new AxisY(m_chart.ViewXY);
axisYBpDia.SetRange(60, 180);
axisYBpDia.Title.Text = "Blood pressure (dia)/ mmHg ";
axisYBpDia.Position = m_chart.ViewXY.YAxes.Count * dPositionInterval;
m_chart.ViewXY.YAxes.Add(axisYBpDia);
foreach (AxisY axisY in m_chart.ViewXY.YAxes)
{
axisY.MajorGrid.Visible = false;
axisY.AxisThickness = 1;
axisY.RangeChanged += AxisY_RangeChanged;
//axisY.RangeChanged += new AxisBase.RangeChangedHandler(axisY_RangeChanged);
}
//Setup x-axis
m_chart.ViewXY.XAxes[0].Visible = false;
m_chart.ViewXY.XAxes[0].SetRange(0, 5);
//Disable X zooming and panning
m_chart.ViewXY.ZoomPanOptions.RectangleZoomDirection = RectangleZoomDirection.Vertical;
m_chart.ViewXY.ZoomPanOptions.PanDirection = PanDirection.Vertical;
m_chart.ViewXY.ZoomPanOptions.MouseWheelZooming = MouseWheelZooming.Vertical;
//Turn of automatic Y axis placement so we can place them manually with Position property
m_chart.ViewXY.AxisLayout.YAxisAutoPlacement = YAxisAutoPlacement.Off;
int iPerson = 0;
//Add series for each person and bind them to the first Y axis
foreach (BasicPersonInfo person in m_listPersons)
{
PointLineSeries pls = new PointLineSeries(m_chart.ViewXY, m_chart.ViewXY.XAxes[0], m_chart.ViewXY.YAxes[0]);
pls.PointsVisible = true;
pls.Title.Text = "Person" + (iPerson + 1).ToString();
SeriesPointCollection aPoints = new SeriesPointCollection();
double[] attributeValues = person.GetValues();
for (int iAttrib = 0; iAttrib < AttributeCount; iAttrib++)
{
SeriesPoint seriesPoint = new SeriesPoint();
seriesPoint.X = iAttrib;
seriesPoint.Y = ScaleToMasterAxis(iAttrib, attributeValues[iAttrib]);
aPoints.Add(seriesPoint);
}
pls.LineStyle.Color = DefaultColors.SeriesForBlackBackgroundWpf[iPerson];
pls.PointStyle.Color1 = DefaultColors.SeriesForBlackBackgroundWpf[iPerson];
pls.Points = aPoints;
//Add the created point line series into PointLineSeries list
m_chart.ViewXY.PointLineSeries.Add(pls);
iPerson++;
}
//Allow chart rendering
m_chart.EndUpdate();
}
private void AxisY_RangeChanged(object sender, RangeChangedEventArgs e)
{
m_chart.BeginUpdate();
int iPerson = 0;
foreach (BasicPersonInfo person in m_listPersons)
{
double[] attribValues = person.GetValues();
PointLineSeries series = m_chart.ViewXY.PointLineSeries[iPerson];
//Update all other attributes, to master axis scale
for (int iAttrib = 1; iAttrib < AttributeCount; iAttrib++)
{
series.Points[iAttrib].Y = ScaleToMasterAxis(iAttrib, attribValues[iAttrib]);
}
series.InvalidateData();
iPerson++;
}
}
public class BasicPersonInfo
{
public double Weight_kg;
public double Height_cm;
public EyeColor ColorOfEyes;
public int Age;
public double BloodPressureSystolic_mmHg;
public double BloodPressureDiastolic_mmHg;
public BasicPersonInfo(double weight, double height, EyeColor colorOfEyes, int age, double bpSys, double bpDia)
{
this.Weight_kg = weight;
this.Height_cm = height;
this.ColorOfEyes = colorOfEyes;
this.Age = age;
this.BloodPressureSystolic_mmHg = bpSys;
this.BloodPressureDiastolic_mmHg = bpDia;
}
public double[] GetValues()
{
return new double[] { this.Weight_kg, this.Height_cm, (double)this.ColorOfEyes, this.Age, this.BloodPressureSystolic_mmHg, this.BloodPressureDiastolic_mmHg };
}
}
public enum EyeColor
{
Blue = 1,
Brown,
Green,
Gray,
}
double ScaleToMasterAxis(int attributeIndex, double value)
{
AxisY masterAxis = m_chart.ViewXY.YAxes[0];
AxisY attributeAxis = m_chart.ViewXY.YAxes[attributeIndex];
float fYCoord = attributeAxis.ValueToCoord(value);
double dYValueOnMasterAxis = 0;
masterAxis.CoordToValue(fYCoord, out dYValueOnMasterAxis);
return dYValueOnMasterAxis;
}
}
}
This is my code I am trying to make Parallel coordinates but my Scaletomatrix is always returning 100 due to which lines are not creating please help me