# 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, 2014 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, 2015 at 19:36

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.

• 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. Apr 26, 2015 at 0:22
• @JasonZentz Out of curiosity, do you have a source that defines this "standard" 4:3:2 ratio?
– hftf
Apr 26, 2015 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. Apr 26, 2015 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. Apr 26, 2015 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." Apr 26, 2015 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{%
\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}


• I like this solution, but could it be supplemented with a suggestion on how to make the lines leave space for the label as in the solutions above? If you want to display an unrounded-rounded pair as /i • y/, the line gets in the way for the /y/. Oct 20, 2020 at 7:49
• @Lundgren8, the example illustrates (though doesn't explain) the parameters you can use to manually adjust label placement. The label distance is the distance of the label from the center of the dot (-1pt for the [i] example and -3pt for the [o] example). The directional parameter preceding the colon (left for the [i] example and below right for the [o] example) can be changed to have the label appear on a different side of the dot. I'd recommend using separate \nodes for pairs so that you can adjust the two labels' placement independently. Oct 20, 2020 at 19:58
• Sure, that works in some cases, but it can’t fully imitate the official chart where many of the symbols lie on top of the line with whitespace around them. Ideally, you would not want to place the node of e.g. /y/ further down, as that would indicate a more open pronunciation. Oct 22, 2020 at 7:35
• @Lundgren8, for that (to mimic what the official IPA chart does), you'd probably want to use a separate node for the text rather than a label. You could place the text node relative to the dot's note and then reference the text node (rather than the vertices) when you are drawing the lines. Normal nodes come with a bit of padding, so you wouldn't have overlap if the line connects to the text node. If you're interested in more details than this, perhaps ask a separate question so that I or someone else can show you with actual examples. Oct 30, 2020 at 20:42