折れ線グラフを作ってみたのですが、(17,0)の点から原点方向に向かって余分な長い線が引かれてしまって、
グラフが変な形になります。ソースは添付しています。解決方法が分かる方はいらしゃいませんか。
¥documentclass[landscape,dvipdfmx]{jsarticle}
¥usepackage{graphicx,xcolor,tikz}
¥usepackage[dvipdfm,margin=1cm]{geometry}
¥pagestyle{empty}
¥def¥mintime{1}
¥def¥maxtime{16}
¥def¥xmin{¥mintime-1-0.5}
¥def¥xmax{¥maxtime-1+0.5}
%%% 折れ線グラフのデータとデータラベル出力位置
¥def¥lineChartData{
1/25/above,
2/24/above,
3/23/{above,xshift=4pt},
4/14/below,
5/16/{above,xshift=-4pt},
6/19/above,
7/15/below,
8/20/above,
9/21/below,
10/23/below,
11/23/below,
12/23/below,
13/23/below,
14/25/below,
15/30/above,
16/50/{above,xshift=4pt},
}
%%% 折れ線グラフの出力
¥def¥outputLineChartData#1{%
¥def¥points{}%
¥foreach ¥x/¥y/¥pos in {#1}{%
¥expandafter¥node¥expandafter[¥pos, fill=white, inner sep=2pt, outer sep=5pt] at (¥x-1,¥y) {¥y};
¥xdef¥points{¥points(¥x-1,¥y)}
}
¥draw[mark=*, mark size=3pt, line width=2pt, color=red] plot coordinates {¥points};
}
¥def¥lineChart{¥bgroup
¥def¥ymin{0}%
¥def¥ymax{120}%
¥begin{center}
¥makebox[0pt][c]{%
¥begin{tikzpicture}[x=9mm,y=1mm]
¥draw (¥xmin,¥ymax) -- (¥xmin,¥ymin) -- (¥xmax,¥ymin) -- (¥xmax,¥ymax);
¥foreach ¥x in {1,...,16}
¥draw[font=¥small] (¥x-1,¥ymin) node[below] {¥x} -- +(0,1);
¥foreach ¥y in {10,20,...,120}{
¥ifx¥y¥ymax¥def¥style{}¥else¥def¥style{dotted}¥fi
¥draw[¥style] (¥xmin,¥y) node[left] {¥y} -- (¥xmax,¥y);
}
¥expandafter¥outputLineChartData¥expandafter{¥lineChartData}
¥end{tikzpicture}}¥par
{¥Large 推移}
¥end{center}
¥egroup}
¥begin{document}
¥baselineskip22pt
¥lineChart
¥end{document}
Table of Contents
最後のプロットデータの記述に問題があるようです。
記述のデータを用いて \foreach で回すと最後に \x \y \pos 全て空のものが返され、 (-1, ) の座標値が追加されます。結果、最後のプロットしたい座標から (-1,0) に 線が描画されるようです。
texdoc tikz で表示される pdf の 1231 ページ Part X The System Layer を参考に検証してみました。
以下のデバッグコードを含む差分を参考にしてください。
@@ -24,8 +24,7 @@
13/23/below,
14/25/below,
15/30/above,
- 16/50/{above,xshift=4pt},
- }
+ 16/50/{above,xshift=4pt}} % ←ここ「,」と「改行」「空白を除去」
%%% 折れ線グラフの出力
\def\outputLineChartData#1{%
@@ -33,8 +32,10 @@
\foreach \x/\y/\pos in {#1}{%
\expandafter\node\expandafter[\pos, fill=white, inner sep=2pt, outer sep=5pt] at (\x-1,\y) {\y};
\xdef\points{\points(\x-1,\y)}
+ \typeout{debug x=\x, y=\y, points=\points}
}
\draw[mark=*, mark size=3pt, line width=2pt, color=red] plot coordinates {\points};
+ \typeout{ DEBUG \points}
}
debug/DEBUG のデバッグ行を有効にしてビルドした後、
.log ファイルを debug DEBIG で検索するとご理解いただけるのではと思いますが
極論でいえば
{x1/y1/[pos1. .....xn/yn/posn,} % 最後のエレメントに続いて「、改行」がある
と
{x1/y1/[pos1. .....xn/yn/posn}
の「最後の要素」の表現違いです。
つまり foreach での \x \y は、前者が 「(x1, y1) ... (xn,yn) (0,0)」 ですが。後者は 「(x1, y1) ... (xn,yn) 」です。
.log ファイルを debug DEBIG で検索するとご理解いただけるのではと思いますが
極論でいえば
{x1/y1/[pos1. .....xn/yn/posn,} % 最後のエレメントに続いて「、改行」がある
と
{x1/y1/[pos1. .....xn/yn/posn}
の「最後の要素」の表現違いです。
つまり foreach での \x \y は、前者が 「(x1, y1) ... (xn,yn) (0,0)」 ですが。後者は 「(x1, y1) ... (xn,yn) 」です。
「.log ファイルを debug DEBUG で検索する」
.log ファイル
- latex は「ビルド」とか「コンパイル」「タイプセット」などという処理を行うと .pdf 以外にもいくつかの拡張子付きのファイルを出力します。
- 例えば「折れ線11.tex」を処理すると「折れ線11.log」というファイルが作成されます。
- 他にも .aux などいくつかありますが、ここでは .log のみ説明します
- .log に記録されるもの
- 処理した際に読み込んだクラスファイルやスタイルファイルのファイルパス情報やバージョン情報
- 警告メッセージやエラーメッセージ関連情報
- 今回のように
\typeout{メッセージ}
なども記録されます
デバッグ
- 専門用語の一種ですが、プログラミングをするとなにかしら動きがおかしい場合があり、そのおかしなものを「虫(
bug
)」と称していますが、それを取り除く(de
)という意味から想像していただければと思います。 - 今回のケースだと「ループの後に何故か
原点
近くの座標が生成されてしまう というのが「虫」です この座標情報がどのような情報から評価されているか確認するのが手っ取り早いと考えました。
具体的には
\x
と\y
あるいは\points
がどのようになっているか\typeout{メッセージ}
としてログファイルに記録するよう手を加えました。@@ -33,8 +32,10 @@ \foreach \x/\y/\pos in {#1}{% \expandafter\node\expandafter[\pos, fill=white, inner sep=2pt, outer sep=5pt] at (\x-1,\y) {\y}; \xdef\points{\points(\x-1,\y)} + \typeout{debug x=\x, y=\y, points=\points} % ← ループでの \x や \y などを調べる } \draw[mark=*, mark size=3pt, line width=2pt, color=red] plot coordinates {\points}; + \typeout{ DEBUG \points} % プロットする座標情報を調べる }
- 専門用語の一種ですが、プログラミングをするとなにかしら動きがおかしい場合があり、そのおかしなものを「虫(
検索
- vscode のような汎用テキストエディタなどで .log ファイルを開いて、その検索機能を利用して
debug
やDEBUG
を検索してください - コマンドプロンプトなどで直接
ptex2pdf -l 折れ線11
などとすれば、ログファイルに書き込まれるものとほぼどうとうのものが表示されますので、その中からdebug
やDEBUG
を検索でもよいです。 当初の記述のままデバッグ行をいれて処理すると最後の部分ですが以下のような結果が得られます
16,50
が読み込まれ、x=16, y=50
ととりこまれていて、終了のはずがdebug x=16, y=50, points=(1-1,25)(2-1,24)(3-1,23)(4-1,14)(5-1,16)(6-1,19)(7-1,1 5)(8-1,20)(9-1,21)(10-1,23)(11-1,23)(12-1,23)(13-1,23)(14-1,25)(15-1,30)(16-1,5 0)
x=, y=,
が対象になっている→これが虫による影響debug x=, y=, points=(1-1,25)(2-1,24)(3-1,23)(4-1,14)(5-1,16)(6-1,19)(7-1,15)(8 -1,20)(9-1,21)(10-1,23)(11-1,23)(12-1,23)(13-1,23)(14-1,25)(15-1,30)(16-1,50)(- 1,)
- vscode のような汎用テキストエディタなどで .log ファイルを開いて、その検索機能を利用して
\foreach の情報
- コマンドプロンプトなどのコンソールから
texdoc tikz
- 今回は
tikz
を利用されているので 通常の texlive フルインストールしたものであれば、上記コマンドで英文ですが公式マニュアルが利用できます
- 今回は
- ここまでの情報で
tikz
foreach
で調べれば良いことがわかりますのでいろいろrしらべてください - 日本語で簡単に紹介している九州大学附属図書館の以下の情報をとりあえず参考にしてはいかが?
とはいえ、こまかなところはやっぱり公式マニュアルと言いたいところですが
1300
ぺーじを超える pdf です。検索には苦労するので私はいかのようにしています。tikz -l tikz
でマニュアルのファイルパスをメモその pdf を
rga
というツールで foreach などの目的の文字列を含むページ情報をもとに PDF プレビューアで調べるようにしています。(以下は私の環境での例)rga foreach /opt/texlive/2024/texmf-dist/doc/generic/pgf/pgfmanual.pdf
rga
は windows であれば scoop や chocoletty で、macOS であれば homebrew でインストールできます。