/// <summary> /// バーチャートに要素を追加します /// </summary> /// <param name="frame">Frame.</param> /// <param name="barData">Bar data.</param> public void AddBarElement(Vector2 xRangeRate, float yValueRate, LabelData.Label label) { var barElement = new GameObject("bar"); barElement.transform.parent = frame; var image = barElement.AddComponent <Image>(); image.color = label.GetColor(); //RectTransform初期化 image.rectTransform.anchorMax = new Vector2(1f, 1f); image.rectTransform.anchorMin = new Vector2(0, 0); image.rectTransform.offsetMin = new Vector2(0, 0); image.rectTransform.offsetMax = new Vector2(0, 0); image.rectTransform.localScale = Vector3.one; image.rectTransform.localPosition = Vector3.zero; //指定の位置・大きさに設定 //RectTransformのアンカーがストレッチで設定しているため、位置・大きさの指定を以下のようにする float left = xRangeRate.x * frame.rect.width; //親となるフレームの左端からどれだけ離れた位置か float right = (1f - xRangeRate.y) * frame.rect.width; //・・・右端から float top = (1f - yValueRate) * frame.rect.height; //・・・上から float bottom = 0; //・・・下から image.rectTransform.offsetMin = new Vector2(left, bottom); image.rectTransform.offsetMax = new Vector2(-1f * right, -1f * top); //-1をかけるのは仕様なので仕方ない if (label.IsUseTexture) { image.sprite = label.Texture; image.type = Image.Type.Tiled; } barElementList.Add(image); }
//取得した、いびきの大きさのデータをグラフに表示しやすいようにラベルデータへ変換する List <LabelData> TransSensingDataToLabelData(List <IbikiGraph.Data> dataList) { List <LabelData> labelDataList = new List <LabelData>(); foreach (IbikiGraph.Data data in dataList) { LabelData.Label label = TransIbikiLoudnessToLabel(data.SnoreVolume2); //ラベルの名前と色を設定する labelDataList.Add(new LabelData(data.SnoreVolume2, label)); } return(labelDataList); }
/// <summary> /// グラフにデータを設定します。 /// 全てのデータを設定してください。 /// </summary> /// <param name="wholeValue">Whole value.</param> /// <param name="contents">Contents.</param> public void SetPercentageData(float wholeValue, List <LabelData> contents) { ClearBarElements(); float currentSum = 0; for (int i = 0; i < contents.Count; i++) { Vector2 xRangeRate = new Vector2(currentSum, currentSum + contents [i].GetValue()) / wholeValue; //始点~終点 currentSum += contents [i].GetValue(); float yValueRate = 1f; //固定で1 LabelData.Label label = contents [i].GetLabel(); AddBarElement(xRangeRate, yValueRate, label); } }
//呼吸のデータを集計用グラフに出力 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); }