Pre loader

Android IncludeAxis API Implementation Example

Android Chart - Examples

SciChart Android ships with ~90 Android Chart Examples which you can browse, play with, view the source-code and even export each SciChart Android Chart Example to a stand-alone Android Studio project. All of this is possible with the new and improved SciChart Android Examples Suite, which ships as part of our Android Charts SDK.

Download Scichart Android

You can control which axes a modifier affects using the includeAxis API. By default, all axes are included, so modifiers work on all axes unless you configure otherwise.

You can do this by using the includedXAxes, includedYAxes and includeAllAxes methods on the modifier, which provide methods to include or exclude specific axes.

val xAxis = NumericAxis(this) 
val zoomPanModifier = ZoomPanModifier() 
// below code excludes the provided axis 
zoomPanModifier.includeXAxis(xAxis, false)

For cursor and rollover modifiers, you can control which renderable series the modifier affects using the includeRenderableSeries() method.

val cursorModifier = CursorModifier() 
val series = FastLineRenderableSeries() 
// below code excludes the provided series 
cursorModifier.includeRenderableSeries(series, false)

The full source code for the Android IncludeAxis API implementation example is included below (Scroll down!).

Did you know you can also view the source code from one of the following sources as well?

  1. Clone the SciChart.Android.Examples from GitHub.
  2. Or, view source and export each example to an Android Studio project from the Java version of the SciChart Android Examples app.
  3. Also the SciChart Android Trial contains the full source for the examples (link below).

DOWNLOAD THE ANDROID CHART EXAMPLES

IncludeAxisModifiersFragment.java
View source code
//******************************************************************************
// SCICHART® Copyright SciChart Ltd. 2011-2025. All rights reserved.
//
// Web: http://www.scichart.com
// Support: support@scichart.com
// Sales:   sales@scichart.com
//
// IncludeAxisModifiersFragment.java is part of SCICHART®, High Performance Scientific Charts
// For full terms and conditions of the license, see http://www.scichart.com/scichart-eula/
//
// This source code is protected by international copyright law. Unauthorized
// reproduction, reverse-engineering, or distribution of all or any portion of
// this source code is strictly prohibited.
//
// This source code contains confidential and proprietary trade secrets of
// SciChart Ltd., and should at no time be copied, transferred, sold,
// distributed or made available without express written permission.
//******************************************************************************

package com.scichart.examples.fragments.examples2d.modifyAxisBehavior;

import android.os.Handler;

import androidx.annotation.NonNull;

import com.scichart.charting.model.dataSeries.IXyDataSeries;
import com.scichart.charting.modifiers.CursorModifier;
import com.scichart.charting.modifiers.PinchZoomModifier;
import com.scichart.charting.modifiers.RolloverModifier;
import com.scichart.charting.modifiers.XAxisDragModifier;
import com.scichart.charting.modifiers.YAxisDragModifier;
import com.scichart.charting.modifiers.ZoomExtentsModifier;
import com.scichart.charting.modifiers.ZoomPanModifier;
import com.scichart.charting.visuals.SciChartSurface;
import com.scichart.charting.visuals.axes.AxisAlignment;
import com.scichart.charting.visuals.axes.IAxis;
import com.scichart.charting.visuals.renderableSeries.FastLineRenderableSeries;
import com.scichart.core.framework.UpdateSuspender;
import com.scichart.drawing.utility.ColorUtil;
import com.scichart.examples.R;
import com.scichart.examples.data.DataManager;
import com.scichart.examples.data.DoubleSeries;
import com.scichart.examples.fragments.base.ExampleSingleChartBaseFragment;
import com.scichart.examples.utils.Constant;
import com.scichart.examples.utils.interpolator.DefaultInterpolator;

import java.util.Collections;

/**
 * Example demonstrating the includeAxis API for modifiers.
 * This example shows how to selectively apply modifiers to specific axes in a multi-axis chart.
 */
public class IncludeAxisModifiersFragment extends ExampleSingleChartBaseFragment {

    private static final String X_AXIS_ID = "xAxis";
    private static final String Y_LEFT_AXIS_ID = "yLeftAxis";
    private static final String Y_RIGHT_AXIS_ID = "yRightAxis";

    @Override
    public boolean showDefaultModifiersInToolbar() {
        return false;
    }

    @Override
    protected void initExample(@NonNull SciChartSurface surface) {
        surface.setTheme(R.style.SciChart_NavyBlue);

        // Create X Axis
        final IAxis xAxis = sciChartBuilder.newNumericAxis()
                .withAxisId(X_AXIS_ID)
                .withAxisAlignment(AxisAlignment.Bottom)
                .withAxisTitle("X Axis (Shared)")
                .withGrowBy(0.1d, 0.1d)
                .build();

        // Create Left Y Axis
        final IAxis yLeftAxis = sciChartBuilder.newNumericAxis()
                .withAxisId(Y_LEFT_AXIS_ID)
                .withAxisAlignment(AxisAlignment.Left)
                .withAxisTitle("Left Y Axis (Not Fixed)")
                .withGrowBy(0.1d, 0.1d)
                .withTextColor(ColorUtil.argb(0xFF, 0x47, 0xBD, 0xE6))
                .withTickLabelStyle(sciChartBuilder.newFont().withTextSize(14f).withTextColor(ColorUtil.argb(0xFF, 0x47, 0xBD, 0xE6)).build())
                .build();

        // Create Right Y Axis
        final IAxis yRightAxis = sciChartBuilder.newNumericAxis()
                .withAxisId(Y_RIGHT_AXIS_ID)
                .withAxisAlignment(AxisAlignment.Right)
                .withAxisTitle("Right Y Axis (Fixed)")
                .withGrowBy(0.1d, 0.1d)
                .withTextColor(ColorUtil.argb(0xFF, 0xAE, 0x41, 0x8D))
                .withTickLabelStyle(sciChartBuilder.newFont().withTextSize(14f).withTextColor(ColorUtil.argb(0xFF, 0xAE, 0x41, 0x8D)).build())
                .build();

        // Create data series for left axis
        final DoubleSeries leftData = DataManager.getInstance().getFourierSeries(1.0, 0.1, 5000);
        final IXyDataSeries<Double, Double> leftDataSeries = sciChartBuilder.newXyDataSeries(Double.class, Double.class).build();
        leftDataSeries.append(leftData.xValues, leftData.yValues);
        leftDataSeries.setSeriesName("leftData");

        // Create data series for right axis
        final DoubleSeries rightData = DataManager.getInstance().getDampedSinewave(3.0, 0.005, 5000, 10);
        final IXyDataSeries<Double, Double> rightDataSeries = sciChartBuilder.newXyDataSeries(Double.class, Double.class).build();
        rightDataSeries.append(rightData.xValues, rightData.yValues);
        rightDataSeries.setSeriesName("rightData");

        // Create renderable series for left axis
        final FastLineRenderableSeries leftSeries = sciChartBuilder.newLineSeries()
                .withDataSeries(leftDataSeries)
                .withXAxisId(X_AXIS_ID)
                .withYAxisId(Y_LEFT_AXIS_ID)
                .withStrokeStyle(ColorUtil.argb(0xFF, 0x47, 0xBD, 0xE6), 2f, true)
                .build();

        // Create renderable series for right axis
        final FastLineRenderableSeries rightSeries = sciChartBuilder.newLineSeries()
                .withDataSeries(rightDataSeries)
                .withXAxisId(X_AXIS_ID)
                .withYAxisId(Y_RIGHT_AXIS_ID)
                .withStrokeStyle(ColorUtil.argb(0xFF, 0xAE, 0x41, 0x8D), 2f, true)
                .build();

        // Create ZoomPanModifier
        final ZoomPanModifier zoomPanModifier = new ZoomPanModifier();
        zoomPanModifier.setReceiveHandledEvents(true);
        zoomPanModifier.includeYAxis(yRightAxis, false);

        // Create PinchZoomModifier that ONLY works on LEFT Y AXIS
        // This demonstrates selective axis inclusion
        final PinchZoomModifier pinchZoomModifier = new PinchZoomModifier();
        //pinchZoomModifier.includeYAxis(yLeftAxis, true);  // Include only left Y axis
        pinchZoomModifier.includeYAxis(yRightAxis, false); // Exclude right Y axis
        pinchZoomModifier.setReceiveHandledEvents(true);

        // Create Y Axis Drag Modifier that ONLY works on LEFT Y AXIS
        final YAxisDragModifier yAxisDragModifier = new YAxisDragModifier();
        //yAxisDragModifier.includeYAxis(yLeftAxis, true);  // Include only left Y axis
        yAxisDragModifier.includeYAxis(yRightAxis, false);  // Include only left Y axis

        // Create X Axis Drag Modifier (works on X axis by default)
        final XAxisDragModifier xAxisDragModifier = new XAxisDragModifier();

        // Create Zoom Extents Modifier that EXCLUDES the RIGHT Y AXIS
        // This demonstrates selective axis exclusion
        final ZoomExtentsModifier zoomExtentsModifier = new ZoomExtentsModifier();

        final CursorModifier cursorModifier = new CursorModifier();
        cursorModifier.includeRenderableSeries(
                rightSeries,
                false
        );



        UpdateSuspender.using(surface, () -> {
            Collections.addAll(surface.getXAxes(), xAxis);
            Collections.addAll(surface.getYAxes(), yLeftAxis, yRightAxis);
            Collections.addAll(surface.getRenderableSeries(), leftSeries, rightSeries);
            Collections.addAll(surface.getChartModifiers(),
                    zoomPanModifier,
                    pinchZoomModifier,
                    yAxisDragModifier,
                    xAxisDragModifier,
                    zoomExtentsModifier,
                    cursorModifier
            );

            // Animate the series
            sciChartBuilder.newAnimator(leftSeries)
                    .withSweepTransformation()
                    .withInterpolator(DefaultInterpolator.getInterpolator())
                    .withDuration(Constant.ANIMATION_DURATION)
                    .withStartDelay(Constant.ANIMATION_START_DELAY)
                    .start();

            sciChartBuilder.newAnimator(rightSeries)
                    .withSweepTransformation()
                    .withInterpolator(DefaultInterpolator.getInterpolator())
                    .withDuration(Constant.ANIMATION_DURATION)
                    .withStartDelay(Constant.ANIMATION_START_DELAY)
                    .start();
        });

        // Add text annotation explaining the behavior
        surface.getAnnotations().add(
                sciChartBuilder.newTextAnnotation()
                        .withText("Try pinch-zoom and Y-axis drag:\n" +
                                "• Left Y Axis (blue) is zoomable\n" +
                                "• Right Y Axis (purple) is fixed\n" +
                                "• Double-tap zooms only left axis")
                        .withX1(0.5)
                        .withY1(9.5)
                        .withFontStyle(14, ColorUtil.White)
                        .build()
        );
    }
}

IncludeAxisModifiersFragment.kt
View source code
//******************************************************************************
// SCICHART® Copyright SciChart Ltd. 2011-2025. All rights reserved.
//
// Web: http://www.scichart.com
// Support: support@scichart.com
// Sales:   sales@scichart.com
//
// IncludeAxisModifiersFragment.kt is part of SCICHART®, High Performance Scientific Charts
// For full terms and conditions of the license, see http://www.scichart.com/scichart-eula/
//
// This source code is protected by international copyright law. Unauthorized
// reproduction, reverse-engineering, or distribution of all or any portion of
// this source code is strictly prohibited.
//
// This source code contains confidential and proprietary trade secrets of
// SciChart Ltd., and should at no time be copied, transferred, sold,
// distributed or made available without express written permission.
//******************************************************************************

package com.scichart.examples.fragments.examples2d.modifyAxisBehavior.kt

import com.scichart.charting.visuals.SciChartSurface
import com.scichart.charting.visuals.axes.AxisAlignment.Bottom
import com.scichart.charting.visuals.axes.AxisAlignment.Left
import com.scichart.charting.visuals.axes.AxisAlignment.Right
import com.scichart.data.model.DoubleRange
import com.scichart.drawing.utility.ColorUtil
import com.scichart.examples.R
import com.scichart.examples.data.DataManager
import com.scichart.examples.fragments.base.ExampleSingleChartBaseFragment
import com.scichart.examples.utils.Constant
import com.scichart.examples.utils.interpolator.DefaultInterpolator
import com.scichart.examples.utils.scichartExtensions.SolidPenStyle
import com.scichart.examples.utils.scichartExtensions.chartModifiers
import com.scichart.examples.utils.scichartExtensions.cursorModifier
import com.scichart.examples.utils.scichartExtensions.fastLineRenderableSeries
import com.scichart.examples.utils.scichartExtensions.numericAxis
import com.scichart.examples.utils.scichartExtensions.pinchZoomModifier
import com.scichart.examples.utils.scichartExtensions.renderableSeries
import com.scichart.examples.utils.scichartExtensions.setTextColor
import com.scichart.examples.utils.scichartExtensions.suspendUpdates
import com.scichart.examples.utils.scichartExtensions.sweepAnimation
import com.scichart.examples.utils.scichartExtensions.xAxes
import com.scichart.examples.utils.scichartExtensions.xAxisDragModifier
import com.scichart.examples.utils.scichartExtensions.xyDataSeries
import com.scichart.examples.utils.scichartExtensions.yAxes
import com.scichart.examples.utils.scichartExtensions.yAxisDragModifier
import com.scichart.examples.utils.scichartExtensions.zoomExtentsModifier
import com.scichart.examples.utils.scichartExtensions.zoomPanModifier

/**
 * Example demonstrating the includeAxis API for modifiers.
 * This example shows how to selectively apply modifiers to specific axes in a multi-axis chart.
 */
class IncludeAxisModifiersFragment : ExampleSingleChartBaseFragment() {

    override fun showDefaultModifiersInToolbar(): Boolean = false

    override fun initExample(surface: SciChartSurface) {
        surface.theme = R.style.SciChart_NavyBlue

        val leftData = DataManager.getInstance().getFourierSeries(1.0, 0.1, 5000)
        val rightData = DataManager.getInstance().getDampedSinewave(3.0, 0.005, 5000, 10)

        val leftColor = ColorUtil.argb(0xFF, 0x47, 0xBD, 0xE6)
        val rightColor = ColorUtil.argb(0xFF, 0xAE, 0x41, 0x8D)

        surface.suspendUpdates {
            xAxes {
                numericAxis {
                    axisId = X_AXIS_ID
                    axisAlignment = Bottom
                    axisTitle = "X Axis (Shared)"
                    growBy = DoubleRange(0.1, 0.1)
                }
            }

            yAxes {
                numericAxis {
                    axisId = Y_LEFT_AXIS_ID
                    axisAlignment = Left
                    axisTitle = "Left Y Axis (Not Fixed)"
                    growBy = DoubleRange(0.1, 0.1)
                    tickLabelStyle = sciChartBuilder.newFont().withTextSize(14f)
                        .withTextColor(ColorUtil.argb(0xFF, 0x47, 0xBD, 0xE6)).build()
                    setTextColor(leftColor.toLong())
                }

                numericAxis {
                    axisId = Y_RIGHT_AXIS_ID
                    axisAlignment = Right
                    axisTitle = "Right Y Axis (Fixed)"
                    growBy = DoubleRange(0.1, 0.1)
                    tickLabelStyle = sciChartBuilder.newFont().withTextSize(14f)
                        .withTextColor(ColorUtil.argb(0xFF, 0xAE, 0x41, 0x8D)).build()
                    setTextColor(rightColor.toLong())
                }
            }

            renderableSeries {
                fastLineRenderableSeries {
                    xAxisId = X_AXIS_ID
                    yAxisId = Y_LEFT_AXIS_ID
                    strokeStyle = SolidPenStyle(leftColor, 2f)
                    xyDataSeries<Double, Double> {
                        append(leftData.xValues, leftData.yValues)
                        seriesName = "leftData"
                    }

                    sweepAnimation {
                        duration = Constant.ANIMATION_DURATION
                        startDelay = Constant.ANIMATION_START_DELAY
                        interpolator = DefaultInterpolator.getInterpolator()
                    }
                }

                fastLineRenderableSeries {
                    xAxisId = X_AXIS_ID
                    yAxisId = Y_RIGHT_AXIS_ID
                    strokeStyle = SolidPenStyle(rightColor, 2f)
                    xyDataSeries<Double, Double> {
                        append(rightData.xValues, rightData.yValues)
                        seriesName = "rightData"
                    }

                    sweepAnimation {
                        duration = Constant.ANIMATION_DURATION
                        startDelay = Constant.ANIMATION_START_DELAY
                        interpolator = DefaultInterpolator.getInterpolator()
                    }
                }
            }

            chartModifiers {
                // ZoomPanModifier
                zoomPanModifier {
                    receiveHandledEvents = true
                    includeYAxis(surface.yAxes.first { it.axisId == Y_RIGHT_AXIS_ID }, false)
                }

                // PinchZoomModifier ONLY works on LEFT Y AXIS
                // This demonstrates selective axis inclusion
                pinchZoomModifier {
                    receiveHandledEvents = true
                    // Include only the left Y axis
                    includeYAxis(surface.yAxes.first { it.axisId == Y_LEFT_AXIS_ID }, true)
                }

                // Y Axis Drag Modifier that ONLY works on LEFT Y AXIS
                yAxisDragModifier {
                    // Include only the left Y axis
                    includeYAxis(surface.yAxes.first { it.axisId == Y_LEFT_AXIS_ID }, true)
                }

                // X Axis Drag Modifier (works on X axis by default)
                xAxisDragModifier()

                // Zoom Extents Modifier that EXCLUDES the RIGHT Y AXIS
                // This demonstrates selective axis exclusion
                zoomExtentsModifier()

                cursorModifier {
                    includeRenderableSeries(
                        surface.renderableSeries.first { it.yAxisId == Y_RIGHT_AXIS_ID },
                        false
                    )
                }
            }

            // Note: Annotations would be added here but require additional setup in Kotlin DSL
        }
    }

    companion object {
        private const val X_AXIS_ID = "xAxis"
        private const val Y_LEFT_AXIS_ID = "yLeftAxis"
        private const val Y_RIGHT_AXIS_ID = "yRightAxis"
    }
}

Back to Android Chart Examples