Axis Title

A chart axis can have a title. Theoretically, the title text can be drawn from a cell in the spreadsheet behind the chart; however, there is no mechanism for specifying this from the PowerPoint 2011 UI (Mac) and there’s no mention of such a procedure I could find on search. So only the “manually applied” axis title text will be discussed here, other than how to remove any elements associated with “linked” text, however they may have gotten there.

The title is a rich text container, and can contain arbitrary text with arbitrary formatting (font, size, color, etc.). There is little but one thing to distinquish an axis title from an independent text box; its position is automatically adjusted by the chart to account for resizing and movement.

An axis title is visible whenever present. The only way to “hide” it is to delete it, along with its contents.

Although it will not be supported, it appears that axis title text can be specified in the XML as a cell reference in the Excel worksheet. This is a so-called “linked” title, and in general, any constructive operations on the axis title will remove any linked title present.

Proposed Scope

Completed

  • Axis.has_title
  • Axis.axis_title
  • AxisTitle.has_text_frame
  • AxisTitle.text_frame
  • AxisTitle.format

Pending

  • AxisTitle.orientation (this may require text frame rotation)
  • XL_ORIENTATION enumeration

Candidate protocol

Typical usage

I expect the most typical use is simply to set the text of the axis title:

>>> axis = shapes.add_chart(...).chart.value_axis
>>> axis.axis_title.text_frame.text = 'Foobar'

Axis title access

Axis.has_axis_title is used to non-destructively test for the presence of an axis title and may also be used to add an axis title.

An axis on a newly created chart has no axis title:

>>> axis = shapes.add_chart(...).chart.value_axis
>>> axis.has_title
False

Assigning True to .has_title causes an empty axis title element to be added along with its text frame elements (when not already present):

>>> axis.has_title = True
>>> axis.has_title
True

Axis.axis_title is used to access the AxisTitle object for an axis. It will always return an AxisTitle object, but it may be destructive in the sense that it adds an axis title if there is none:

>>> axis = shapes.add_chart(...).chart.value_axis
>>> axis.has_title
False
>>> axis.axis_title
<pptx.chart.axis.AxisTitle object at 0x65432fd>
>>> axis.has_title
True

Assigning False to .has_title removes the title element from the XML along with its contents:

>>> axis.has_title = False
>>> axis.has_title
False

Assigning None to Axis.axis_title has the same effect (not sure we’ll actually implement this as a priority):

>>> axis.has_title
True
>>> axis.axis_title = None
>>> axis.has_title
False

AxisTitle.text_frame

According to the schema and the MS API, the AxisTitle object can contain either a text frame or an Excel cell reference (<c:strRef>). However, the only operation on the c:strRef element the library will support (for now anyway) is to delete it when adding a text frame.

A newly added axis title will already have a text frame, but for the sake of completeness, AxisTitle.has_text_frame will allow the client to test for, add, and remove an axis title text frame. Assigning True to .has_text_frame causes any Excel reference (<c:strRef>) element to be removed and an empty text frame to be inserted. If a text frame is already present, no changes are made:

>>> axis_title.has_text_frame
False
>>> axis_title.has_text_frame = True
>>> axis_title.has_text_frame
True

The text frame can be accessed using AxisTitle.text_frame. This call always returns a text frame object, newly created if not already present:

>>> axis_title.has_text_frame
False
>>> axis_title.text_frame
<pptx.text.text.TextFrame object at 0x65432fe>
>>> axis_title.has_text_frame
True

AxisTitle.orientation

By default, the PowerPoint UI adds an axis title for a vertical axis at 90° counterclockwise rotation. The MS API provides for rotation to be specified as an integer number of degrees between -90 and 90. Positive angles are interpreted as counterclockwise from the horizontal. Orientation can also be specified as one of the members of the XlOrientation enumeration. The enumeration includes values for horizontal, 90° (upward), -90° (downward), and (vertically) stacked:

>>> axis = shapes.add_chart(...).chart.value_axis
>>> axis_title.orientation
90
>>> axis_title.orientation = XL_ORIENTATION.HORIZONTAL
>>> axis_title.orientation
0

MS API

Axis object

Axis.AxisTitle
Provides access to the AxisTitle object for this axis.
Axis.HasTitle
Getting indicates presence of axis title. Setting ensures presence or absence of axis title.

AxisTitle object

AxisTitle.Format
Provides access to fill and line formatting.
AxisTitle.FormulaLocal
Returns or sets the cell reference for the axis title text.
AxisTitle.HorizontalAlignment
Not terrifically useful AFAICT unless title extends to multiple lines.
AxisTitle.IncludeInLayout
Might not be available via UI; no such option present on PowerPoint 2011 for Mac.
AxisTitle.Orientation
An integer value from –90 to 90 degrees or one of the XlOrientation constants.
AxisTitle.Text
Returns or sets the axis title text. Setting removes any existing directly-applied formatting, but not title-level formatting.
AxisTitle.VerticalAlignment
Perhaps not terrifically useful since the textbox is automatically positioned and sized, so no difference is visible in the typical cases.

PowerPoint UI Behaviors

  • To add an axis title from the PowerPoint UI:

    Chart Layout (ribbon) > Axis Titles > Vertical Axis Title > Rotated Title

  • The default title “Axis Title” appears when no text has been entered.

  • The default orientation of a vertical axis title inserted by the UI is rotated 90 degrees counterclockwise. This is initially (before text is present) implemented using the c:txPr element. That element is removed when explicit title text is added.

XlOrientation Enumeration

https://msdn.microsoft.com/en-us/library/office/ff746480.aspx

xlDownward (-4170)
Text runs downward.
xlHorizontal (-4128)
Text runs horizontally.
xlUpward (-4171)
Text runs upward.
xlVertical (-4166)
Text runs downward and is centered in the cell.

Specimen XML

Add axis title in UI (but don’t set text):

<c:valAx>
  <!-- ... -->
  <c:majorGridlines/>

  <c:title>
    <c:layout/>
    <c:overlay val="0"/>
    <c:txPr>
      <a:bodyPr rot="-5400000" vert="horz"/>
      <a:lstStyle/>
      <a:p>
        <a:pPr>
          <a:defRPr/>
        </a:pPr>
        <a:endParaRPr lang="en-US"/>
      </a:p>
    </c:txPr>
  </c:title>

  <c:numFmt formatCode="General" sourceLinked="1"/>
  <!-- ... -->
</c:valAx>

Edit text directly in UI. Note that c:txPr element is removed when text is added:

<c:title>
  <c:tx>
    <c:rich>
      <a:bodyPr rot="-5400000" vert="horz"/>
      <a:lstStyle/>
      <a:p>
        <a:pPr>
          <a:defRPr/>
        </a:pPr>
        <a:r>
          <a:rPr lang="en-US" dirty="0" smtClean="0"/>
          <a:t>Foobar</a:t>
        </a:r>
        <a:endParaRPr lang="en-US" dirty="0"/>
      </a:p>
    </c:rich>
  </c:tx>
  <c:layout/>
  <c:overlay val="0"/>
</c:title>