%20%EB%AC%B8%EC%A0%9C.png)
편집 하다 :원래 질문@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}
원하는 출력을 표시하는 김프
(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에서 결론을 내릴 수 있는 것보다 더 많은 것을 보여줍니다).