Radar Chart

A radar chart is essentially a line chart wrapped around on itself.

It’s worth a try to see if inheriting from LineChart would work.

PowerPoint UI

  • Insert > Chart … > Other > Radar
  • Default Radar uses 5 categories, 2 series, points connected with lines, no data point markers. Other radar options can add markers or fill.
  • Layout seems an awful lot like a line chart
  • Supports data labels, but only with data point value, not custom text (from UI).

XML semantics

  • There is one c:ser element for each series. Each c:ser element contains both the categories and the values (even though that is often redundant).
  • ? What happens if the category items in a radar chart don’t match? Inside are c:xVal, c:yVal, and c:bubbleSize, each containing the set of points for that “series”.

XML specimen

XML for default radar chart (simplified):

<?xml version='1.0' encoding='UTF-8' standalone='yes'?>
<c:chartSpace
    xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main"
    xmlns:c="http://schemas.openxmlformats.org/drawingml/2006/chart"
    xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships"
    >
  <c:chart>
    <c:autoTitleDeleted val="0"/>
    <c:plotArea>
      <c:layout/>
      <c:radarChart>
        <c:radarStyle val="marker"/>
        <c:varyColors val="0"/>
        <c:ser>
          <c:idx val="0"/>
          <c:order val="0"/>
          <c:tx>
            <c:strRef>
              <c:f>Sheet1!$B$1</c:f>
              <c:strCache>
                <c:ptCount val="1"/>
                <c:pt idx="0">
                  <c:v>Series 1</c:v>
                </c:pt>
              </c:strCache>
            </c:strRef>
          </c:tx>
          <c:marker>
            <c:symbol val="none"/>
          </c:marker>
          <c:cat>
            <c:numRef>
              <c:f>Sheet1!$A$2:$A$6</c:f>
              <c:numCache>
                <c:formatCode>m/d/yy</c:formatCode>
                <c:ptCount val="5"/>
                <c:pt idx="0">
                  <c:v>37261.0</c:v>
                </c:pt>
                <c:pt idx="1">
                  <c:v>37262.0</c:v>
                </c:pt>
                <c:pt idx="2">
                  <c:v>37263.0</c:v>
                </c:pt>
                <c:pt idx="3">
                  <c:v>37264.0</c:v>
                </c:pt>
                <c:pt idx="4">
                  <c:v>37265.0</c:v>
                </c:pt>
              </c:numCache>
            </c:numRef>
          </c:cat>
          <c:val>
            <c:numRef>
              <c:f>Sheet1!$B$2:$B$6</c:f>
              <c:numCache>
                <c:formatCode>General</c:formatCode>
                <c:ptCount val="5"/>
                <c:pt idx="0">
                  <c:v>32.0</c:v>
                </c:pt>
                <c:pt idx="1">
                  <c:v>32.0</c:v>
                </c:pt>
                <c:pt idx="2">
                  <c:v>28.0</c:v>
                </c:pt>
                <c:pt idx="3">
                  <c:v>12.0</c:v>
                </c:pt>
                <c:pt idx="4">
                  <c:v>15.0</c:v>
                </c:pt>
              </c:numCache>
            </c:numRef>
          </c:val>
        </c:ser>
        <c:ser>
          <c:idx val="1"/>
          <c:order val="1"/>
          <c:tx>
            <c:strRef>
              <c:f>Sheet1!$C$1</c:f>
              <c:strCache>
                <c:ptCount val="1"/>
                <c:pt idx="0">
                  <c:v>Series 2</c:v>
                </c:pt>
              </c:strCache>
            </c:strRef>
          </c:tx>
          <c:marker>
            <c:symbol val="none"/>
          </c:marker>
          <c:cat>
            <c:numRef>
              <c:f>Sheet1!$A$2:$A$6</c:f>
              <c:numCache>
                <c:formatCode>m/d/yy</c:formatCode>
                <c:ptCount val="5"/>
                <c:pt idx="0">
                  <c:v>37261.0</c:v>
                </c:pt>
                <c:pt idx="1">
                  <c:v>37262.0</c:v>
                </c:pt>
                <c:pt idx="2">
                  <c:v>37263.0</c:v>
                </c:pt>
                <c:pt idx="3">
                  <c:v>37264.0</c:v>
                </c:pt>
                <c:pt idx="4">
                  <c:v>37265.0</c:v>
                </c:pt>
              </c:numCache>
            </c:numRef>
          </c:cat>
          <c:val>
            <c:numRef>
              <c:f>Sheet1!$C$2:$C$6</c:f>
              <c:numCache>
                <c:formatCode>General</c:formatCode>
                <c:ptCount val="5"/>
                <c:pt idx="0">
                  <c:v>12.0</c:v>
                </c:pt>
                <c:pt idx="1">
                  <c:v>12.0</c:v>
                </c:pt>
                <c:pt idx="2">
                  <c:v>12.0</c:v>
                </c:pt>
                <c:pt idx="3">
                  <c:v>21.0</c:v>
                </c:pt>
                <c:pt idx="4">
                  <c:v>28.0</c:v>
                </c:pt>
              </c:numCache>
            </c:numRef>
          </c:val>
        </c:ser>
        <c:dLbls>
          <c:showLegendKey val="0"/>
          <c:showVal val="0"/>
          <c:showCatName val="0"/>
          <c:showSerName val="0"/>
          <c:showPercent val="0"/>
          <c:showBubbleSize val="0"/>
        </c:dLbls>
        <c:axId val="2079682968"/>
        <c:axId val="2079686056"/>
      </c:radarChart>
      <c:catAx>
        <c:axId val="2079682968"/>
        <c:scaling>
          <c:orientation val="minMax"/>
        </c:scaling>
        <c:delete val="0"/>
        <c:axPos val="b"/>
        <c:majorGridlines/>
        <c:numFmt formatCode="m/d/yy" sourceLinked="1"/>
        <c:majorTickMark val="out"/>
        <c:minorTickMark val="none"/>
        <c:tickLblPos val="nextTo"/>
        <c:crossAx val="2079686056"/>
        <c:crosses val="autoZero"/>
        <c:auto val="1"/>
        <c:lblAlgn val="ctr"/>
        <c:lblOffset val="100"/>
        <c:noMultiLvlLbl val="0"/>
      </c:catAx>
      <c:valAx>
        <c:axId val="2079686056"/>
        <c:scaling>
          <c:orientation val="minMax"/>
        </c:scaling>
        <c:delete val="0"/>
        <c:axPos val="l"/>
        <c:majorGridlines/>
        <c:numFmt formatCode="General" sourceLinked="1"/>
        <c:majorTickMark val="cross"/>
        <c:minorTickMark val="none"/>
        <c:tickLblPos val="nextTo"/>
        <c:crossAx val="2079682968"/>
        <c:crosses val="autoZero"/>
        <c:crossBetween val="between"/>
      </c:valAx>
    </c:plotArea>
    <c:legend>
      <c:legendPos val="r"/>
      <c:layout/>
      <c:overlay val="0"/>
    </c:legend>
    <c:plotVisOnly val="1"/>
    <c:dispBlanksAs val="gap"/>
    <c:showDLblsOverMax val="0"/>
  </c:chart>
  <c:txPr>
    <a:bodyPr/>
    <a:lstStyle/>
    <a:p>
      <a:pPr>
        <a:defRPr sz="1800"/>
      </a:pPr>
      <a:endParaRPr lang="en-US"/>
    </a:p>
  </c:txPr>
  <c:externalData r:id="rId1">
    <c:autoUpdate val="0"/>
  </c:externalData>
</c:chartSpace>

MS API Protocol

Make a radar chart:

Public Sub MakeGraph()

    Dim title       As String = "Title"
    Dim x_label     As String = "X Axis Label"
    Dim y_label     As String = "Y Axis Label"
    Dim new_chart   As Chart

    ' Make the chart.
    Set new_chart = Charts.Add()
    ActiveChart.ChartType = xlRadar
    ActiveChart.SetSourceData _
        Source:=sheet.Range("A1:A" & UBound(values)), _
        PlotBy:=xlColumns

    ' Set the chart's title abd axis labels.
    With ActiveChart
        .HasTitle = True
        .ChartTitle.Characters.Text = title

        .Axes(xlCategory, xlPrimary).HasTitle = True
        .Axes(xlCategory, xlPrimary).AxisTitle.Characters.Text = x_label

        .Axes(xlValue, xlPrimary).HasTitle = True
        .Axes(xlValue, xlPrimary).AxisTitle.Characters.Text = y_label
    End With
End Sub