Skip cords between funktioniert nicht wie gewollt

Tabellen und Grafiken erstellen und anordnen


Philipp_aus_BP

Skip cords between funktioniert nicht wie gewollt

Beitrag von Philipp_aus_BP »

Hallo liebe LaTeX-Gemeinde,

mein Problem ist das folgende: Ich möchte eine Grafik erstellen, jedoch fängt eine Spalte des Datensatzes später an (Spalte 4). Dieses müsste mit "skip coords between index={0}{3}" zu lösen sein, allerdings fängt der Plot nicht zu dem gewünschten Zeitpunkt an, sondern ab dem Anfang. Somit ist die rote Linie nicht mehr synchron mit den anderen beiden und die Werte nicht vergleichbar. Wie bekomme ich es hin, dass die ersten (leeren) Werte der roten Linie wirklich übersprungen wird und die Punkte an die richtige Stelle kommen? Ich danke vielmals im Voraus! anbei mein Minimalbeispiel.
\usepackage{pgfplots}
\newcounter{groupcount} 
\pgfplotsset{ 
   compat=newest,% Lesetipp: http://texwelt.de/wissen/fragen/19163 
   /pgf/number format/1000 sep=\thinspace,% Abschnitt 92.1 Changing display styles in pgfmanual.pdf 
   /pgf/number format/min exponent for 1000 sep=4, 
    draw group line/.style n args={5}{% Quelle: https://tex.stackexchange.com/questions/71350 
        after end axis/.append code={ 
            \setcounter{groupcount}{0} 
            \pgfplotstableforeachcolumnelement{#1}\of\datatable\as\cell{% 
                \def\temp{#2} 
                \ifx\temp\cell 
                    \ifnum\thegroupcount=0 
                        \stepcounter{groupcount} 
                        \pgfplotstablegetelem{\pgfplotstablerow}{[index]0}\of\datatable 
                        \coordinate [yshift=#4] (startgroup) at (axis cs:\pgfplotsretval,0); 
                    \else 
                        \pgfplotstablegetelem{\pgfplotstablerow}{[index]0}\of\datatable 
                        \coordinate [yshift=#4] (endgroup) at (axis cs:\pgfplotsretval,0); 
                    \fi 
                \else 
                    \ifnum\thegroupcount=1 
                        \setcounter{groupcount}{0} 
                        \draw [ 
                            shorten >=-#5, 
                            shorten <=-#5 
                        ] (startgroup) -- node [anchor=north] {#3} (endgroup); 
                    \fi 
                \fi 
            } 
            \ifnum\thegroupcount=1 
            \setcounter{groupcount}{0} 
            \draw [ 
               shorten >=-#5, 
               shorten <=-#5 
            ] (startgroup) -- node [anchor=north] {#3} (endgroup); 
            \fi 
        } 
    } 
} 

\pgfplotstableread[col sep=comma]{ 
1,	84.40,	136.44,	,		2013
2,	102.15,	136.44,	,		2013
3,	124.75,	176.93,	,		2014
4,	141.23,	175.18,	,		2014
5,	172.36,	214.88,	-5.70,	2014
6,	197.14,	213.67,	4.90,	2014
7,	184.26,	211.41,	10.21,	2015
8,	206.19,	216.73,	-5.77,	2015
9,	178.19,	226.07,	45.43,	2015
10,	192.00,	207.53,	74.78,	2015
11,	175.27,	208.02,	34.56,	2016
12,	205.23,	232.20,	23.46,	2016
13,	225.17,	241.23,	39.99,	2016
14,	279.86,	277.36,	15.12,	2016
15,	273.97,	306.60,	4.73,	2017
16,	309.35,	310.56,	17.66,	2017
17,	310.64,	352.00,	3.20,	2017
18,	346.56,	359.00,	13.24,	2017
}\datatable 
\begin{document}
\begin{tikzpicture} 
\begin{axis}[ 
   ymin=1, 
   ymax=400, 
   ytick={0,50,...,400}, 
   ylabel=Ranking,
   ymajorgrids,
   y dir=reverse, 
   xtick=data,
   width=6.8in,
   legend pos=north west, 
   xticklabel={ 
      \pgfmathparse{mod(\tick+1,4)+1} 
      Q\pgfmathprintnumber[int trunc]{\pgfmathresult} 
   }, 
   draw group line={[index]4}{2013}{2013}{-92.5ex}{7pt},
   draw group line={[index]4}{2014}{2014}{-92.5ex}{7pt},
   draw group line={[index]4}{2015}{2015}{-92.5ex}{7pt},
   draw group line={[index]4}{2016}{2016}{-92.5ex}{7pt},
   draw group line={[index]4}{2017}{2017}{-92.5ex}{7pt}
] 
\addplot[smooth, mark=*, blue] table[x index=0,y index=1] \datatable;
\addplot[smooth, mark=*, green] table[x index=0,y index=2] \datatable;
\legend{Ranking Games, Top Grossing}
\end{axis}



\begin{axis}[
        yticklabel pos=right,% yticklabel auf der rechten Seite
        ymin=-50, ymax=200,
        xtick=\empty,% xticks nicht noch einmal zeichnen
  		ylabel=Inflation,
   		%ymajorgrids,
   		width=6.8in,
   		legend pos=north east
      ]
\addplot[smooth, mark=*, red] table[x index=0,y index=3, skip coords between index={0}{3}] \datatable;
\legend{Inflation}
\end{axis}
\end{tikzpicture} 

Bartman
Forum-Meister
Forum-Meister
Beiträge: 2456
Registriert: Do 16. Jul 2009, 21:41
Wohnort: Hessische Provinz

Beitrag von Bartman »

Achte bitte auf die Vollständigkeit Deines Beispiels.

Ich habe den Eindruck, Du brauchst eher unbounded coords=jump statt skip coords between index={0}{3}. Laut Dokumentation müsstest Du außerdem einen Platzhalter in die betroffenen Zellen einfügen. Bei Overleaf gibt es dann jedoch die Fehlermeldung No shape named endgroup is known. Mein MiKTeX-System habe ich dazu nicht befragt.

Das folgende Beispiel wurde lediglich vervollständigt:
\documentclass[border=5pt]{standalone}
\usepackage{pgfplots}

\newcounter{groupcount} 
\pgfplotsset{ 
   compat=newest,% Lesetipp: http://texwelt.de/wissen/fragen/19163 
   /pgf/number format/1000 sep=\thinspace,% Abschnitt 92.1 Changing display styles in pgfmanual.pdf 
   /pgf/number format/min exponent for 1000 sep=4, 
    draw group line/.style n args={5}{% Quelle: https://tex.stackexchange.com/questions/71350 
        after end axis/.append code={ 
            \setcounter{groupcount}{0} 
            \pgfplotstableforeachcolumnelement{#1}\of\datatable\as\cell{% 
                \def\temp{#2} 
                \ifx\temp\cell 
                    \ifnum\thegroupcount=0 
                        \stepcounter{groupcount} 
                        \pgfplotstablegetelem{\pgfplotstablerow}{[index]0}\of\datatable 
                        \coordinate [yshift=#4] (startgroup) at (axis cs:\pgfplotsretval,0); 
                    \else 
                        \pgfplotstablegetelem{\pgfplotstablerow}{[index]0}\of\datatable 
                        \coordinate [yshift=#4] (endgroup) at (axis cs:\pgfplotsretval,0); 
                    \fi 
                \else 
                    \ifnum\thegroupcount=1 
                        \setcounter{groupcount}{0} 
                        \draw [ 
                            shorten >=-#5, 
                            shorten <=-#5 
                        ] (startgroup) -- node [anchor=north] {#3} (endgroup); 
                    \fi 
                \fi 
            } 
            \ifnum\thegroupcount=1 
            \setcounter{groupcount}{0} 
            \draw [ 
               shorten >=-#5, 
               shorten <=-#5 
            ] (startgroup) -- node [anchor=north] {#3} (endgroup); 
            \fi 
        } 
    } 
} 

\pgfplotstableread[col sep=comma]{ 
1,   84.40,   136.44,   ,      2013
2,   102.15,   136.44,   ,      2013
3,   124.75,   176.93,   ,      2014
4,   141.23,   175.18,   ,      2014
5,   172.36,   214.88,   -5.70,   2014
6,   197.14,   213.67,   4.90,   2014
7,   184.26,   211.41,   10.21,   2015
8,   206.19,   216.73,   -5.77,   2015
9,   178.19,   226.07,   45.43,   2015
10,   192.00,   207.53,   74.78,   2015
11,   175.27,   208.02,   34.56,   2016
12,   205.23,   232.20,   23.46,   2016
13,   225.17,   241.23,   39.99,   2016
14,   279.86,   277.36,   15.12,   2016
15,   273.97,   306.60,   4.73,   2017
16,   309.35,   310.56,   17.66,   2017
17,   310.64,   352.00,   3.20,   2017
18,   346.56,   359.00,   13.24,   2017
}\datatable 
\begin{document}
\begin{tikzpicture} 
\begin{axis}[ 
   ymin=1, 
   ymax=400, 
   ytick={0,50,...,400}, 
   ylabel=Ranking,
   ymajorgrids,
   y dir=reverse, 
   xtick=data,
   width=6.8in,
   legend pos=north west, 
   xticklabel={ 
      \pgfmathparse{mod(\tick+1,4)+1} 
      Q\pgfmathprintnumber[int trunc]{\pgfmathresult} 
   }, 
   draw group line={[index]4}{2013}{2013}{-92.5ex}{7pt},
   draw group line={[index]4}{2014}{2014}{-92.5ex}{7pt},
   draw group line={[index]4}{2015}{2015}{-92.5ex}{7pt},
   draw group line={[index]4}{2016}{2016}{-92.5ex}{7pt},
   draw group line={[index]4}{2017}{2017}{-92.5ex}{7pt}
] 
\addplot[smooth, mark=*, blue] table[x index=0,y index=1] \datatable;
\addplot[smooth, mark=*, green] table[x index=0,y index=2] \datatable;
\legend{Ranking Games, Top Grossing}
\end{axis}



\begin{axis}[
        yticklabel pos=right,% yticklabel auf der rechten Seite
        ymin=-50, ymax=200,
        xtick=\empty,% xticks nicht noch einmal zeichnen
        ylabel=Inflation,
         %ymajorgrids,
         width=6.8in,
         legend pos=north east
      ]
\addplot[smooth, mark=*, red] table[x index=0,y index=3, skip coords between index={0}{3}] \datatable;
\legend{Inflation}
\end{axis}
\end{tikzpicture} 
\end{document}

Pilipp_aus_BP

Beitrag von Pilipp_aus_BP »

Hallo,

in der Dokumentation habe ich folgendes gefunden:
"If you need unbalanced columns, simply use nan as “empty cell” placeholder. These coordinates will be skipped in plots."

Wenn ich in die leeren Einträge allerdings "nan" eintrage, dann funktioniert dieses nicht. Woran könnte das liegen?

esdd
Forum-Meister
Forum-Meister
Beiträge: 2561
Registriert: So 7. Feb 2010, 16:36

Beitrag von esdd »

Deine zweite axis Umgebung verwendet eine andere Einteilung der x-Achse ;-)

Ergänze bei beiden axis Umgebungen ein einheitliches xmin, beispielsweise xmin=0. Dann kannst Du Dir das skip coords between sparen.

Mit dem Beispiel von Bartman:
\documentclass[border=5pt]{standalone} 
\usepackage{pgfplots} 

\newcounter{groupcount} 
\pgfplotsset{ 
compat=newest,% Lesetipp: http://texwelt.de/wissen/fragen/19163 
/pgf/number format/1000 sep=\thinspace,% Abschnitt 92.1 Changing display styles in pgfmanual.pdf 
/pgf/number format/min exponent for 1000 sep=4, 
draw group line/.style n args={5}{% Quelle: https://tex.stackexchange.com/questions/71350 
after end axis/.append code={ 
\setcounter{groupcount}{0} 
\pgfplotstableforeachcolumnelement{#1}\of\datatable\as\cell{% 
\def\temp{#2} 
\ifx\temp\cell 
\ifnum\thegroupcount=0 
\stepcounter{groupcount} 
\pgfplotstablegetelem{\pgfplotstablerow}{[index]0}\of\datatable 
\coordinate [yshift=#4] (startgroup) at (axis cs:\pgfplotsretval,0); 
\else 
\pgfplotstablegetelem{\pgfplotstablerow}{[index]0}\of\datatable 
\coordinate [yshift=#4] (endgroup) at (axis cs:\pgfplotsretval,0); 
\fi 
\else 
\ifnum\thegroupcount=1 
\setcounter{groupcount}{0} 
\draw [ 
shorten >=-#5, 
shorten <=-#5 
] (startgroup) -- node [anchor=north] {#3} (endgroup); 
\fi 
\fi 
} 
\ifnum\thegroupcount=1 
\setcounter{groupcount}{0} 
\draw [ 
shorten >=-#5, 
shorten <=-#5 
] (startgroup) -- node [anchor=north] {#3} (endgroup); 
\fi 
} 
} 
} 

\pgfplotstableread[col sep=comma]{ 
1, 84.40, 136.44, , 2013 
2, 102.15, 136.44, , 2013 
3, 124.75, 176.93, , 2014 
4, 141.23, 175.18, , 2014 
5, 172.36, 214.88, -5.70, 2014 
6, 197.14, 213.67, 4.90, 2014 
7, 184.26, 211.41, 10.21, 2015 
8, 206.19, 216.73, -5.77, 2015 
9, 178.19, 226.07, 45.43, 2015 
10, 192.00, 207.53, 74.78, 2015 
11, 175.27, 208.02, 34.56, 2016 
12, 205.23, 232.20, 23.46, 2016 
13, 225.17, 241.23, 39.99, 2016 
14, 279.86, 277.36, 15.12, 2016 
15, 273.97, 306.60, 4.73, 2017 
16, 309.35, 310.56, 17.66, 2017 
17, 310.64, 352.00, 3.20, 2017 
18, 346.56, 359.00, 13.24, 2017 
}\datatable 
\begin{document} 
\begin{tikzpicture} 
\begin{axis}[ 
ymin=1, 
ymax=400, 
ytick={0,50,...,400}, 
ylabel=Ranking, 
ymajorgrids, 
y dir=reverse, 
xtick=data,
xmin=0,% <- ergänzt
width=6.8in, 
legend pos=north west, 
xticklabel={ 
\pgfmathparse{mod(\tick+1,4)+1} 
Q\pgfmathprintnumber[int trunc]{\pgfmathresult} 
}, 
draw group line={[index]4}{2013}{2013}{-92.5ex}{7pt}, 
draw group line={[index]4}{2014}{2014}{-92.5ex}{7pt}, 
draw group line={[index]4}{2015}{2015}{-92.5ex}{7pt}, 
draw group line={[index]4}{2016}{2016}{-92.5ex}{7pt}, 
draw group line={[index]4}{2017}{2017}{-92.5ex}{7pt} 
] 
\addplot[smooth, mark=*, blue] table[x index=0,y index=1] \datatable; 
\addplot[smooth, mark=*, green] table[x index=0,y index=2] \datatable; 
\legend{Ranking Games, Top Grossing} 
\end{axis} 

\begin{axis}[ 
yticklabel pos=right,% yticklabel auf der rechten Seite 
ymin=-50, ymax=200,
xtick=\empty,% xticks nicht noch einmal zeichnen
xmin=0,% <- ergänzt
ylabel=Inflation, 
%ymajorgrids, 
width=6.8in, 
legend pos=north east,
] 
\addplot[smooth, mark=*, red] table[x index=0,y index=3] \datatable; % <- geändert
\legend{Inflation} 
\end{axis} 
\end{tikzpicture} 
\end{document}

Philipp_aus_Bp

Beitrag von Philipp_aus_Bp »

Danke! Hat wunderbar funktioniert :)

Antworten