%20Problem.png)
Bearbeiten:
Dieursprüngliche Fragewurde von @James beantwortet und seine Lösung deckt das hier vorgestellte spezielle Problem ab.
InDiese FrageIch habe das ursprüngliche Problem dargelegt und eine Antwort auf die Punkte 1, 2 und 4 erhalten, jedoch nicht auf den 3.
Inspiriert durch Carinas Antwort habe ich begonnen, an einer Lösung zu arbeiten, aber sie ist noch immer nicht 100 % richtig.
Bezogen aufdiese MetaIch habe beschlossen, zur Verfeinerung der endgültigen Antwort eine Unterfrage zu posten und sie für die Nachwelt in den Originalbeitrag aufzunehmen.
Das (verbleibende) Problem
- @Carina hat mir ein paar gute Ideen gegeben, um die Abschnitte* zu erstellen und die Beschriftungen darauf anzubringen (in den Zwischenräumen, nicht in den Zeilen), aber ich brauche etwas Anspruchsvolleres. Die Idee ist, dass diese Zeilen unter den X-Beschriftungen fortgesetzt werden.
- Um die Werte für die Abschnittstrennlinien aus einer externen Datei abzurufen (wie es bei den gestapelten Flächendiagrammen der Fall ist).
(„Abschnitte“ sind die vertikalen Scheiben oder Unterteilungen der X-Achse, die im Bild zu sehen sind. Wenn X Zeit ist, können sie als aufeinanderfolgende „Zeiträume“ verstanden werden.)
Die Teilantwort
\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}
Etwas Gimp, um die gewünschte Ausgabe anzuzeigen
(Bitte beachten Sie, dass die Schritte 1 und 3 sehr kurz sind, sodass sie wie eine einzelne Zeile erscheinen, aber eigentlich zwei sind.)
Vielen Dank für deine Zeit :)
Antwort1
Hier ist eine "automatisiertere" Möglichkeit,Zarkos Antwort, bei dem Sie nicht alle „Schrittlinien“ von Hand zeichnen müssen. Einzelheiten finden Sie in den Kommentaren im Code.
\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}
Antwort2
Bearbeiten:Diese Lösung unterscheidet sich im Vergleich zu Ihrem MWE in folgenden Punkten:
- in der Präambel wird hinzugefügt
\pgfplotsset{compat=1.13}
, so dass in der Notation von Knoten und Zeichnung Koordinaten weggelassen werden könnenaxis cs:
- Hinzugefügt sind TikZ-Bibliotheken
\usetikzlibrary{calc,positioning}
zur Bestimmung von Knotenkoordinaten - Die Werte
ymax
auf beiden Achsen werden von 500 auf 200 und von 8000 auf 3000 geändert. Dadurch wird der interessante Teil des Diagramms höher und klarer - auf beiden Achsen wurde der Diagrammstil in einer Form geändert, die mir besser gefiel :-)
- In der zweiten Achse (
ytick
auf der rechten Seite des Diagramms) wurde die Option hinzugefügtclip=false
. Dadurch wird das Zeichnen von Knoten und Linien unter dem Diagramm ermöglicht. - nach den neuen
ymax
Werten werden die Koordinaten für die Trennschritte neu berechnet - Bei der Zuweisung von Schritten wird davon ausgegangen, dass die Schritte zwischen den vorgegebenen Zeilen liegen, d. h. es gibt 4 Schritte. Für sehr enge Schritte wird ein neuer Weg vorgeschlagen, um anzuzeigen, wo sie sind.
Mit diesen Änderungen wird Ihr gewünschtes Diagramm:
Der vollständige Code mit signierten Änderungsstellen lautet:
\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}
Hoffentlich dient diese Lösung als Grundlage für die Verfeinerung Ihres Diagramms oder zum Hinzufügen fehlender Schritte (Ihr Bild zeigt mehr, als aus Ihrem MWE geschlossen werden kann).