We always like to group smaller pie chart values into the category "Others" to increase chart readability. But we also think about ways to show those grouped values in UI.
In this example illustrates how to show grouped values of Xamarin.Forms Pie Chart using tooltip by these following ways, you can display the average of clustered values, either can display the individual value present in it.
The below code example shows how to calculate and display the average of grouped value using the tooltip template.
public class ChartAvgValueConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if (value != null)
{
//Return string value.
if (parameter != null && parameter.ToString() == "Label")
{
return value is List<object> ? "Others" : (value as DataModel).XData;
}
else
{
//Return average value.
if (value is List<object>)
{
var collection = value as List<object>;
var sum = collection.Sum(item => (item as DataModel).YData);
return sum / collection.Count;
}
else
{
return (value as DataModel).YData;
}
}
}
return null;
}
}
<ContentView.Resources>
<local:ChartAvgValueConverter x:Key="sumOfValuesConverter"/>
<DataTemplate x:Key="TooltipTemplate">
<StackLayout Orientation="Horizontal">
<Label Text="{Binding Converter={StaticResource sumOfValuesConverter}, ConverterParameter='Label'}". . />
<Label Text="{Binding Converter={StaticResource sumOfValuesConverter}}" ../>
</StackLayout>
</DataTemplate>
</ContentView.Resources>
<chart:SfChart BackgroundColor="Transparent">
. . .
<chart:SfChart.Series>
<chart:PieSeries
ItemsSource="{Binding MonthlyExpenses}"
XBindingPath="XData"
YBindingPath="YData"
EnableTooltip="true"
GroupMode="Value"
GroupTo="50"
TooltipTemplate="{StaticResource TooltipTemplate}"
>
</chart:PieSeries>
</chart:SfChart.Series>
<chart:SfChart.ChartBehaviors>
<chart:ChartTooltipBehavior BackgroundColor="LightBlue
</chart:SfChart.ChartBehaviors>
</chart:SfChart>
The below code example shows how to display the values, which present inside the group ‘Others’.
public class ChartValueConverter : IValueConverter
{
//Which returns ItemsSource for bindable layout.
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if(value != null)
{
IList<DataModel> dataList = new List<DataModel>();
if (value is DataModel)
{
dataList.Add(value as DataModel);
return dataList;
}
else
{
return value;
}
}
return value;
}
}
<ContentView.Resources>
<local:ChartValueConverter x:Key="itemsSourceConverter"/>
<DataTemplate x:Key="TooltipTemplate">
<StackLayout BindableLayout.ItemsSource="{Binding Converter={StaticResource itemsSourceConverter}}" >
<BindableLayout.ItemTemplate>
<DataTemplate>
<StackLayout Orientation="Horizontal" HorizontalOptions="FillAndExpand">
<Label Text="{Binding XData}" HorizontalTextAlignment="Center"/>
<Label Text="{Binding YData}" HorizontalTextAlignment="Center"/>
</StackLayout>
</DataTemplate>
</BindableLayout.ItemTemplate>
</StackLayout>
</DataTemplate>
</ContentView.Resources>
<chart:SfChart BackgroundColor="Transparent">
. . .
<chart:SfChart.Series>
<chart:PieSeries . . .
EnableTooltip="true"
GroupMode="Value"
GroupTo="50"
TooltipTemplate="{StaticResource TooltipTemplate}"
>
. . .
</chart:PieSeries>
</chart:SfChart.Series>
<chart:SfChart.ChartBehaviors>
<chart:ChartTooltipBehavior BackgroundColor="LightBlue
</chart:SfChart.ChartBehaviors>
</chart:SfChart>
KB article - How to bind the Xamarin.Forms pie chart tooltip to “Others” category values
Group small data points into “others”
Bindable Layouts in Xamarin.Forms