Qml Polar Chart#

This is a demonstration on how to use a polar chart in your QML application.

Running the Example#

To run the example from Qt Creator , open the Welcome mode and select the example from Examples. For more information, visit Building and Running an Example.

Using Polar Charts in Qt Quick Applications#

We begin with a chart that has a spline series and a scatter series with random data. Both series use the same axes.

../_images/examples_qmlpolarchart1.png
PolarChartView {
    title: "Two Series, Common Axes"
    anchors.fill: parent
    legend.visible: false
    antialiasing: true

    ValueAxis {
        id: axisAngular
        min: 0
        max: 20
        tickCount: 9
    }

    ValueAxis {
        id: axisRadial
        min: -0.5
        max: 1.5
    }

    SplineSeries {
        id: series1
        axisAngular: axisAngular
        axisRadial: axisRadial
        pointsVisible: true
    }

    ScatterSeries {
        id: series2
        axisAngular: axisAngular
        axisRadial: axisRadial
        markerSize: 10
    }
}

// Add data dynamically to the series
Component.onCompleted: {
    for (var i = 0; i <= 20; i++) {
        series1.append(i, Math.random());
        series2.append(i, Math.random());
    }
}

The next example shows a chart with some accurate historical data for which we need to use a DateTimeAxis and a AreaSeries .

../_images/examples_qmlpolarchart2.png
PolarChartView {
    title: "Historical Area Series"
    anchors.fill: parent
    legend.visible: false
    antialiasing: true

    DateTimeAxis {
        id: axis1
        format: "yyyy MMM"
        tickCount: 13
    }
    ValueAxis {
        id: axis2
    }
    LineSeries {
        id: lowerLine
        axisAngular: axis1
        axisRadial: axis2

        // Please note that month in JavaScript months are zero based, so 2 means March
        XYPoint { x: toMsecsSinceEpoch(new Date(1950, 0, 1)); y: 15 }
        XYPoint { x: toMsecsSinceEpoch(new Date(1962, 4, 1)); y: 35 }
        XYPoint { x: toMsecsSinceEpoch(new Date(1970, 0, 1)); y: 50 }
        XYPoint { x: toMsecsSinceEpoch(new Date(1978, 2, 1)); y: 75 }
        XYPoint { x: toMsecsSinceEpoch(new Date(1987, 11, 1)); y: 102 }
        XYPoint { x: toMsecsSinceEpoch(new Date(1992, 1, 1)); y: 132 }
        XYPoint { x: toMsecsSinceEpoch(new Date(1998, 7, 1)); y: 100 }
        XYPoint { x: toMsecsSinceEpoch(new Date(2002, 4, 1)); y: 120 }
        XYPoint { x: toMsecsSinceEpoch(new Date(2012, 8, 1)); y: 140 }
        XYPoint { x: toMsecsSinceEpoch(new Date(2013, 5, 1)); y: 150 }
    }
    LineSeries {
        id: upperLine
        axisAngular: axis1
        axisRadial: axis2

        // Please note that month in JavaScript months are zero based, so 2 means March
        XYPoint { x: toMsecsSinceEpoch(new Date(1950, 0, 1)); y: 30 }
        XYPoint { x: toMsecsSinceEpoch(new Date(1962, 4, 1)); y: 55 }
        XYPoint { x: toMsecsSinceEpoch(new Date(1970, 0, 1)); y: 80 }
        XYPoint { x: toMsecsSinceEpoch(new Date(1978, 2, 1)); y: 105 }
        XYPoint { x: toMsecsSinceEpoch(new Date(1987, 11, 1)); y: 125 }
        XYPoint { x: toMsecsSinceEpoch(new Date(1992, 1, 1)); y: 160 }
        XYPoint { x: toMsecsSinceEpoch(new Date(1998, 7, 1)); y: 140 }
        XYPoint { x: toMsecsSinceEpoch(new Date(2002, 4, 1)); y: 140 }
        XYPoint { x: toMsecsSinceEpoch(new Date(2012, 8, 1)); y: 170 }
        XYPoint { x: toMsecsSinceEpoch(new Date(2013, 5, 1)); y: 200 }
    }
    AreaSeries {
        axisAngular: axis1
        axisRadial: axis2
        lowerSeries: lowerLine
        upperSeries: upperLine
    }
}
// DateTimeAxis is based on QDateTimes so we must convert our JavaScript dates to
// milliseconds since epoch to make them match the DateTimeAxis values
function toMsecsSinceEpoch(date) {
    var msecs = date.getTime();
    return msecs;
}

And the final example with a chart that uses a CategoryAxis to make the data easier to understand.

../_images/examples_qmlpolarchart3.png
PolarChartView {
    title: "Numerical Data for Dummies"
    anchors.fill: parent
    legend.visible: false
    antialiasing: true

    LineSeries {
        axisRadial: CategoryAxis {
            min: 0
            max: 30
            CategoryRange {
                label: "critical"
                endValue: 2
            }
            CategoryRange {
                label: "low"
                endValue: 7
            }
            CategoryRange {
                label: "normal"
                endValue: 12
            }
            CategoryRange {
                label: "high"
                endValue: 18
            }
            CategoryRange {
                label: "extremely high"
                endValue: 30
            }
        }

        axisAngular: ValueAxis {
            tickCount: 13
        }

        XYPoint { x: 0; y: 4.3 }
        XYPoint { x: 1; y: 4.1 }
        XYPoint { x: 2; y: 4.7 }
        XYPoint { x: 3; y: 3.9 }
        XYPoint { x: 4; y: 5.2 }
        XYPoint { x: 5; y: 5.3 }
        XYPoint { x: 6; y: 6.1 }
        XYPoint { x: 7; y: 7.7 }
        XYPoint { x: 8; y: 12.9 }
        XYPoint { x: 9; y: 19.2 }
    }
}

Example project @ code.qt.io