FlexChart を使用すると、色分けされたゾーンと呼ばれる領域を作成してチャートに適用できます。この色分けされたゾーンにより、チャートにプロットされたデータポイントがいくつかの領域に分類され、ユーザーは容易にデータを読み取って理解できるようになります。ユーザーは、特定のデータポイントが属するカテゴリを簡単に特定できます。
ゾーンの作成がどのように役立つかを説明するために、顧客が特定の製品の推奨者か、中立者か、批判者かの識別を目的とした顧客満足度調査を考えます。調査で記録された回答から NPS(ネットプロモータースコア)を計算することで、顧客を推奨者、中立者、批判者に分類できます。このシナリオは FlexChart で実現できます。具体的には、顧客の回答をデータポイントとしてチャートにプロットし、プロットされたデータポイントを面グラフで色分けされたゾーンに分類します。ゾーンは線タイプのデータ系列で区切られます。
FlexChart では、ChartSeries クラスに基づくデータ系列としてゾーンを作成できます。各ゾーンは面グラフとして作成できます。それには、ChartType プロパティを Area に設定し、それぞれを固有の色で強調表示します。各ゾーンを区切るために、線タイプのデータ系列をしきい値としてチャートに作成できます。
FlexChart にゾーンを作成するには、次の手順を実行します。
手順 1:調査結果データを記録するクラスを作成します
C# |
コードのコピー
|
---|---|
public class SurveyResult { public int surveyNumber { get; set; } public int satisfaction { get; set; } public SurveyResult(int surveyNumber, int satisfaction) { this.surveyNumber = surveyNumber; this.satisfaction = satisfaction; } } |
手順 2:FlexChart コントロールを初期化します
XAML |
コードのコピー
|
---|---|
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" xmlns:c1="clr-namespace:C1.Xamarin.Forms.Chart;assembly=C1.Xamarin.Forms.Chart" x:Class="QuickstartChart.SurveyZones"> <StackLayout> <Label x:Name="lbl" HorizontalOptions="Center" Font="Large"/> <Grid VerticalOptions="FillAndExpand" > <c1:FlexChart x:Name="flex" BindingX="surveyNumber" VerticalOptions="FillAndExpand" ChartType="Scatter" Grid.Row="0"> <c1:FlexChart.AxisX> <c1:ChartAxis AxisLine="false" MajorGrid="false" Title="調査番号" /> </c1:FlexChart.AxisX> <c1:FlexChart.AxisY> <c1:ChartAxis Title="満足度スコア" Max="10"/> </c1:FlexChart.AxisY> </c1:FlexChart> </Grid> </StackLayout> </ContentPage> |
手順 3:データを連結し、ゾーンを作成します
C# |
コードのコピー
|
---|---|
using Xamarin.Forms; using C1.Xamarin.Forms.Chart; using System.Collections.ObjectModel; |
C# |
コードのコピー
|
---|---|
public partial class SurveyZones : ContentPage { public SurveyZones() { InitializeComponent(); //顧客調査結果 int[] scores = { 8, 9, 9, 10, 3, 10, 6, 10, 7, 9 }; ObservableCollection<SurveyResult> results = new ObservableCollection<SurveyResult>(); flex.ItemsSource = results; Point[] zone1 = new Point[10]; Point[] zone2 = new Point[10]; Point[] zone3 = new Point[10]; ; Point[] threshold1 = new Point[10]; Point[] threshold2 = new Point[10]; //ゾーンとしきい値のポイントを設定します for (int i = 0; i < 10; i++) { results.Add(new SurveyResult(i, scores[i])); zone1[i] = new Point(i, 10); zone2[i] = new Point(i, 9); zone3[i] = new Point(i, 7); threshold1[i] = new Point(i, 9); threshold2[i] = new Point(i, 7); } //推奨者のゾーン 1 var seriesZone1 = new ChartSeries(); seriesZone1.ItemsSource = zone1; seriesZone1.Binding = "Y"; seriesZone1.BindingX = "X"; seriesZone1.ChartType = C1.Xamarin.Forms.Chart.ChartType.Area; seriesZone1.SeriesName = "推奨者"; //中立者のゾーン 2 var seriesZone2 = new ChartSeries(); seriesZone2.ItemsSource = zone2; seriesZone2.Binding = "Y"; seriesZone2.BindingX = "X"; seriesZone2.ChartType = ChartType.Area; seriesZone2.SeriesName = "中立者"; //批判者のゾーン 3 var seriesZone3 = new ChartSeries(); seriesZone3.ItemsSource = zone3; seriesZone3.Binding = "Y"; seriesZone3.BindingX = "X"; seriesZone3.ChartType = ChartType.Area; seriesZone3.SeriesName = "批判者"; flex.Series.Add(seriesZone1); flex.Series.Add(seriesZone2); flex.Series.Add(seriesZone3); //推奨者のしきい値線 var seriesThreshold1 = new ChartSeries(); seriesThreshold1.ItemsSource = threshold1; seriesThreshold1.Binding = "Y"; seriesThreshold1.BindingX = "X"; seriesThreshold1.SeriesName = "推奨者のしきい値"; seriesThreshold1.ChartType = ChartType.Line; //中立者のしきい値線 var seriesThreshold2 = new ChartSeries(); seriesThreshold2.ItemsSource = threshold2; seriesThreshold2.Binding = "Y"; seriesThreshold2.BindingX = "X"; seriesThreshold2.SeriesName = "中立者のしきい値"; flex.Series.Add(seriesThreshold1); flex.Series.Add(seriesThreshold2); //顧客満足度結果を追加します var satisfactionSeries = new ChartSeries(); satisfactionSeries.SeriesName = "Satisfaction"; satisfactionSeries.Binding = "satisfaction"; flex.Series.Add(satisfactionSeries); lbl.Text = "NPS スコア " + GetNPS(scores).ToString(); } public double GetNPS(int[] scores) { double promoter = 0; double detractor = 0; foreach (int score in scores) { if (score >= 9) { promoter++; } else if (score < 7) { detractor++; } } double nps = ((promoter - detractor) / scores.Length) * 100; return nps; } } |