17

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.

Hungarian Vowels

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?

2
  • 2
    –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
  • 1
    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
18

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.

5
  • 3
    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 '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
  • 2
    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 '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. Apr 26 '15 at 4:00
  • 1
    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 '15 at 4:10
9

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}

enter image description here

8

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}

enter image description here

4
  • 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/.
    – Lundgren8
    Oct 20 '20 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 '20 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.
    – Lundgren8
    Oct 22 '20 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 '20 at 20:42

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.