(残る)問題

(残る)問題

編集
:元の質問@James によって回答され、彼の解決策はここで提示された特定の問題をカバーしています。


この質問私は元の問題を明らかにし、ポイント 1、2、4 に対する回答を受け取りましたが、ポイント 3 に対する回答は受け取りませんでした。

Carina の回答に触発されて、何らかの解決策を考え始めましたが、まだ 100% 正しいわけではありません。

に基づくこのメタ最終的な回答を洗練させるためにサブ質問を投稿し、後世のために元の投稿に載せることにしました。

(残る)問題

  • セクション* を作成し、それらにラベルを付ける (線ではなくスペースに) ために、@Carina からいくつかの良いアイデアをもらいましたが、もう少し高度なものが必要です。アイデアとしては、それらの線が X ラベルの下に続くというものです。
  • セクション区切り線の値を外部ファイルから取得します (積み上げエリア プロットの場合と同様に)。

(「セクション」とは、図に見られる X 軸の垂直スライスまたはパーティションです。X が時間である場合、それらは連続した「時間期間」として理解できます)

部分的な答え

部分チャート

\documentclass{standalone}
\usepackage{pgfplots}
\usepgfplotslibrary{colormaps}
\usepackage{filecontents}

\begin{filecontents}{data.txt}
Time core1 core2 core3 core4 mem
0 7.847 19.51 18.389 18.943  400.90
1 6.863 64.706 12.871 30  913.50
2 10 88 0 0  1215.19
3 57.576 39 0 0  1691.61
4 0.99 99 0.99 0  1694.64
5 0 40.594 60 0  1698.15
6 0 96.939 3.03 0  1699.55
7 0 50.495 48.515 0  1700.09
8 0.99 53 47 0  1703.00
9 0 28.283 69 3  1696.77
10 31.313 0 0 67.677  1697.30
11 15 84 1.01 2.941  2252.78
12 0 15 14.141 71.717  2249.72
13 31 27 6.931 37  2249.00
14 2 13.725 60.606 28  2248.16
15 9 34.343 41 19  2248.31
16 32 41.414 25.743 0  2250.18
17 26 33.663 20.408 21  2249.89
18 23 13 40 25.253  2249.89
19 47.525 18.182 22 12.121  2249.60
20 34.694 25.253 22.772 16.832  2249.32
21 22 0.99 42.574 37.374  2249.01
22 12.871 24 12.121 56.436  2251.39
23 17.172 15.152 49.02 20.202  2252.57
24 27 5.051 32.653 36  2252.72
\end{filecontents}

\begin{filecontents}{data2.txt} % For now, I'm not using this file
steps
0
0.024
10.127
10.143
21.634
24.81
\end{filecontents}

\begin{document}
    \begin{tikzpicture}[scale=1]
        \begin{axis}[
            axis y line=left,
            axis x line=bottom,
            enlarge x limits=0,
            enlarge y limits=0,
            width=15cm,
            height=8cm,
            stack plots=y,
            area style,
            xlabel={Time},
            ylabel={CPU usage},
            ymax=500
        ]
            \foreach \i in {1,...,4}{
                \addplot table [y index=\i]{data.txt} \closedcycle;
            }
        \end{axis}
        \begin{axis}[
            axis y line=right,
            axis x line=none,
            enlarge x limits=0,
            enlarge y limits=0,
            width=15cm,
            height=8cm,
            fill=none,
            ymax=7600
        ]
            \addplot[very thick,draw=green] table[y index=5]{data.txt};

            % The separators are written manually and there is no label
            \draw[black](axis cs:  0.024,0)--(axis cs:  0.024,8000);
            \draw[black](axis cs: 10.127,0)--(axis cs: 10.127,8000);
            \draw[black](axis cs: 10.143,0)--(axis cs: 10.143,8000);
            \draw[black](axis cs: 21.634,0)--(axis cs: 21.634,8000);
            \draw[black](axis cs: 24.810,0)--(axis cs: 24.810,8000);
        \end{axis}
    \end{tikzpicture}
\end{document}

望ましい出力を表示するためのGIMP

(ステップ 1 と 3 は非常に短いため、1 行のように見えますが、実際には 2 行です)

望ましい出力

お時間をいただきありがとうございました:)

答え1

より「自動化された」方法がありますザルコスの回答、すべての「ステップ ライン」を手動で描画する必要はありません。詳細については、コード内のコメントを参照してください。

\documentclass[border=2mm,many]{standalone}
\usepackage{pgfplots}
\usepackage{pgfplotstable}
    \pgfplotsset{compat=1.11}

\usepackage{filecontents}
    \begin{filecontents}{data.txt}
        Time core1 core2 core3 core4 mem
        0   7.847  19.51   18.389  18.943    400.90
        1   6.863  64.706  12.871  30        913.50
        2  10      88       0       0       1215.19
        3  57.576  39       0       0       1691.61
        4   0.99   99       0.99    0       1694.64
        5   0      40.594  60       0       1698.15
        6   0      96.939   3.03    0       1699.55
        7   0      50.495  48.515   0       1700.09
        8   0.99   53      47       0       1703.00
        9   0      28.283  69       3       1696.77
        10 31.313   0       0      67.677   1697.30
        11 15      84       1.01    2.941   2252.78
        12   0     15      14.141  71.717   2249.72
        13  31     27       6.931  37       2249.00
        14  2      13.725  60.606  28       2248.16
        15  9      34.343  41      19       2248.31
        16 32      41.414  25.743   0       2250.18
        17 26      33.663  20.408  21       2249.89
        18 23      13      40      25.253   2249.89
        19 47.525  18.182  22      12.121   2249.60
        20 34.694  25.253  22.772  16.832   2249.32
        21 22       0.99   42.574  37.374   2249.01
        22 12.871  24      12.121  56.436   2251.39
        23 17.172  15.152  49.02   20.202   2252.57
        24 27       5.051  32.653  36       2252.72
    \end{filecontents}

    \begin{filecontents}{data2.txt}
        steps
        0
        0.024
        10.127
        10.143
        21.634
        24.81
    \end{filecontents}

\begin{document}
    \begin{tikzpicture}

        % define `xmax' value
        % (it has to be a command because it is later needed outside of an
        %  axis environment to filter the `steps' elements, which are greater
        %  than `xmax')
        \def\xmax{24}

        % define color for the vertical lines for the steps
        \colorlet{step color}{black!60}


        % define here what both axis environments have in common
        % so you don't have to repeat this stuff at every axis
        \pgfplotsset{
            every axis/.append style={
                enlargelimits=false,
                width=15cm,
                height=8cm,
                xmin=0,
                xmax=\xmax,
                axis on top,
            },
        }

        \begin{axis}[
            area style,
            stack plots=y,
            xlabel={Time},
            ylabel={CPU usage},
            ymin=0,
            ymax=150,
            ytick distance=25,  % <-- to match ticks on both axis
        ]
            \foreach \i in {1,...,4}{
                \addplot table [x=Time,y=core\i]{data.txt} \closedcycle;
            }
        \end{axis}

            %%% collect all time stamps of the steps in `\allX'
            %%% it is later used in the axis environment to draw the lines
            %%% below the axis lines
            % store table for the steps
            \pgfplotstableread[header=true]{data2.txt}{\data}
            % store number of rows
            \pgfplotstablegetrowsof{\data}
                \pgfmathsetmacro{\rows}{\pgfplotsretval-1}
            % store first element to `\allX'
            \pgfplotstablegetelem{0}{steps}\of\data
                \pgfmathsetmacro{\first}{\pgfplotsretval}
            \def\allX{\first}
            % cycle through the rest of the list and append the time to
            % `\allX' if the value is smaller than `\xmax'
            \pgfplotsforeachungrouped \i in {1,...,\rows} {
                \pgfplotstablegetelem{\i}{steps}\of\data
                \pgfmathparse{(\pgfplotsretval<\xmax) ? 1 : 0}
                \ifdim \pgfmathresult pt>0pt
                    \edef\allX{\allX,\pgfplotsretval}
                \fi
            }

        \begin{axis}[
            axis y line*=right,% <---
            no markers,
            %
            %%% draw step labels
            % therefore use the data of the first `\addplot'
            xtick=data,
            % they should be drawn in the middle of two values
            x tick label as interval,
            % define how the label should look like
            xticklabel={
                % because indexing starts at 0 --> add 1
                \pgfmathparse{\ticknum + 1}
                Step \pgfmathprintnumber{\pgfmathresult}
            },
            % to not overlap the tick label and label of the first axis
            % shift these labels further down
            x tick label style={
                yshift=-8ex,
            },
            ymin=0,
            ymax=3000,
            % (you should also provide a label on the second y axis)
            ylabel=(\emph{replace me}),
            clip=false,% <---
            % in case steps are larger than `xmax' -->  force it to be `xmax'
            % (here you see how to extract the `xmin' and `xmax' values
            %  when you are _inside_ of an axis environment)
            restrict x to domain*=
                \pgfkeysvalueof{/pgfplots/xmin}:\pgfkeysvalueof{/pgfplots/xmax},
        ]

            % use `ybar interval' plot to fake some vertical lines
            % this also enables the easy printing of the `xticklabels'
            \addplot [
                draw=step color,
                ybar interval,
            ]
                table [x=steps,y expr=\pgfkeysvalueof{/pgfplots/ymax}] {data2.txt};

            % now draw the other lines regarding to the second y axis
            \addplot [very thick,draw=green] table [x=Time,y=mem] {data.txt};

            % plot the "extended" vertical lines below the axis
            % with the help of the above prepared `\allX' variable
            \foreach \x in \allX {
                \edef\temp{\noexpand%
                    \draw [color=step color] ([yshift=-3ex] \x,0) -- ++(0,-10ex);
                }\temp
            }

        \end{axis}
    \end{tikzpicture}
\end{document}

上記コードの結果を示す画像

答え2

編集:このソリューションは、MWE と比較して次の点で異なります。

  • プリアンブルが追加されている\pgfplotsset{compat=1.13}ので、ノードと描画座標の表記は省略できる。axis cs:
  • \usetikzlibrary{calc,positioning}ノード座標を決定するためのTikZライブラリが追加されました
  • 両軸の値ymaxが500から200に、8000から3000に変更されました。これにより、グラフの興味深い部分がより高くなり、より明確になります。
  • 両方の軸のグラフスタイルが変更され、より気に入りました :-)
  • ytick2 番目の軸 (グラフの右側)にオプションが追加されましたclip=false。これにより、グラフの下にノードと線を描画できるようになります。
  • 新しい値に応じて、ymaxステップを区切るための座標が再計算されます
  • ステップの割り当てでは、ステップは指定された行の間にあると想定されます。つまり、4つのステップがあります。非常に狭いステップ2では、それがどこにあるかを示す新しい方法を提案します。

この変更により、目的のグラフは次のようになります。

ここに画像の説明を入力してください

変更箇所の署名付き完全なコードは次のとおりです。

\documentclass[border=5mm,many]{standalone}
\usepackage{pgfplots}
    \usepgfplotslibrary{colormaps}
    \pgfplotsset{compat=1.13}

    \usetikzlibrary{backgrounds,calc,positioning}
\usepackage{filecontents}

\begin{filecontents}{data.txt}
    Time core1 core2 core3 core4 mem
    0   7.847  19.51   18.389  18.943    400.90
    1   6.863  64.706  12.871  30        913.50
    2  10      88       0       0       1215.19
    3  57.576  39       0       0       1691.61
    4   0.99   99       0.99    0       1694.64
    5   0      40.594  60       0       1698.15
    6   0      96.939   3.03    0       1699.55
    7   0      50.495  48.515   0       1700.09
    8   0.99   53      47       0       1703.00
    9   0      28.283  69       3       1696.77
    10 31.313   0       0      67.677   1697.30
    11 15      84       1.01    2.941   2252.78
    12   0     15      14.141  71.717   2249.72
    13  31     27       6.931  37       2249.00
    14  2      13.725  60.606  28       2248.16
    15  9      34.343  41      19       2248.31
    16 32      41.414  25.743   0       2250.18
    17 26      33.663  20.408  21       2249.89
    18 23      13      40      25.253   2249.89
    19 47.525  18.182  22      12.121   2249.60
    20 34.694  25.253  22.772  16.832   2249.32
    21 22       0.99   42.574  37.374   2249.01
    22 12.871  24      12.121  56.436   2251.39
    23 17.172  15.152  49.02   20.202   2252.57
    24 27       5.051  32.653  36       2252.72
\end{filecontents}

\begin{filecontents}{data2.txt}
    steps
    0
    0.024
    10.127
    10.143
    21.634
    24.81
\end{filecontents}

\begin{document}
    \begin{tikzpicture}[scale=1,node distance=0mm]
        \begin{axis}[
%            axis y line=left,
%            axis x line=bottom,
            grid,% <---
            area style,
            enlarge x limits=false,% <---
            enlarge y limits=false,% <---
            width=15cm,
            height=8cm,
            stack plots=y,
            xlabel={Time},
            ylabel={CPU usage},
            ymax=150,
        ]
            \foreach \i in {1,...,4}{
                \addplot table [y index=\i,opacity=0.5]{data.txt} \closedcycle;
            }
        \end{axis}

        \begin{axis}[
%            axis y line=right,
%            axis x line=none,
            axis y line*=right,% <---
            grid,% <---
            enlarge x limits=false,
            enlarge y limits=false,
            width=15cm,
            height=8cm,
            fill=none,
            ymax=3000,
            clip=false,% <---
        ]
            \addplot[very thick,draw=green] table[y index=5]{data.txt};
            % The upper part of separators
            \draw
                ( 0.024,3000)-- +(0,-2200)% <---
                (10.127,3000)-- +(0,-2200)% <---
                (10.143,3000)-- +(0,-2200)% <---
                (21.634,3000)-- +(0,-2200)% <---
                (24.000,3000)-- +(0,-2200)% <---
            ;
            % nodes with steps names
            \node [above=of {$( 0.024,-300)!0.5!(10.127,-300)$}] {Step 1};% <---
            \node [above=of {$(10.127,-300)!0.5!(10.127,-300)$}] {Step 2};% <---
            \node [above=of {$(10.127,-300)!0.5!(21.634,-300)$}] {Step 3};% <---
            \node [above=of {$(21.634,-300)!0.5!(24.000,-300)$}] {Step 4};% <---
            % The lower part of separators
            \draw
                ( 0.024,150) -- (0.024,-300)% <---
                (10.127,150) |- ( 8.5,-50) -- ( 8.5,-300)% <---
                (10.143,150) |- (11.5,-50) -- (11.5,-300)% <---
                (21.634,150) -- (21.634,-300)% <---
                (24.000,150) -- (24.000,-300);% <---
        \end{axis}
    \end{tikzpicture}
\end{document}

この解決策がグラフの改良や不足しているステップの追加の基礎となることを願っています (あなたの図は MWE から結論付けられる以上のものを示しています)

関連情報