折れ線グラフ

折れ線グラフ

- Takashi Naniwa の投稿
返信数: 6
折れ線グラフを作ってみたのですが、(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}
Takashi Naniwa への返信

Re: 折れ線グラフ

- 和田 勇 の投稿

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}
 }
和田 勇 への返信

Re: 折れ線グラフ

- Takashi Naniwa の投稿
和田様

ありがとうございます。理屈はよく理解できませんが、指示通りに書き換えるとグラフが修正されました。
嬉しいです。ありがとうございます。助かりました。



Takashi Naniwa への返信

Re: 折れ線グラフ

- 和田 勇 の投稿
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) 」です。
和田 勇 への返信

Re: 折れ線グラフ

- Takashi Naniwa の投稿
コメントありがとうございます。ある方の作成したコードをコピペしたというのもあって文法を理解しないまま作りました。すみません。
改行があるとよくないというのは理解できました。

Latex初心者のため「.log ファイルを debug DEBIG で検索する」というのがよく理解できないのですが、初心者向けに解説されたサイトなどがあれば教えて欲しいです。

foreachについても初心者向けに解説されたサイトや書籍があれば教えて欲しいです。
Takashi Naniwa への返信

Re: 折れ線グラフ

- 和田 勇 の投稿

「.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 ファイルを開いて、その検索機能を利用して debugDEBUG を検索してください
    • コマンドプロンプトなどで直接 ptex2pdf -l 折れ線11 などとすれば、ログファイルに書き込まれるものとほぼどうとうのものが表示されますので、その中から debugDEBUG を検索でもよいです。
    • 当初の記述のままデバッグ行をいれて処理すると最後の部分ですが以下のような結果が得られます

      • 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,)
        

\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 でインストールできます。