.png)
Editar:
elpregunta originalfue respondido por @James y su solución cubre el problema particular presentado aquí.
EnEsta preguntaHe expuesto el problema original y he recibido respuesta a los puntos 1, 2 y 4, pero no al 3º.
Inspirándome en la respuesta dada por Carina, comencé a trabajar en alguna solución, pero aún no es 100% correcta.
Residencia eneste metaDecidí publicar una subpregunta para refinar la respuesta definitiva y ponerla en la publicación original para la posteridad.
El problema (que queda)
- Para hacer las secciones* y ponerles las etiquetas (en los espacios, no en las líneas), @Carina me dio algunas buenas ideas, pero necesito algo un poco más avanzado, la idea es que esas líneas continúen debajo de las etiquetas X.
- Para obtener los valores de las líneas separadoras de sección de un archivo externo (como se hace con los gráficos de áreas apiladas).
("secciones" son aquellas rebanadas o particiones verticales del eje X que se ven en la imagen. Si X es tiempo, pueden entenderse como "períodos de tiempo" consecutivos)
La respuesta parcial
\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}
Algún gimp para mostrar el resultado deseado.
(Tenga en cuenta que los pasos 1 y 3 son muy cortos, por lo que parece una sola línea pero son dos)
Muchas gracias por su tiempo :)
Respuesta1
Aquí hay una forma más "automatizada" deZarkos responde, donde no es necesario dibujar todas las "líneas de paso" a mano. Para más detalles, eche un vistazo a los comentarios en el código.
\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}
Respuesta2
Editar:Esta solución en comparación con su MWE se diferencia en lo siguiente:
- en el preámbulo se agrega
\pgfplotsset{compat=1.13}
, por lo que en la notación de nodos y coordenadas de dibujo se pueden omitiraxis cs:
- Se agregan bibliotecas TikZ
\usetikzlibrary{calc,positioning}
para la determinación de las coordenadas de los nodos. - en
ymax
ambos ejes se cambian de 500 a 200 y de 8000 a 3000. Con esto, la parte interesante del gráfico se vuelve más alta y más clara. - en ambos ejes se cambia el estilo del gráfico en la forma que más me gustó :-)
- En los segundos ejes (
ytick
en el lado derecho del gráfico) se agrega la opciónclip=false
. De esta manera se habilita dibujar nodos y líneas debajo del gráfico. - Según los nuevos
ymax
valores se recalculan las coordenadas para separar los pasos. - Al asignar pasos se supone que los pasos están entre líneas dadas, es decir, hay 4 pasos. Para el paso 2 muy limitado, se sugiere una nueva forma de mostrar dónde está
Con estos cambios, el gráfico deseado se convierte en:
El código completo con los lugares de cambios firmados es:
\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}
Con suerte, esta solución le servirá como base para perfeccionar el gráfico o agregar pasos faltantes (su imagen muestra más de lo que se puede concluir de su MWE)