編輯
:原始问题由@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
这是一个更“自动化”的方式Zarkos 的回答,您无需手工绘制所有“步骤线”。有关详细信息,请查看代码中的注释。
\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 得出的结论更多)