# Data Aggregation | WPF Controls | DevExpress Documentation

The Chart Control can use an aggregate function to group raw data source values and show aggregates as series points. You can use aggregation to show grouped data and decrease the number of visible points in a chart. Data aggregation is only available for argument [axes](/WPF/6334/controls-and-libraries/charts-suite/chart-control/axes/axes) (x-axes).

![Aggregated Data](/WPF/images/chart-control/aggregation-preview.png)

Note

**26.1 Demo Center:** [Launch the Data Aggregation demo](dxdemo://Wpf/DXCharts/MainDemo/DataAggregationDemo)

- Aggregation vs Summaries
- Aggregation Basics
- Aggregate Date-Time Data
- Aggregate Time-Span Data
- Aggregate Numeric Data
- Aggregate Qualitative Data
- Aggregate an Individual Series’s Data
- Create a Custom Aggregate Function

## Aggregation vs Summaries

In addition to **Aggregation**, the Chart Control provides [Summaries](/WPF/400970/controls-and-libraries/charts-suite/chart-control/calculate-summaries) that also allow you to group raw data values. 

|  | Aggregation | Summary |
| --- | --- | --- |
| **Store Data** | Chart stores raw data source values. | Chart stores summarized values. |
| **Change Detail Level** | Chart re-calculates data in memory. | Chart re-loads data from the data source. |
| **Behave on Zoom** | If the automatic scale options are used, Chart recalculates value aggregates when it is zoomed. | Chart does not re-calculate aggregated values when it is zoomed. |
| **Memory Consumption** | High | Low |

## Aggregation Basics

When the *aggregation* is enabled, the chart splits the [x-axis](/WPF/6334/controls-and-libraries/charts-suite/chart-control/axes/axes) into intervals (the x-axis measurement unit value defines the intervals), and uses an aggregate function to aggregate data for each interval.

The [AggregateFunction](/WPF/DevExpress.Xpf.Charts.AggregateFunction) enumeration lists the available aggregate functions:

- *Average* (a default function)
- *Count*
- *Financial* (Use it for [financial](/WPF/8351/controls-and-libraries/charts-suite/chart-control/series/2d-series-types/financial-series) series.)
- *Histogram* (See the [Histogram](/WPF/400974/controls-and-libraries/charts-suite/chart-control/histogram) topic for more information.)
- *Maximum*
- *Minimum*
- *Sum*
- *Custom* (Refer to the Create an Aggregate Function section for more information.)

Scale options assigned to the x-axis’s ~**ScaleOptions** property store aggregation-related settings. You can use the following option types:

| Options | Description | How to use |
| --- | --- | --- |
| **Automatic Date-Time**, **Automatic Time-Span**, and **Automatic Numeric** | The chart control defines the optimal measurement unit for an axis based on the data set’s values, the Chart Control’s current size, and zoom level. | **For date-time axes.** Assign a <br>[AutomaticDateTimeScaleOptions](/WPF/DevExpress.Xpf.Charts.AutomaticDateTimeScaleOptions) object to the [AxisX2D.DateTimeScaleOptions](/WPF/DevExpress.Xpf.Charts.AxisX2D.DateTimeScaleOptions), [AxisX3D.DateTimeScaleOptions](/WPF/DevExpress.Xpf.Charts.AxisX3D.DateTimeScaleOptions) or [RadarAxisX2D.DateTimeScaleOptions](/WPF/DevExpress.Xpf.Charts.RadarAxisX2D.DateTimeScaleOptions) property.<br>**For time-span axes.** Assign a [AutomaticTimeSpanScaleOptions](/WPF/DevExpress.Xpf.Charts.AutomaticTimeSpanScaleOptions) object to the [AxisX2D.TimeSpanScaleOptions](/WPF/DevExpress.Xpf.Charts.AxisX2D.TimeSpanScaleOptions), [AxisX3D.TimeSpanScaleOptions](/WPF/DevExpress.Xpf.Charts.AxisX3D.TimeSpanScaleOptions) or [RadarAxisX2D.TimeSpanScaleOptions](/WPF/DevExpress.Xpf.Charts.RadarAxisX2D.TimeSpanScaleOptions) property.<br>**For numeric axes.** Assign a [AutomaticNumericScaleOptions](/WPF/DevExpress.Xpf.Charts.AutomaticNumericScaleOptions) object to the [AxisX2D.NumericScaleOptions](/WPF/DevExpress.Xpf.Charts.AxisX2D.NumericScaleOptions), [AxisX3D.NumericScaleOptions](/WPF/DevExpress.Xpf.Charts.AxisX3D.NumericScaleOptions) or<br>[CircularAxisX2D.NumericScaleOptions](/WPF/DevExpress.Xpf.Charts.CircularAxisX2D.NumericScaleOptions) property. |
| **Manual Date-Time**, **Manual Time-Span**, and **Manual Numeric** | You can use the **MeasureUnit** property to specify the axis measurement unit that defines how to divide an axis scale into intervals for aggregation. | **For date-time axes.** Assign a [ManualDateTimeScaleOptions](/WPF/DevExpress.Xpf.Charts.ManualDateTimeScaleOptions) (or its descendant) object to the [AxisX2D.DateTimeScaleOptions](/WPF/DevExpress.Xpf.Charts.AxisX2D.DateTimeScaleOptions), [AxisX3D.DateTimeScaleOptions](/WPF/DevExpress.Xpf.Charts.AxisX3D.DateTimeScaleOptions) or [RadarAxisX2D.DateTimeScaleOptions](/WPF/DevExpress.Xpf.Charts.RadarAxisX2D.DateTimeScaleOptions) property.<br>**For time-span axes.** Assign a [ManualTimeSpanScaleOptions](/WPF/DevExpress.Xpf.Charts.ManualTimeSpanScaleOptions) (or its descendant) object to the [AxisX2D.TimeSpanScaleOptions](/WPF/DevExpress.Xpf.Charts.AxisX2D.TimeSpanScaleOptions), [AxisX3D.TimeSpanScaleOptions](/WPF/DevExpress.Xpf.Charts.AxisX3D.TimeSpanScaleOptions) or [RadarAxisX2D.TimeSpanScaleOptions](/WPF/DevExpress.Xpf.Charts.RadarAxisX2D.TimeSpanScaleOptions) property.<br>**For numeric axes.** Assign a [ManualNumericScaleOptions](/WPF/DevExpress.Xpf.Charts.ManualNumericScaleOptions) (or its descendant) object to the [AxisX2D.NumericScaleOptions](/WPF/DevExpress.Xpf.Charts.AxisX2D.NumericScaleOptions), [AxisX3D.NumericScaleOptions](/WPF/DevExpress.Xpf.Charts.AxisX3D.NumericScaleOptions) or<br>[CircularAxisX2D.NumericScaleOptions](/WPF/DevExpress.Xpf.Charts.CircularAxisX2D.NumericScaleOptions) property. |
| **Qualitative** | Chart aggregates point values if points have equal arguments. | **For qualitative axes.** Assign [QualitativeScaleOptions](/WPF/DevExpress.Xpf.Charts.QualitativeScaleOptions) to the [AxisX2D.QualitativeScaleOptions](/WPF/DevExpress.Xpf.Charts.AxisX2D.QualitativeScaleOptions) or [AxisX3D.QualitativeScaleOptions](/WPF/DevExpress.Xpf.Charts.AxisX3D.QualitativeScaleOptions) property. |

Note

Axes that have the *Continuous* scale type ([ContinuousDateTimeScaleOptions](/WPF/DevExpress.Xpf.Charts.ContinuousDateTimeScaleOptions), [ContinuousTimeSpanScaleOptions](/WPF/DevExpress.Xpf.Charts.ContinuousTimeSpanScaleOptions) and [ContinuousNumericScaleOptions](/WPF/DevExpress.Xpf.Charts.ContinuousNumericScaleOptions)) do not support aggregation.

## Aggregate Date-Time Data

The following images show aggregated date-time data:

![MeasureUnit = &quot;Year&quot;; GridAlignment = &quot;Year&quot;](/WPF/images/chart-control/aggregation-date-time-alignment-year--measurement-year.png)MeasureUnit = “Year”; GridAlignment = “Year”

![MeasureUnit = &quot;Month&quot;; GridAlignment = &quot;Year&quot;](/WPF/images/chart-control/aggregation-date-time-alignment-year--measurement-month.png)MeasureUnit = “Month”; GridAlignment = “Year”

![MeasureUnit = &quot;Month&quot;; GridAlignment = &quot;Month&quot;](/WPF/images/chart-control/aggregation-date-time-alignment-month--measurement-month.png)MeasureUnit = “Month”; GridAlignment = “Month”

The examples below use an *Average* function to aggregate date-time data:

### Automatic Mode

- XAML

<section id="tabpanel_-PExeFt9QY_tabid-xaml" role="tabpanel" data-tab="tabid-xaml">
<pre><code class="lang-xaml">&lt;dxc:XYDiagram2D&gt;
    &lt;dxc:XYDiagram2D.AxisX&gt;
        &lt;dxc:AxisX2D&gt;
            &lt;dxc:AxisX2D.DateTimeScaleOptions&gt;
                &lt;dxc:AutomaticDateTimeScaleOptions AggregateFunction=&quot;Average&quot;/&gt;
            &lt;/dxc:AxisX2D.DateTimeScaleOptions&gt;                    
        &lt;/dxc:AxisX2D&gt;
    &lt;/dxc:XYDiagram2D.AxisX&gt;
    &lt;!--...--&gt;
&lt;/dxc:XYDiagram2D&gt;
</code></pre></section>

### Manual Mode

- XAML

<section id="tabpanel_-PExeFt9QY-1_tabid-xaml" role="tabpanel" data-tab="tabid-xaml">
<pre><code class="lang-xaml">&lt;dxc:XYDiagram2D&gt;
    &lt;dxc:XYDiagram2D.AxisX&gt;
        &lt;dxc:AxisX2D&gt;
            &lt;dxc:AxisX2D.DateTimeScaleOptions&gt;
                &lt;dxc:ManualDateTimeScaleOptions AggregateFunction=&quot;Average&quot; 
                                                MeasureUnit=&quot;Year&quot; 
                                                GridAlignment=&quot;Year&quot;/&gt;      
            &lt;/dxc:AxisX2D.DateTimeScaleOptions&gt;        
        &lt;/dxc:AxisX2D&gt;
    &lt;/dxc:XYDiagram2D.AxisX&gt;
    &lt;!--...--&gt;
&lt;/dxc:XYDiagram2D&gt;
</code></pre></section>

The examples above use the following API members:

| Member | Description |
| --- | --- |
| [AxisX2D.DateTimeScaleOptions](/WPF/DevExpress.Xpf.Charts.AxisX2D.DateTimeScaleOptions) | Provides access to the options that define the behavior of a date-time X-scale when its mode is manual, automatic or continuous. |
| [AutomaticDateTimeScaleOptions](/WPF/DevExpress.Xpf.Charts.AutomaticDateTimeScaleOptions) | Contains settings for a date-time axis data  when its scale mode is automatic. |
| [ManualDateTimeScaleOptions](/WPF/DevExpress.Xpf.Charts.ManualDateTimeScaleOptions) | Contains settings for a date-time axis data  when its scale mode is manual. |

See also the following examples:

- [How to: Use Manual Date-Time Scale Options of an Axis](/WPF/17158/controls-and-libraries/charts-suite/chart-control/examples/chart-elements/how-to-use-manual-date-time-scale-options-of-an-axis)
- [How to: Use a Custom Measure Units in Automatic Date-Time Scale Mode](/WPF/115286/controls-and-libraries/charts-suite/chart-control/examples/data-representation/how-to-use-a-custom-measure-units-in-automatic-date-time-scale-mode)

### Form a Custom Measurement Unit

You can use the [ManualDateTimeScaleOptions.MeasureUnit](/WPF/DevExpress.Xpf.Charts.ManualDateTimeScaleOptions.MeasureUnit) property with the [ManualDateTimeScaleOptions.MeasureUnitMultiplier](/WPF/DevExpress.Xpf.Charts.ManualDateTimeScaleOptions.MeasureUnitMultiplier) property to configure a custom measurement unit for time-span axes with a manual scale.

For instance, set the **MeasureUnit** to **Month** and the **MeasureUnitMultiplier** to **6** to specify a measurement unit of six months.

![MeasureUnit = Month; MeasureUnitMultiplier = 1](/WPF/images/chart-control/aggregation-date-time-multiplier1.png)MeasureUnit = Month; MeasureUnitMultiplier = 1

![MeasureUnit = Month; MeasureUnitMultiplier = 6](/WPF/images/chart-control/aggregation-date-time-multiplier6.png)MeasureUnit = Month; MeasureUnitMultiplier = 6

- XAML

<section id="tabpanel_-PExeFt9QY-2_tabid-xaml" role="tabpanel" data-tab="tabid-xaml">
<pre><code class="lang-xaml">&lt;dxc:XYDiagram2D&gt;
    &lt;dxc:XYDiagram2D.AxisX&gt;
        &lt;dxc:AxisX2D&gt;
            &lt;dxc:AxisX2D.DateTimeScaleOptions&gt;
                &lt;dxc:ManualDateTimeScaleOptions AggregateFunction=&quot;Average&quot; 
                                                GridAlignment=&quot;Year&quot; 
                                                MeasureUnit=&quot;Month&quot; 
                                                MeasureUnitMultiplier=&quot;6&quot;/&gt;
            &lt;/dxc:AxisX2D.DateTimeScaleOptions&gt;                    
        &lt;/dxc:AxisX2D&gt;
    &lt;/dxc:XYDiagram2D.AxisX&gt;
&lt;/dxc:XYDiagram2D&gt;
</code></pre></section>

## Aggregate Time-Span Data

The following images show non-aggregated and aggregated time-span data:

![MeasureUnit = &quot;Minute&quot;; AggregateFunction = &quot;None&quot;](/WPF/images/chart-control/timespan-manual-measureunit-minute-aggf-none.png)MeasureUnit = “Minute”; AggregateFunction = “None”

![MeasureUnit = &quot;Hour&quot;; AggregateFunction = &quot;None&quot;](/WPF/images/chart-control/timespan-manual-measureunit-hour-aggf-none.png)MeasureUnit = “Hour”; AggregateFunction = “None”

![MeasureUnit = &quot;Hour&quot;; AggregateFunction = &quot;Average&quot;](/WPF/images/chart-control/timespan-manual-measureunit-hour-aggf-average.png)MeasureUnit = “Hour”; AggregateFunction = “Average”

The examples below use an *Average* function to aggregate time-span data:

### Automatic Mode

- XAML

<section id="tabpanel_-PExeFt9QY-3_tabid-xaml" role="tabpanel" data-tab="tabid-xaml">
<pre><code class="lang-xaml">&lt;dxc:XYDiagram2D&gt;
    &lt;dxc:XYDiagram2D.AxisX&gt;
        &lt;dxc:AxisX2D&gt;
            &lt;dxc:AxisX2D.TimeSpanScaleOptions&gt;
                &lt;dxc:AutomaticTimeSpanScaleOptions AggregateFunction=&quot;Average&quot;/&gt;
            &lt;/dxc:AxisX2D.TimeSpanScaleOptions&gt;                    
        &lt;/dxc:AxisX2D&gt;
    &lt;/dxc:XYDiagram2D.AxisX&gt;
&lt;/dxc:XYDiagram2D&gt;
</code></pre></section>

### Manual Mode

- XAML

<section id="tabpanel_-PExeFt9QY-4_tabid-xaml" role="tabpanel" data-tab="tabid-xaml">
<pre><code class="lang-xaml">&lt;dxc:XYDiagram2D&gt;    
    &lt;dxc:XYDiagram2D.AxisX&gt;
        &lt;dxc:AxisX2D&gt;
            &lt;dxc:AxisX2D.TimeSpanScaleOptions&gt;
                &lt;dxc:ManualTimeSpanScaleOptions MeasureUnit=&quot;Hour&quot; 
                                                AggregateFunction=&quot;Average&quot;/&gt;
            &lt;/dxc:AxisX2D.TimeSpanScaleOptions&gt;                     
        &lt;/dxc:AxisX2D&gt;
    &lt;/dxc:XYDiagram2D.AxisX&gt;
&lt;/dxc:XYDiagram2D&gt;    
</code></pre></section>

The examples above use the following API members:

| Member | Description |
| --- | --- |
| [AxisX2D.TimeSpanScaleOptions](/WPF/DevExpress.Xpf.Charts.AxisX2D.TimeSpanScaleOptions) | Gets or sets options of the time-span scale used by the argument axis. |
| [AutomaticTimeSpanScaleOptions](/WPF/DevExpress.Xpf.Charts.AutomaticTimeSpanScaleOptions) | Contains scale settings for an axis when its scale mode is automatic. |
| [ManualTimeSpanScaleOptions](/WPF/DevExpress.Xpf.Charts.ManualTimeSpanScaleOptions) | Contains settings for a time-span axis when its scale mode is manual. This scale mode allows you to specify a measurement unit. |

### Form a Custom Measurement Unit

You can use the [ManualTimeSpanScaleOptions.MeasureUnit](/WPF/DevExpress.Xpf.Charts.ManualTimeSpanScaleOptions.MeasureUnit) property with the [ManualTimeSpanScaleOptions.MeasureUnitMultiplier](/WPF/DevExpress.Xpf.Charts.ManualTimeSpanScaleOptions.MeasureUnitMultiplier) property to configure a custom measurement unit for time-span axes with a manual scale.

For instance, set the **MeasureUnit** to **Hour** and the **MeasureUnitMultiplier** to **3** to specify a measurement unit of three hours.

![MeasureUnit = Hour; MeasureUnitMultiplier = 3](/WPF/images/chart-control/scale-types/time-span-measureunitmultiplier-3.png)MeasureUnit = Hour; MeasureUnitMultiplier = 3

![MeasureUnit = Hour; MeasureUnitMultiplier = 6](/WPF/images/chart-control/scale-types/time-span-measureunitmultiplier-6.png)MeasureUnit = Hour; MeasureUnitMultiplier = 6

- XAML

<section id="tabpanel_-PExeFt9QY-5_tabid-xaml" role="tabpanel" data-tab="tabid-xaml">
<pre><code class="lang-xaml">&lt;dxc:XYDiagram2D.AxisX&gt;
    &lt;dxc:AxisX2D GridLinesVisible=&quot;False&quot;&gt;
        &lt;dxc:AxisX2D.TimeSpanScaleOptions&gt;
            &lt;dxc:ManualTimeSpanScaleOptions AutoGrid=&quot;False&quot; AggregateFunction=&quot;Average&quot;
                                            MeasureUnit=&quot;Hour&quot; MeasureUnitMultiplier=&quot;3&quot;
                                            GridSpacing=&quot;3&quot; GridAlignment=&quot;Hour&quot;/&gt;
        &lt;/dxc:AxisX2D.TimeSpanScaleOptions&gt;
    &lt;/dxc:AxisX2D&gt;
&lt;/dxc:XYDiagram2D.AxisX&gt;
</code></pre></section>

## Aggregate Numeric Data

The following images show aggregated numeric data:

![AggregationFunction = &quot;Average&quot;; MeasureUnit = &quot;10000&quot;](/WPF/images/chart-control/aggregation-numeric-1.png)AggregationFunction = “Average”; MeasureUnit = “10000”

![AggregationFunction = &quot;Average&quot;; MeasureUnit = &quot;1000&quot;](/WPF/images/chart-control/aggregation-numeric-2.png)AggregationFunction = “Average”; MeasureUnit = “1000”

The examples below use an *Average* function to aggregate numeric data:

### Automatic Mode

- XAML

<section id="tabpanel_-PExeFt9QY-6_tabid-xaml" role="tabpanel" data-tab="tabid-xaml">
<pre><code class="lang-xaml">&lt;dxc:XYDiagram2D&gt;
    &lt;dxc:XYDiagram2D.AxisX&gt;
        &lt;dxc:AxisX2D&gt;
            &lt;dxc:AxisX2D.NumericScaleOptions&gt;
                &lt;dxc:AutomaticNumericScaleOptions AggregateFunction=&quot;Average&quot;/&gt;
            &lt;/dxc:AxisX2D.NumericScaleOptions&gt;
        &lt;/dxc:AxisX2D&gt;
    &lt;/dxc:XYDiagram2D.AxisX&gt;
&lt;/dxc:XYDiagram2D&gt;
</code></pre></section>

### Manual Mode

- XAML

<section id="tabpanel_-PExeFt9QY-7_tabid-xaml" role="tabpanel" data-tab="tabid-xaml">
<pre><code class="lang-xaml">&lt;dxc:XYDiagram2D&gt;
    &lt;dxc:XYDiagram2D.AxisX&gt;
        &lt;dxc:AxisX2D&gt;
            &lt;dxc:AxisX2D.NumericScaleOptions&gt;
                &lt;dxc:ManualNumericScaleOptions AggregateFunction=&quot;Average&quot; 
                                               MeasureUnit=&quot;1000&quot;/&gt;       
            &lt;/dxc:AxisX2D.NumericScaleOptions&gt;
        &lt;/dxc:AxisX2D&gt;
    &lt;/dxc:XYDiagram2D.AxisX&gt;
&lt;/dxc:XYDiagram2D&gt;
</code></pre></section>

The examples above use the following API members:

| Member | Description |
| --- | --- |
| [AxisX2D.NumericScaleOptions](/WPF/DevExpress.Xpf.Charts.AxisX2D.NumericScaleOptions) | Provides access to the options that define the behavior of a numeric X-scale when its mode is manual, automatic or continuous. |
| [AutomaticNumericScaleOptions](/WPF/DevExpress.Xpf.Charts.AutomaticNumericScaleOptions) | Contains settings for a numeric axis data when its scale mode is automatic. |
| [ManualNumericScaleOptions](/WPF/DevExpress.Xpf.Charts.ManualNumericScaleOptions) | Contains settings for a numeric axis data when its scale mode is manual. |

See also the following examples:

- [How to: Use Manual Numeric Scale Options of an Axis](/WPF/17159/controls-and-libraries/charts-suite/chart-control/examples/chart-elements/how-to-use-manual-numeric-scale-options-of-an-axis)
- [How to: Use a Custom Measure Unit in Automatic Numeric Scale Mode](/WPF/115297/controls-and-libraries/charts-suite/chart-control/examples/data-representation/how-to-use-a-custom-measure-unit-in-automatic-numeric-scale-mode)

## Aggregate Qualitative Data

The following images show non-aggregated and aggregated qualitative data:

![AggregationFunction = &quot;None&quot;](/WPF/images/chart-control/aggregation-qualitative-none.png)AggregationFunction = “None”

![AggregationFunction = &quot;Average&quot;](/WPF/images/chart-control/aggregation-qualitative-average.png)AggregationFunction = “Average”

![AggregationFunction = &quot;Sum&quot;](/WPF/images/chart-control/aggregation-qualitative-sum.png)AggregationFunction = “Sum”

The example below uses a *Sum* function to aggregate qualitative data:

- XAML

<section id="tabpanel_-PExeFt9QY-8_tabid-xaml" role="tabpanel" data-tab="tabid-xaml">
<pre><code class="lang-xaml">&lt;dxc:XYDiagram2D&gt;
    &lt;dxc:XYDiagram2D.AxisX&gt;
        &lt;dxc:AxisX2D&gt;
            &lt;dxc:AxisX2D.QualitativeScaleOptions&gt;
                &lt;dxc:QualitativeScaleOptions AggregateFunction=&quot;Sum&quot;/&gt;
            &lt;/dxc:AxisX2D.QualitativeScaleOptions&gt;
        &lt;/dxc:AxisX2D&gt;
    &lt;/dxc:XYDiagram2D.AxisX&gt;   
&lt;/dxc:XYDiagram2D&gt;
</code></pre></section>

## Aggregate an Individual Series’s Data

You can apply different aggregate functions to series that are bound to the same x-axis. In this case, the aggregate function applied to a series has higher priority than the axis’s aggregate function. To specify a series’s aggregate function, use the [XYSeries.AggregateFunction](/WPF/DevExpress.Xpf.Charts.XYSeries.AggregateFunction) property.

![](/WPF/images/chart-control/aggregation-individual-series.png)

The following example uses the **Financial** function to aggregate the [Stock](/WPF/6849/controls-and-libraries/charts-suite/chart-control/series/2d-series-types/financial-series/stock) series and the **Sum** function - the [Bar](/WPF/5864/controls-and-libraries/charts-suite/chart-control/series/2d-series-types/bar-series/side-by-side-bar) series:

- XAML

<section id="tabpanel_-PExeFt9QY-9_tabid-xaml" role="tabpanel" data-tab="tabid-xaml">
<pre><code class="lang-xaml">&lt;dxc:XYDiagram2D&gt;
    &lt;dxc:StockSeries2D
        x:Name=&quot;stockSeries&quot;
        DisplayName=&quot;Price&quot;
        ArgumentDataMember=&quot;DateTimeStamp&quot;
        OpenValueDataMember=&quot;Open&quot;
        HighValueDataMember=&quot;High&quot;
        LowValueDataMember=&quot;Low&quot;
        CloseValueDataMember=&quot;Close&quot;
        AggregateFunction=&quot;Financial&quot;&gt;
    &lt;/dxc:StockSeries2D&gt;
    &lt;dxc:BarSideBySideSeries2D
        x:Name=&quot;volumeSeries&quot;
        DisplayName=&quot;Volume&quot;
        ArgumentDataMember=&quot;DateTimeStamp&quot;
        ValueDataMember=&quot;Volume&quot;
        AggregateFunction=&quot;Sum&quot;&gt;
    &lt;/dxc:BarSideBySideSeries2D&gt;
&lt;/dxc:XYDiagram2D&gt;
</code></pre></section>

## Create a Custom Aggregate Function

- Set the **AggregateFunction** ([AutomaticDateTimeScaleOptions.AggregateFunction](/WPF/DevExpress.Xpf.Charts.AutomaticDateTimeScaleOptions.AggregateFunction), [ManualDateTimeScaleOptions.AggregateFunction](/WPF/DevExpress.Xpf.Charts.ManualDateTimeScaleOptions.AggregateFunction), [AutomaticNumericScaleOptions.AggregateFunction](/WPF/DevExpress.Xpf.Charts.AutomaticNumericScaleOptions.AggregateFunction), [ManualNumericScaleOptions.AggregateFunction](/WPF/DevExpress.Xpf.Charts.ManualNumericScaleOptions.AggregateFunction), [QualitativeScaleOptions.AggregateFunction](/WPF/DevExpress.Xpf.Charts.QualitativeScaleOptions.AggregateFunction) or [XYSeries.AggregateFunction](/WPF/DevExpress.Xpf.Charts.XYSeries.AggregateFunction)) property to **Custom**.
- Create a class that inherits the [CustomAggregateFunction](/WPF/DevExpress.Xpf.Charts.CustomAggregateFunction) class.
- Override the [CustomAggregateFunction.Calculate(GroupInfo)](/WPF/DevExpress.Xpf.Charts.CustomAggregateFunction.Calculate%28DevExpress.Xpf.Charts.GroupInfo%29) method.
- Initialize the **CustomAggregateFunction** ([AutomaticDateTimeScaleOptions.CustomAggregateFunction](/WPF/DevExpress.Xpf.Charts.AutomaticDateTimeScaleOptions.CustomAggregateFunction), [ManualDateTimeScaleOptions.CustomAggregateFunction](/WPF/DevExpress.Xpf.Charts.ManualDateTimeScaleOptions.CustomAggregateFunction), [AutomaticNumericScaleOptions.CustomAggregateFunction](/WPF/DevExpress.Xpf.Charts.AutomaticNumericScaleOptions.CustomAggregateFunction), [ManualNumericScaleOptions.CustomAggregateFunction](/WPF/DevExpress.Xpf.Charts.ManualNumericScaleOptions.CustomAggregateFunction), [QualitativeScaleOptions.CustomAggregateFunction](/WPF/DevExpress.Xpf.Charts.QualitativeScaleOptions.CustomAggregateFunction) or [XYSeries.CustomAggregateFunction](/WPF/DevExpress.Xpf.Charts.XYSeries.CustomAggregateFunction)) property with a newly created aggregate function class instance.

The example below shows how to implement an aggregate function:

- XAML
- C#
- VB.NET

<section id="tabpanel_-PExeFt9QY-10_tabid-xaml1" role="tabpanel" data-tab="tabid-xaml1">
<pre><code class="lang-xaml">&lt;dxc:XYDiagram2D&gt;
    &lt;dxc:XYDiagram2D.AxisX&gt;
        &lt;dxc:AxisX2D&gt;
            &lt;dxc:AxisX2D.DateTimeScaleOptions&gt;
                &lt;dxc:AutomaticDateTimeScaleOptions AggregateFunction=&quot;Custom&quot;&gt;
                    &lt;dxc:AutomaticDateTimeScaleOptions.CustomAggregateFunction&gt;
                        &lt;local:StandardDeviationAggregateFunction/&gt;
                    &lt;/dxc:AutomaticDateTimeScaleOptions.CustomAggregateFunction&gt;
                &lt;/dxc:AutomaticDateTimeScaleOptions&gt;
            &lt;/dxc:AxisX2D.DateTimeScaleOptions&gt;
            &lt;!--...--&gt;                      
        &lt;/dxc:AxisX2D&gt;
    &lt;/dxc:XYDiagram2D.AxisX&gt;
    &lt;!--...--&gt;
&lt;/dxc:XYDiagram2D&gt;
</code></pre></section>
<section id="tabpanel_-PExeFt9QY-10_tabid-csharp1" role="tabpanel" data-tab="tabid-csharp1" aria-hidden="true" hidden="hidden">
<pre><code data-code-links="{&quot;/ (DevExpress.Xpf.Charts)(?:;|$)/&quot;:&quot;/WPF/DevExpress.Xpf.Charts&quot;,&quot;/ (System)(?:;|$)/&quot;:&quot;https://learn.microsoft.com/dotnet/api/system&quot;,&quot;/ (System.Collections.Generic)(?:;|$)/&quot;:&quot;https://learn.microsoft.com/dotnet/api/system.collections.generic&quot;,&quot;/ (System.Globalization)(?:;|$)/&quot;:&quot;https://learn.microsoft.com/dotnet/api/system.globalization&quot;,&quot;/ (System.IO)(?:;|$)/&quot;:&quot;https://learn.microsoft.com/dotnet/api/system.io&quot;,&quot;/ (System.Linq)(?:;|$)/&quot;:&quot;https://learn.microsoft.com/dotnet/api/system.linq&quot;,&quot;/ (System.Windows)(?:;|$)/&quot;:&quot;https://learn.microsoft.com/dotnet/api/system.windows&quot;,&quot;/ (System.Xml.Linq)(?:;|$)/&quot;:&quot;https://learn.microsoft.com/dotnet/api/system.xml.linq&quot;}" class="lang-csharp">using DevExpress.Xpf.Charts;
using System;
using System.Collections.Generic;
using System.Globalization;
using System.IO;
using System.Linq;
using System.Windows;
using System.Xml.Linq;

namespace DateTimeAggregation {
    class StandardDeviationAggregateFunction : CustomAggregateFunction {
        public override string ToString() {
            return &quot;StdDev (Custom)&quot;;
        }
        public override double[] Calculate(GroupInfo groupInfo) {
            double sum = 0.0;
            foreach(double value in groupInfo.Values1) {
                sum += value;
            }
            int len = groupInfo.Values1.Count();
            double averageAmount = sum / len;
            double standardDeviationSquareSum = 0.0;
            foreach(double value in groupInfo.Values1) {
                double deviation = value - averageAmount;
                standardDeviationSquareSum += deviation * deviation;
            }
            double stdDev = Math.Sqrt(standardDeviationSquareSum / len);
            return new double[1] { stdDev };
        }
    }
}
</code></pre></section>
<section id="tabpanel_-PExeFt9QY-10_tabid-vb1" role="tabpanel" data-tab="tabid-vb1" aria-hidden="true" hidden="hidden">
<pre><code data-code-links="{&quot;/ (DevExpress.Xpf.Charts)(?:;|$)/&quot;:&quot;/WPF/DevExpress.Xpf.Charts&quot;,&quot;/ (System)(?:;|$)/&quot;:&quot;https://learn.microsoft.com/dotnet/api/system&quot;,&quot;/ (System.Collections.Generic)(?:;|$)/&quot;:&quot;https://learn.microsoft.com/dotnet/api/system.collections.generic&quot;,&quot;/ (System.Globalization)(?:;|$)/&quot;:&quot;https://learn.microsoft.com/dotnet/api/system.globalization&quot;,&quot;/ (System.IO)(?:;|$)/&quot;:&quot;https://learn.microsoft.com/dotnet/api/system.io&quot;,&quot;/ (System.Linq)(?:;|$)/&quot;:&quot;https://learn.microsoft.com/dotnet/api/system.linq&quot;,&quot;/ (System.Windows)(?:;|$)/&quot;:&quot;https://learn.microsoft.com/dotnet/api/system.windows&quot;,&quot;/ (System.Xml.Linq)(?:;|$)/&quot;:&quot;https://learn.microsoft.com/dotnet/api/system.xml.linq&quot;}" class="lang-vb">Imports DevExpress.Xpf.Charts
Imports System
Imports System.Collections.Generic
Imports System.Globalization
Imports System.IO
Imports System.Linq
Imports System.Windows
Imports System.Xml.Linq

Namespace DateTimeAggregation
    Class StandardDeviationAggregateFunction
        Inherits CustomAggregateFunction

        Public Overrides Function ToString() As String
            Return &quot;StdDev (Custom)&quot;
        End Function

        Public Overrides Function Calculate(ByVal groupInfo As GroupInfo) As Double()
            Dim sum As Double = 0.0

            For Each value As Double In groupInfo.Values1
                sum += value
            Next

            Dim len As Integer = groupInfo.Values1.Count()
            Dim averageAmount As Double = sum / len
            Dim standardDeviationSquareSum As Double = 0.0

            For Each value As Double In groupInfo.Values1
                Dim deviation As Double = value - averageAmount
                standardDeviationSquareSum += deviation * deviation
            Next

            Dim stdDev As Double = Math.Sqrt(standardDeviationSquareSum / len)
            Return New Double(0) {stdDev}
        End Function
    End Class
End Namespace
</code></pre></section>