//呼吸のデータを集計用グラフに出力 void SetBreathDataToPercentageBarChart(List <Data> breathDataList) { //頭の向きで最も要素数が大きいものを探す(異常データは含まない) int maxHeadDirCount = 0; foreach (SleepData.HeadDir headDir in System.Enum.GetValues(typeof(SleepData.HeadDir))) { int count = 0; // 0~10秒 count += breathDataList .Where(data => data.HeadDir1 == headDir) .Where(data => data.GetBreathState1() != SleepData.BreathState.Empty) //異常データをはじく .Count(); // 11~20秒 count += breathDataList .Where(data => data.HeadDir2 == headDir) .Where(data => data.GetBreathState2() != SleepData.BreathState.Empty) //異常データをはじく .Count(); // 21~13秒 count += breathDataList .Where(data => data.HeadDir3 == headDir) .Where(data => data.GetBreathState3() != SleepData.BreathState.Empty) //異常データをはじく .Count(); maxHeadDirCount = count > maxHeadDirCount ? count : maxHeadDirCount; } //呼吸状態をグラフに表示する順番に並べ替え SleepData.BreathState[] sortedBreathState = { SleepData.BreathState.Normal, SleepData.BreathState.Snore, SleepData.BreathState.Apnea }; int addCount = 0; //グラフの右端に余裕を持たせるために追加する値 foreach (SleepData.HeadDir headDir in System.Enum.GetValues(typeof(SleepData.HeadDir))) { //体の向きそれぞれに対して処理を行う List <LabelData> labelDataList = new List <LabelData>(); foreach (SleepData.BreathState breathState in sortedBreathState) { //呼吸状態それぞれに対して処理を行う //体の向きが合致して、なおかつ呼吸状態も合致するデータの個数を求める int value = 0; // 0~10秒 value += breathDataList.Where( data => data.HeadDir1.Equals(headDir) && data.GetBreathState1().Equals(breathState) ).Count(); // 11~20秒 value += breathDataList.Where( data => data.HeadDir2.Equals(headDir) && data.GetBreathState2().Equals(breathState) ).Count(); // 21~30秒 value += breathDataList.Where( data => data.HeadDir3.Equals(headDir) && data.GetBreathState3().Equals(breathState) ).Count(); if (value == 0) { continue; } LabelData.Label label = this.breathLabelList .Where( l => l.GetBreathState().Equals(breathState)) .First().GetLabel(); labelDataList.Add(new LabelData(value, label)); } PercetageBarChart output = null; //呼吸データを体の向きごとに集計したものをグラフに出力する switch (headDir) { case SleepData.HeadDir.Left: output = Output_Percentage_Left; break; case SleepData.HeadDir.Up: output = Output_Percentage_Up; break; case SleepData.HeadDir.Right: output = Output_Percentage_Right; break; case SleepData.HeadDir.Down: output = Output_Percentage_Down; break; } addCount = maxHeadDirCount / 9; //1割空白を作成するように output.SetPercentageData(maxHeadDirCount + addCount, labelDataList); } //データ個数からラベルとして表示するための時間を算出します // 呼吸状態のデータ数が3倍になったため、3で割って正しい時間に直している int hour = ((maxHeadDirCount + addCount) / 2) / 3 / 60; int min = ((maxHeadDirCount + addCount) / 2) / 3 % 60; int sec = ((maxHeadDirCount + addCount) % 2) / 3 * 30; Output_AggrigateTimeLabel.SetAxis(hour, min, sec); }
//いびきのデータを集計用グラフに出力 void SetBreathDataToPercentageBarChart(List <Data> ibikiDataList) { //頭の向きで最も要素数が大きいものを探す int maxHeadDirCount = 0; foreach (SleepData.HeadDir headDir in System.Enum.GetValues(typeof(SleepData.HeadDir))) { int count = 0; count += ibikiDataList.Where(data => data.HeadDir1 == headDir).Count(); count += ibikiDataList.Where(data => data.HeadDir2 == headDir).Count(); count += ibikiDataList.Where(data => data.HeadDir3 == headDir).Count(); maxHeadDirCount = count > maxHeadDirCount ? count : maxHeadDirCount; } int addCount = 0; //グラフの右端に余裕を持たせるために追加する値 foreach (SleepData.HeadDir headDir in System.Enum.GetValues(typeof(SleepData.HeadDir))) { //体の向きそれぞれに対して処理を行う List <LabelData> labelDataList = new List <LabelData>(); foreach (IbikiLebel ibikiLebel in ibikiLebelList) { //いびきのレベルそれぞれに対して処理を行う //体の向きが合致して、なおかついびきレベルも合致するデータの個数を求める int value = 0; value += ibikiDataList.Where( data => (data.HeadDir1.Equals(headDir) && TransIbikiLoudnessToLabel(data.SnoreVolume1).GetName().Equals(ibikiLebel.GetLabel().GetName())) ).Count(); value += ibikiDataList.Where( data => (data.HeadDir2.Equals(headDir) && TransIbikiLoudnessToLabel(data.SnoreVolume2).GetName().Equals(ibikiLebel.GetLabel().GetName())) ).Count(); value += ibikiDataList.Where( data => (data.HeadDir3.Equals(headDir) && TransIbikiLoudnessToLabel(data.SnoreVolume3).GetName().Equals(ibikiLebel.GetLabel().GetName())) ).Count(); if (value == 0) { continue; } LabelData.Label label = ibikiLebel.GetLabel(); labelDataList.Add(new LabelData(value, label)); } PercetageBarChart output = null; //呼吸データを体の向きごとに集計したものをグラフに出力する switch (headDir) { case SleepData.HeadDir.Left: output = Output_Percentage_Left; break; case SleepData.HeadDir.Up: output = Output_Percentage_Up; break; case SleepData.HeadDir.Right: output = Output_Percentage_Right; break; case SleepData.HeadDir.Down: output = Output_Percentage_Down; break; } addCount = maxHeadDirCount / 9; //1割空白を作成するように output.SetPercentageData(maxHeadDirCount + addCount, labelDataList); } //データ個数からラベルとして表示するための時間を算出します // 体の向きのデータ個数が3倍になったため、3で割っている int hour = ((maxHeadDirCount + addCount) / 2) / 3 / 60; int min = ((maxHeadDirCount + addCount) / 2) / 3 % 60; int sec = ((maxHeadDirCount + addCount) % 2) / 3 * 30; //Output_AggrigateTimeLabel.SetAxis(hour, min, sec); }