# TikZ/PGF linguistics vowel chart

I'm including a vowel chart in a linguistics document of mine, similar to this, and while I'm aware that there are a couple of packages (TIPA, pst-vowel) that can do the job, I'm interested in trying to draw it using PGF/TikZ. Having not used TikZ before, I'm a little unsure on where to start with this deceptively simple figure.

As I understand it, I'd need to define some kind of skewed grid with [default] nodes at the line intersections, their midpoints, and the middle of each "square". The actual letters would then be drawn on top, positioned by coordinates; at the moment I'm not interested in arbitrary positioning of letters as occurs in the diagram.

Can anyone help me out?

• –1: Welcome to TeX.SX. Questions about how to draw specific graphics that just post an image of the desired result are really not reasonable questions to ask on the site. Please post a minimal compilable document showing that you've tried to produce the image and then people will be happy to help you with any specific problems you may have. See minimal working example (MWE) for what needs to go into such a document. – Tobi Feb 1 '14 at 10:14
• Hello, have you considered accepting an answer? If your problem has been solved, you can accept an answer by clicking the green checkmark. – hftf Sep 24 '15 at 19:36

## 3 Answers

If you don't require PGF/TikZ 3.0, you can use this trick to emulate an affine transformation.

I define a command whose input is a “Cartesian” coordinate in the range (0, 0) to (3, 2), and whose output is a coordinate in the barycentric system¹ defined by the four corners (called hf, hb, lf, and lb) of the trapezoid.

\def\V(#1,#2){barycentric cs:hf={(3-#1)*(2-#2)},hb={(3-#1)*#2},lf={#1*(2-#2)},lb={#1*#2}}


Liberal use of this \V command makes placing nodes in the trapezoid very easy.

# Code

\documentclass[12pt]{standalone}

\usepackage{tikz}
% Requires xelatex for the magnificent Brill font
\usepackage{fontspec}
\setmainfont{Brill}

\begin{document}
\begin{tikzpicture}[scale=3]
\large
\tikzset{
vowel/.style={fill=white, anchor=mid, text depth=0ex, text height=1ex},
dot/.style={circle,fill=black,minimum size=0.4ex,inner sep=0pt,outer sep=-1pt},
}
\coordinate (hf) at (0,2); % high front
\coordinate (hb) at (2,2); % high back
\coordinate (lf) at (1,0); % low front
\coordinate (lb) at (2,0); % low back
\def\V(#1,#2){barycentric cs:hf={(3-#1)*(2-#2)},hb={(3-#1)*#2},lf={#1*(2-#2)},lb={#1*#2}}

% Draw the horizontal lines first.
\draw (\V(0,0)) -- (\V(0,2));
\draw (\V(1,0)) -- (\V(1,2));
\draw (\V(2,0)) -- (\V(2,2));
\draw (\V(3,0)) -- (\V(3,2));

% Place all the unrounded-rounded pairs next, on top of the horizontal lines.
\path (\V(0,0))     node[vowel, left] {i} node[vowel, right] {y} node[dot] {};
\path (\V(0,1))     node[vowel, left] {ɨ} node[vowel, right] {ʉ} node[dot] {};
\path (\V(0,2))     node[vowel, left] {ɯ} node[vowel, right] {u} node[dot] {};
\path (\V(0.5,0.4)) node[vowel, left] {ɪ} node[vowel, right] {ʏ} node[dot] {};
\path (\V(0.5,1.6)) node[vowel, left] { } node[vowel, right] {ʊ} node[dot] {};
\path (\V(1,0))     node[vowel, left] {e} node[vowel, right] {ø} node[dot] {};
\path (\V(1,1))     node[vowel, left] {ɘ} node[vowel, right] {ɵ} node[dot] {};
\path (\V(1,2))     node[vowel, left] {ɤ} node[vowel, right] {o} node[dot] {};
\path (\V(2,0))     node[vowel, left] {ɛ} node[vowel, right] {œ} node[dot] {};
\path (\V(2,1))     node[vowel, left] {ɜ} node[vowel, right] {ɞ} node[dot] {};
\path (\V(2,2))     node[vowel, left] {ʌ} node[vowel, right] {ɔ} node[dot] {};
\path (\V(2.5,0))   node[vowel, left] {æ} node[vowel, right] { } node[   ] {};
\path (\V(3,0))     node[vowel, left] {a} node[vowel, right] {ɶ} node[dot] {};
\path (\V(3,2))     node[vowel, left] {ɑ} node[vowel, right] {ɒ} node[dot] {};

% Draw the vertical lines.
\draw (\V(0,0)) -- (\V(3,0));
\draw (\V(0,1)) -- (\V(3,1));
\draw (\V(0,2)) -- (\V(3,2));

% Place the unpaired symbols last, on top of the vertical lines.
\path (\V(1.5,1))   node[vowel]       {ə};
\path (\V(2.5,1))   node[vowel]       {ɐ};
\end{tikzpicture}
\end{document}


# Result

Finally, here is the complete IPA vowel chart drawn in TikZ:

Sorry for the late answer. Still, I hope this helps anyone else wanting to draw this in the future. By the way, you can get the extremely-well-equipped-for-linguistics Brill font here for free.

¹ You can learn about this in section 13.2.2 “Barycentric Systems” of the PGF/TikZ manual.

• This is a great answer for users who want to use the vowel quadrilateral to define a new coordinate system (although those who are using formant values to plot their vowels will prefer to keep the standard xy coordinate system). To get the standard shape, you should have a 4:3:2 ratio for the top, right, bottom, but that's easy to fix when you define the coordinates for the corners. – Jason Zentz Apr 26 '15 at 0:22
• @JasonZentz Out of curiosity, do you have a source that defines this "standard" 4:3:2 ratio? – hftf Apr 26 '15 at 3:12
• Sure, the official IPA chart uses it, as do the illustrations of the IPA in the Handbook of the International Phonetic Association. Evidently there was discussion of it at the 1989 IPA convention; there is a paper discussing the 4:3:2 and 4:3.5:2 options and advocating for the latter, but it looks like the 4:3:2 won out. – Jason Zentz Apr 26 '15 at 3:55
• It looks like the one you put up has the proportions of the one at internationalphoneticalphabet.org/ipa-charts/…, but that site isn't actually affiliated with the International Phonetic Association. – Jason Zentz Apr 26 '15 at 4:00
• Just found the official ruling from the 1989 IPA convention: "The proportions of the quadrilateral should be such that its base is within 0.5 to 0.6 of the length of its top, and its back within 0.7 to 0.9 of the length of its top. A base:back:top ratio of 2:3:4 is often found to be the most convenient proportion to achieve this." – Jason Zentz Apr 26 '15 at 4:10

With the new version of TikZ v3.0, you can also define nonlinear transformations:

\documentclass[tikz]{standalone}
\usetikzlibrary{quotes,calc}
\usepgfmodule{nonlineartransformations}
\makeatletter
\def\ydepxskew{%
\pgfmathqparse{0.02\pgf@y}%Adjust 0.02 for skewness amount
\pgf@x=\pgfmathresult\pgf@x%
\pgf@y=\pgf@y%
}
\makeatother
\begin{document}
\begin{tikzpicture}[myipa/.style 2 args={circle,fill,inner sep=0pt, "#1" {#2}}]
{
\pgftransformnonlinear{\ydepxskew}
\draw (0pt,15mm) grid [xstep=10mm, ystep=15mm] (-20mm, 60mm);
\foreach \x in {0,1,2}{
\foreach \y in {0,1,2,3}{
\coordinate (n-\x-\y) at ({-\x*10mm},{(\y+1)*15mm});
}
}
}
\node[myipa={\o}{left}] at ($(n-2-3)!0.4!(n-1-1)$) {a};
\draw[red,thick] (n-0-3) -- (n-1-1);
\end{tikzpicture}
\end{document}


The following code correctly sets the proportions of the top, right, and bottom of the quadrilateral to be 4:3:2 and gives two examples of how to place vowels using xy coordinates.

\documentclass{article}

\usepackage{tikz}
\usetikzlibrary{calc}

\begin{document}

\begin{tikzpicture}[vowel/.style={fill, circle, inner sep=0pt, text height=1.25ex}]
\coordinate (hf) at (0,3); % the high front vertex
\coordinate (hb) at (4,3); % the high back vertex
\coordinate (lb) at (4,0); % the low back vertex
\coordinate (lf) at (2,0); % the low front vertex

\draw (hf) -- (hb) -- (lb) -- (lf) -- cycle; % draws the trapezoid

\draw ($(hf)!1/3!(lf)$) -- ($(hb)!1/3!(lb)$); % the high-mid line
\draw ($(hf)!2/3!(lf)$) -- ($(hb)!2/3!(lb)$); % the low-mid line
\draw ($(hf)!0.5!(hb)$) -- ($(lf)!0.5!(lb)$); % the center line

\node[vowel,label={[label distance=-1pt]left:i}] at (0.8,2.6) {}; % places the [i] vowel at (0.8,2.6)
\node[vowel,label={[label distance=-3pt]below right:o}] at (3.5,1.7) {}; % places the [o] vowel at (3.5,1.7)
\end{tikzpicture}

\end{document}