
編輯:
:原問題@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
這是一種更“自動化”的方式札科斯回答,您不必手動繪製所有“台階線”。詳細內容請看程式碼中的註解。
\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。 - 在兩個軸上都改變了我更喜歡的形式的圖形樣式:-)
- 在第二個軸(
ytick
圖右側)新增了選項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 所能得出的結論)