見出し画像

離散グラフをLaTeXで出力してみる〜3. ラベル付け・曲線を描く〜

こんにちは。

その2では、直線を用いてグラフを描くことまでできました。
これで簡単なグラフは描けましたが、頂点には名前が振られていません。
また、直線だけでは描きたいグラフは再現できないことも多い…

そこで今回は頂点をラベル付けする方法と、曲線を描く方法をまとめたいと思います。

※まだまだ不勉強なので、訂正箇所や改善点等あればコメント等いただけると幸いです。

手順5 頂点をラベル付けする

前回も使った正方形のグラフを用いてラベル付けをしたいと思います。

\begin{tikzpicture}[scale=0.4]

\coordinate(v1)at(0,0);
\coordinate(v2)at(10,0);
\coordinate(v3)at(10,10);
\coordinate(v4)at(0,10);

\draw[thick](v1)--(v2)--(v3)--(v4)--cycle;
\draw[thick](v2)--(v4);
\draw[thick](v1)--(v3);

\foreach\P in{v1,v2,v3,v4}\fill[black](\P)circle(0.25);

\end{tikzpicture}

そもそもグラフを見てもどの頂点をv1としてソースを書いているかわからないので、作成者が辺を書き加えたいときに面倒です。
そこで、頂点の横に$${v_1,v_2,\cdots}$$とラベル付けをしたいと思います。書き方は以下の通りです。

\begin{tikzpicture}[scale=0.4]

\coordinate[label=below:$v_1$](v1)at(0,0);
\coordinate[label=right:$v_2$](v2)at(10,0);
\coordinate[label=above right:$v_3$](v3)at(10,10);
\coordinate[label=left:$v_4$](v4)at(0,10);

\draw[thick](v1)--(v2)--(v3)--(v4)--cycle;
\draw[thick](v2)--(v4);
\draw[thick](v1)--(v3);
\foreach\P in{v1,v2,v3,v4}\fill[black](\P)circle(0.25);
\end{tikzpicture}

上のように、$${v_1}$$というラベルを下側に配置しろ($${v_2}$$は右、$${v_3}$$は右上、$${v_4}$$は左)、という命令を書きます。
コンパイルすると…

頂点にラベル付けができました。
label=〜〜の部分は、

  • above→上

  • below→下

  • left→左

  • right→右

  • above(below) left(right)→左上(右下)

のように、上下左右とその組み合わせの8つの位置で調整できます。
グラフと被らないように調整しましょう。

これで、辺を書き加えたい時も、いちいちソースを参照せずにグラフを見れば、頂点の名前がわかります。
複雑なグラフを描くときは、わかりやすさのために一時的にラベルを付けるのも良いと思います。

手順6 曲線を描く

ここでは、下のようなグラフを描くことを目指します。

まずは点をプロットし、直線の部分は結んでしまいましょう。
以下のように記述します。

\begin{tikzpicture}[scale=0.5]

\coordinate[label=above right:$v_1$](v1)at(4,6);
\coordinate[label=left:$v_2$](v2)at(0,0);
\coordinate[label=below:$v_3$](v3)at(5,-2);
\coordinate[label=right:$v_4$](v4)at(10,-1);

\draw[thick](v1)--(v2);
\draw[thick](v1)--(v3);
\draw[thick](v2)--(v4);

\foreach\P in{v1,v2,v3,v4}\fill[black](\P)circle(0.2);

\end{tikzpicture}

大きさは適当に調整しています

多重辺その1

次に、$${v_1}$$から$${v_4}$$への多重辺を作成します。
辺を描くソースの入力の際に、辺が頂点から出る角度と、頂点に入る角度を指定することができます
以下のように記述します。

\begin{tikzpicture}[scale=0.5]
\coordinate[label=above right:$v_1$](v1)at(4,6);
\coordinate[label=left:$v_2$](v2)at(0,0);
\coordinate[label=below:$v_3$](v3)at(5,-2);
\coordinate[label=right:$v_4$](v4)at(10,-1);

\draw[thick](v1)--(v2);
\draw[thick](v1)--(v3);
\draw[thick](v2)--(v4);
\draw[thick](v1)to[out=290,in=150](v4);
\draw[thick](v1)to[out=0,in=90](v4);


\foreach\P in{v1,v2,v3,v4}\fill[black](\P)circle(0.2);
\end{tikzpicture}

太字になっている2行のうち上の行は、$${v_1}$$から辺が290度の方向に出て、$${v_4}$$に150度の方向から入る、という指示になります。
下の行は、$${v_1}$$から0度で出て、$${v_4}$$に90度で入る、という指示です(度数法で記述します!)。
コンパイルするとこうなります。

角度をいくつにすると滑らかで自然に見えるかは、適宜調整をしていきます。地味に面倒な作業です…

いずれにせよ、これで簡単な多重辺は描けます。

多重辺その2

同様に$${v_1}$$から$${v_3}$$への多重辺も描いてみます。
角度を以下のように設定してコンパイルすると…

\begin{tikzpicture}[scale=0.5]
\coordinate[label=above right:$v_1$](v1)at(4,6);
\coordinate[label=left:$v_2$](v2)at(0,0);
\coordinate[label=below:$v_3$](v3)at(5,-2);
\coordinate[label=right:$v_4$](v4)at(10,-1);

\draw[thick](v1)--(v2);
\draw[thick](v1)--(v3);
\draw[thick](v2)--(v4);
\draw[thick](v1)to[out=290,in=150](v4);
\draw[thick](v1)to[out=0,in=90](v4);
\draw[thick](v1)to[out=180,in=180](v3);

\foreach\P in{v1,v2,v3,v4}\fill[black](\P)circle(0.2);
\end{tikzpicture}

違う、そうじゃない

ただ角度を設定しただけでは辺の交差が生まれてしまいます。
もっと$${v_2}$$の左側を通って欲しい…

そこで、$${v_2}$$の左側にダミーの点を取り、その点を経由して$${v_3}$$に入るようにソースを書き加えます。

\begin{tikzpicture}[scale=0.5]
\coordinate[label=above right:$v_1$](v1)at(4,6);
\coordinate[label=left:$v_2$](v2)at(0,0);
\coordinate[label=below:$v_3$](v3)at(5,-2);
\coordinate[label=right:$v_4$](v4)at(10,-1);

\draw[thick](v1)--(v2);
\draw[thick](v1)--(v3);
\draw[thick](v2)--(v4);
\draw[thick](v1)to[out=290,in=150](v4);
\draw[thick](v1)to[out=0,in=90](v4);
\draw[thick](v1)to[out=180,in=90](-1.5,1);
\draw[thick](-1.5,1)to[out=270,in=200](v3);

\foreach\P in{v1,v2,v3,v4}\fill[black](\P)circle(0.2);
\end{tikzpicture}

$${v_1}$$から一度 (-1.5, 1)を通り、(-1.5, 1)から$${v_3}$$に入るという指示を書きました。これでコンパイルすれば…

(-1.5, 1)を経由しています

辺の交差が解消されました。

ダミーの点を経由するときは、ダミーの点に入る角度と出る角度の差が180度になると滑らかな曲線になるかと思います(今回は、入る角度が90度、出る角度が270度です)。
その他の細かい角度は適宜調整をしていく必要があります。これも面倒な作業ですが…

ループ

最後にループを作成しますが、要領は多重辺その2と同様で、ダミーの点を経由して元の点に戻る、という指示を与えることになります。
以下のように記述してみます。

\begin{tikzpicture}[scale=0.5]
\coordinate[label=above right:$v_1$](v1)at(4,6);
\coordinate[label=left:$v_2$](v2)at(0,0);
\coordinate[label=below:$v_3$](v3)at(5,-2);
\coordinate[label=right:$v_4$](v4)at(10,-1);

\draw[thick](v1)--(v2);
\draw[thick](v1)--(v3);
\draw[thick](v2)--(v4);
\draw[thick](v1)to[out=290,in=150](v4);
\draw[thick](v1)to[out=0,in=90](v4);
\draw[thick](v1)to[out=180,in=90](-1.5,1);
\draw[thick](-1.5,1)to[out=270,in=200](v3);
\draw[thick](v1)to[out=180,in=225](3,8);
\draw[thick](3,8)to[out=45,in=60](v1);

\foreach\P in{v1,v2,v3,v4}\fill[black](\P)circle(0.2);
\end{tikzpicture}

$${v_1}$$の上側にある(3, 8)を通り、また$${v_1}$$に戻るように指示しました。
これでコンパイルしてみます。

ループを描きました

こちらも適宜角度を変えて、イイ感じのループになるように調整します。

ちょっと手間が多いですが、グラフを描くときに欲しい曲線はこれでだいたい出力できると思います。

その3はここまでにします。


この記事が気に入ったらサポートをしてみませんか?