31

I would need to make a table where the rows consist of concentric circles. That is, row 1 is forms the innermost circle; row 2 the second circle; row 3 the third circle and so on. The columns would thus form pizza slices meeting in the center of the circles.

What I'm trying to do is to recreate a series of tables on the basis of the one pictured below (for what it's worth, the table is from a Jesuit work published in China in 1626). The five instances of one and the same letter ("a", "e", "i" etc) would all be in the same column but on different rows.

I would provide some kind of elementary MWE if I could, but I don't know where to start. I'd appreciate any help I can get. Thank you!

enter image description here

Mårten
  • 2,194

3 Answers3

32

I’m not sure if this answers “How do I change the list of letters for every row” or not, but:

Here’s the diagram with a different outer row than the inner rows. I used a \foreach loop to “simultaneously” iterate over two variables, \romanized and \outer. (You can easily extend this to more than two variables.) The code is essentially stolen from the previous two answers.

\documentclass[varwidth,border=1em]{standalone}
\usepackage{tikz}
\usetikzlibrary{calc,decorations.text}

\begin{document}
\begin{tikzpicture}
\node at (90:5.5) {\Large 萬國音韻話圖};
\def\ct{30}
\def\halfring{ʿ}
\foreach \romanized/\outer [count=\i] in {
    % No guarantees that the Chinese characters are correct
    a/丫, e/額, i/衣, o/阿, u/午, ç/則, \halfring ç/測, ch/者, \halfring ch/搐,
    k/格, \halfring k/克, p/克, \halfring p/魄, t/德, \halfring t/忒, j/日, v/物,
    f/弗, g/額, l/勒, m/麥, n/搦, s/色, x/石, h/黑, b/〇, d/〇, r/〇, z/〇,
} {
    \pgfmathsetmacro{\angle}{90-360/\ct*\i}
    \draw (\angle-360/\ct/2:1.5) -- (\angle-360/\ct/2:4.5);
    \node[rotate=-90+\angle] at (\angle:4.25) {\outer};
    \foreach \r in {1,...,5} {
        \pgfmathsetmacro{\radius}{1.25+\r*0.5}
        \node[rotate=-90+\angle,text depth=0,text height=1ex] at (\angle:\radius)
             {\sffamily\itshape\romanized};
    }
}
\foreach \r in {1,...,8,8.1} { \draw (0,0) circle(0.5+\r*0.5); }
\foreach \inner [count=\i] in {次淸甚,次濁甚,次上甚,次去甚,次入甚} {
    \pgfmathsetmacro{\angle}{90-360/5*\i-360/\ct/2}
    \draw (\angle:1) -- (\angle:1.5);
    \draw[decorate, decoration={reverse path, text align=center,
          text along path, text={\inner}}] (\angle:1.125) arc (\angle:\angle+360/5:1.125);
};
\end{tikzpicture}
\end{document}

hftf
  • 2,283
  • 1
    Looks nice but you may have spoilt Marten's entire afternoon as he must have been looking forward to figuring out himself how to do this... –  May 21 '14 at 12:11
  • That is beautiful and looks exactly like what I need. I haven't explored it yet to see that it can do all that I need, but I will right away. But I just have one question now. How do I change the Latin font in the picture? I tried to add \begin{tikzpicture}[font=\mainfont] and the like but it doesn't work. – Mårten May 22 '14 at 07:06
  • From my preamble: \usepackage{fontspec} \setmainfont{Adobe Kaiti Std} \setsansfont{Brill}. Since there were only really two fonts needed, I sort of “cheated” by (ab)using the “serif” family for the Chinese characters and the “sans-serif” family (\sffamily) for the Latin characters. – hftf May 22 '14 at 07:27
  • I got everything working, and managed to adapt it to reconstruct a similar graph. Thanks a million! – Mårten May 24 '14 at 05:31
  • No problem. Sorry if I spoiled your afternoon — I didn’t realize I wasn’t supposed to post this… – hftf May 24 '14 at 07:04
  • No it was PERFECT. Actually, I would like to shamelessly ask if you know how I can make a small circle in one of the "orbits" like the circles surrounding 一、二、三、四 in this picture (https://db.tt/fHFISYYV). I also don't know how to write something in the center of the circle (學 in this case). The rest I can figure out myself at this point. Thanks again for all the help! – Mårten Jun 01 '14 at 02:14
  • Could you post your current attempt in some kind of pastebin? – hftf Jun 01 '14 at 03:53
  • Sure, I'll hope to be able to do that soon, I'm still working on it! – Mårten Jun 02 '14 at 00:48
  • I tried to compile this with XeLaTeX, but didn't get the Chinese characters to print. Any suggestion? Thanks. – PatrickT Jul 30 '20 at 08:28
  • You can ask a new question about that. – hftf Jul 31 '20 at 14:03
27

Starting point:

\documentclass{standalone}
\usepackage{tikz}
\begin{document}
\usetikzlibrary{calc}
\begin{tikzpicture}
\foreach \letter [count=\i] in {q,w,e,r,t,y,u,i,o,p,a,s,d,f,g,h,j,k,l,z,x,c,v,b, → n,m} {
 \pgfmathsetmacro{\angle}{-360/26*\i}
 \draw (\angle-360/26/2:1.25) -- (\angle-360/26/2:4.75);
 \foreach \r in {1,...,7} {
    \pgfmathsetmacro{\radius}{1+\r*0.5}
    \node[rotate=-90+\angle] at (\angle:\radius) {\letter};
 }
}
 \foreach \r in {1,...,8}  {
     \draw (0,0) circle(0.75+\r*0.5);
}
\end{tikzpicture}
\end{document}

Result

JLDiaz
  • 55,732
  • 3
    Beautiful! Sorry, I don't know tikz very well; how do I change the list of letters for every row? In case not all rows will contain the same sequence of letters. Thank you! – Mårten May 21 '14 at 09:34
17

Another attempt where text can be written onto it via \curvedtext taking 4 argumments #1=angle, #2=radius, #3=color, #4=content. This solution uses foreach loop to draw the circles and rays.

\foreach \rr in {5,10,...,25}{  % radius can be adjusted for one's selection.
  \draw  (A) circle (\rr);
}
\foreach \aa in {1,...,\pp}{
\draw ($(A)+({\aa*360/\pp}:10)$) --  ($(A)+({\aa*360/\pp}:25)$); 
}

To draw the rays, one needs to provide \pp for number of slices. This example has 20 slices. So each slice is 18 degree. With that information, one can determine the location (polar coordinates) of each slots to put text in.

enter image description here

Code

\documentclass[border=10pt]{standalone}%{article}
%\usepackage[papers=30cm,paperwidth=35cm,margin=1in,heightrounded]{geometry}
\usepackage{tikz}
\usetikzlibrary{calc,decorations.text}
\usetikzlibrary{calc}
\def\curvedtext#1#2#3#4{%
\path[decorate, decoration={text along path, text align=center, text={|\color{#3}\small|#4}}]
($(A)+(#1+20:#2)$) arc (#1+20:#1-20:#2);
}    % borrowed from http://tex.stackexchange.com/a/177455/34618
\begin{document}
\thispagestyle{empty}
\begin{tikzpicture}[scale=0.2]
% center
\path  (0,0) coordinate(A);
% circles
\foreach \rr in {5,10,...,25}{
  \draw  (A) circle (\rr);
}
\def\pp{20} % nb of slices
% rays
\foreach \aa in {1,...,\pp}{
\draw ($(A)+({\aa*360/\pp}:10)$) --  ($(A)+({\aa*360/\pp}:25)$); 
}
\curvedtext{45}{22}{blue}{ABC};
\curvedtext{27}{22}{blue}{DEF};
\curvedtext{9}{22}{blue}{HIJ};
\curvedtext{25}{17}{red}{B};
\curvedtext{7}{12}{green!60!black}{C};
\path[draw,decorate, decoration={text along path, text align=center, text={A very long sentence around the circular path and...}}] (0,0) circle (8);
\end{tikzpicture}
\end{document}
Jesse
  • 29,686