Unterbrochene Y-Ache bei zwei Balkenplots

Tabellen und Grafiken erstellen und anordnen


Grigi
Forum-Newbie
Forum-Newbie
Beiträge: 3
Registriert: Fr 5. Mai 2017, 18:29
Wohnort: Clausthal

Unterbrochene Y-Ache bei zwei Balkenplots

Beitrag von Grigi »

Hallöchen an die LaTeX-Gemeinde,

ich bin gerade dabei zwei unterschiedliche Balkendiagrammsätze in einen Plot zu fassen. Soweit hat das auch schon (mit dem ein oder anderen Workaround) geklappt.
Jetzt soll aber eine Achse unterbrochen werden, um einen besonders hohen Wert abbilden zu können.
Hier mal eben meinen Code:
\begin{filecontents}{RTM_Ref_Pos.txt}
Name	x	Messung	StdMessung nix
{ }	1	109	18	0
{ }	2	109	nan	0
{ }	3	110	nan	0
{ }	4	110	nan	0
{ }	5	108	nan	0
\end{filecontents}
\begin{filecontents}{RTM_Ref_Time.txt}
Name		x	Rechenzeit
Messung		1	nan
Grob		2	1
Mittel		3	5
Fein		4	757
Variabel	5	16
\end{filecontents}


\documentclass[ngerman, listof=totoc, index=totoc,  bibliography=totocnumbered, twoside, ]{scrartcl} %draft
\usepackage{babel}
\usepackage{graphicx}
\usepackage{here}
\usepackage{pgfplots} 
\usetikzlibrary{patterns}
\pgfplotsset{ 
	compat=1.12, 
	/pgf/number format/use comma 
}
\begin{document}

\begin{figure}[H] %\label{fig.:FF-RTM-REF} 
   \centering
   \begin{tikzpicture} 
   \begin{axis}[ 
   ybar=10pt,  %configures bar shift 
   bar width = 10pt,
   ymax=240,
   ymin=0,
   enlarge x limits=0.25,
   ylabel={Fließfrontfortschritt [mm]},
   width=0.9\linewidth, %  regelt die BREITE
   height=10cm, % regelt die HÖHE
   ytick={0,20,...,240},
   xticklabels from table={RTM_Ref_Pos.txt}{Name},       
   xtick=data, 
   ticklabel style={/pgf/number format/.cd, use comma, 1000 sep = {}}, 
   ymajorgrids=true, 
   legend pos= north west,% Legende oben links in Abb. 
   legend cell align=right% Rechtsbündige Ausrichtung der Legende 
   ]
%-------------------------- linker Datensatz --------------------------------   
   \addplot 
   [draw = blue, 
   fill = blue!30!white, 
   error bars/.cd, 
   y dir=both, 
   y explicit, 
   error mark=triangle*, 
   error bar style={color=black}]   
   table[ 
   x=x, 
   y=Messung, 
   y error=StdMessung, 
   visualization depends on=\thisrow{StdMessung} \as \myshift, 
   ]       
   {RTM_Ref_Pos.txt}; 
   \addlegendentry{Fließfrontposition}; 
%-----------------------------Platzhalter ----------------------------------
   \addplot 
   [draw = red, 
   fill=white, 
   postaction={pattern=north east lines,pattern color=red!30!white}, 
   error bars/.cd, 
   y dir=both, 
   y explicit, 
   error mark=triangle*, 
   error bar style={color=black}]   
   table[ 
   x=x, 
   y=nix, 
   ]       
   {RTM_Ref_Pos.txt}; 
   \addlegendentry{Rechenzeit}; 
%----------------------------------------------------------------------------
   \end{axis} 
%------------------------------ Beginn rechte Balken--------------------------   
   \begin{axis}[ 
   ybar=15pt,  %configures bar shift 
   bar width = 10pt,
   yticklabel pos=right,
   ymax=24,
   ymin=0,
   ytick={0,2,...,24},
   enlarge x limits=0.25,
   ylabel={Rechenzeit [min]},
   xlabel={Variante / Meshgröße},
   width=0.9\linewidth, %  regelt die BREITE
   height=10cm, % regelt die HÖHE
   xticklabels from table={RTM_Ref_Time.txt}{Name},       
   xtick=data, 
   ticklabel style={/pgf/number format/.cd, use comma, 1000 sep = {}}, 
   ymajorgrids=false, 
   legend pos= north east,% Legende oben links in Abb. 
   legend cell align=right% Rechtsbündige Ausrichtung der Legende    
   ]
%-----------------------------Platzhalter ------------------------------
   \addplot 
   [draw = blue, 
   fill = blue!30!white, 
   error bars/.cd, 
   y dir=both, 
   y explicit, 
   error mark=triangle*, 
   error bar style={color=black}]   
   table[ 
   x=x,
   y=nix, 
   ]       
   {RTM_Ref_Pos.txt};    
%----------------------------------------------------------------------
   
%--------------------------------rechter Datensatz---------------------
   \addplot 
   [draw = red, 
   fill=white, 
   postaction={pattern=north east lines,pattern color=red!30!white}, 
   error bars/.cd, 
   y dir=both, 
   y explicit, 
   error mark=triangle*, 
   error bar style={color=black}]   
   table[ 
   x=x, 
   y=Rechenzeit, 
   ]       
   {RTM_Ref_Time.txt};          
   \end{axis}       
%---------------------------------------------------------------------------
   
   \end{tikzpicture}
   \caption{Fliessfrontfortschritt der VARI-Referenzproben}
   \label{fig.:FF-RTM-REF} 
\end{figure}
\end{document}
Das ganze sieht dann so aus, wie im Anhang. Der höchste Wert, also jener welcher aus dem Diagramm ragt, liegt übrigens bei über 750. Kennt ihr eine Möglichkeit, die rechte Achse so zu unterbrechen, dass sie beispielsweise bei 19min bricht und dann mit 700 -> 750 -> 800 endet?

Da ich mittlerweile nicht mehr weiter weiß, hoffe ich echt auf eure Hilfe. :(

Beste Grüße,
Grigi

PS: Ein nettes Gimmick wäre es, wenn die "Messung" in die Mitte der Sektion rutscht :)

Edit: Minimalbeispiel angepasst
Dateianhänge
Aktueller Stand
Aktueller Stand
Screenshot 2017-05-05 18.55.04.png (45.86 KiB) 1873 mal betrachtet

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

Beitrag von esdd »

Eine Möglichkeit:
\begin{filecontents}{RTM_Ref_Pos.txt} 
 x   Messung   StdMessung
1   109   18
2   109   nan
3   110   nan
4   110   nan
5   108   nan
\end{filecontents} 
\begin{filecontents}{RTM_Ref_Time.txt} 
 Name      x   Rechenzeit 
 Messung      1   nan 
 Grob      2   1 
 Mittel      3   5 
 Fein      4   757 
 Variabel   5   16 
\end{filecontents} 

\documentclass[ngerman, listof=totoc, index=totoc,  bibliography=totocnumbered, twoside, ]{scrartcl} %draft 
\usepackage{babel} 
\usepackage[utf8]{inputenc}
%\usepackage{here} 
\usepackage{pgfplots}% lädt auch graphicx
\usetikzlibrary{patterns} 
\pgfplotsset{ 
    compat=1.12, % die aktuelle Version ist 1.14
    /pgf/number format/use comma,
    messung/.style={
      draw = blue,
      fill = blue!30!white, 
      error bars/y dir=both, 
      error bars/y explicit, 
      error bars/error mark=triangle*, 
      error bars/error bar style={color=black}
    },
    rechenzeit/.style={
      draw = red, 
      fill=white, 
      postaction={pattern=north east lines,pattern color=red!30!white}, 
      error bars/y dir=both, 
      error bars/y explicit, 
      error bars/error mark=triangle*, 
      error bars/error bar style={color=black}
    }
} 
\begin{document} 

\begin{center}
  \begin{minipage}{\linewidth}
    \centering 
    \begin{tikzpicture}
      \pgfplotsset{
        scale only axis,
        width=0.75\linewidth,
        height=8cm,
        ybar=10pt,
        /pgf/bar width = 10pt,
        xticklabels from table={RTM_Ref_Time.txt}{Name},
        xtick=data,
        enlarge x limits=0.25, 
        legend pos= north west,
        legend cell align=right,
        anchor=current axis.north west
      }
      \begin{axis}[ 
        ymax=200, 
        ymin=0, 
        ylabel={Fließfrontfortschritt [mm]},
        ylabel style={shift={(2cm,1ex)}},
        ytick={0,20,...,180},
        ymajorgrids=true,
        axis x line=none,
        axis y line*=left
      ] 
  %-------------------------- linker Datensatz --------------------------------    
        \addplot[
            messung,
            /pgf/bar shift=0pt,
            forget plot
          ]
          table[ 
            x=x, 
            y=Messung, 
            y error=StdMessung, 
            skip coords between index={1}{100},
          ]{RTM_Ref_Pos.txt}
        ; 
        \addplot[messung]
          table[ 
            x=x, 
            y=Messung, 
            y error=StdMessung, 
            skip coords between index={0}{1},
          ]{RTM_Ref_Pos.txt}; 
  %-----------------------------Platzhalter ---------------------------------- 
      \addplot[rechenzeit]table[x=x,y expr=0,
          skip coords between index={0}{1}
        ]{RTM_Ref_Pos.txt}; 
  %---------------------------------------------------------------------------- 
      \end{axis} 
  %------------------------------ Beginn rechte Balken--------------------------    
      \begin{axis}[ 
          ymax=20, 
          ymin=0, 
          ytick={0,2,...,18},
          ylabel={Rechenzeit [min]},
          ylabel style={shift={(2cm,-1ex)}},
          xlabel={Variante / Meshgröße},
          axis x line*=left,
          axis y line*=right
        ] 
  %%-----------------------------Platzhalter ------------------------------ 
        \addplot[draw=none,fill=none]table[x=x,y expr=0]{RTM_Ref_Pos.txt};
  %%--------------------------------rechter Datensatz--------------------- 
        \addplot[rechenzeit]table[x=x,y=Rechenzeit]{RTM_Ref_Time.txt};
      \end{axis}
  %--------------------------------------------------------------------------- 
      \pgfplotsset{
        anchor=current axis.south west,
        height=4cm,
      }
      \begin{axis}[
        axis x line=none,
        axis y line*=left,
        ytick={7520,7540,...,7600},
        ymin=7500,ymax=7600,
        ymajorgrids=true,
      ]
        \addplot[messung] table[x=x,y expr=7500]{RTM_Ref_Pos.txt};
      \end{axis}
      \begin{axis}[
          axis x line*=top,
          axis y line*=right,
          ytick={752,754,...,760},
          ymin=750,ymax=760,
          xticklabel=\empty
        ]
        \addplot[messung]table[x=x,y expr=750]{RTM_Ref_Pos.txt};
        \addlegendentry{Fließfrontposition};
        \addplot[rechenzeit]table[x=x,y=Rechenzeit]{RTM_Ref_Time.txt};
        \addlegendentry{Rechenzeit};
      \end{axis}
      \fill[white]
        ([shift={(-.2,.2)}]current axis.south west)
        rectangle
        ([shift={(.2,-.2)}]current axis.south east)
      ;
    \end{tikzpicture} 
    \captionof{figure}{Fliessfrontfortschritt der VARI-Referenzproben} 
    \label{fig.:FF-RTM-REF} 
  \end{minipage}
\end{center}
\end{document} 
Ergebnis:


Bild
Dateianhänge
gl_splitbarplot.png
gl_splitbarplot.png (37.13 KiB) 1849 mal betrachtet

Grigi
Forum-Newbie
Forum-Newbie
Beiträge: 3
Registriert: Fr 5. Mai 2017, 18:29
Wohnort: Clausthal

Beitrag von Grigi »

Wow, dankeschön esdd! Das sieht schon gut aus und kommt so in den Bericht :D

Eine kleine Frage habe ich noch: Kann man den Bruch in den Achsen (und evtl. auch am Balken) als solchen kennzeichnen? Also beispielsweise mit zwei diagonal verlaufenden Strichen.

Beste Grüße,
Grigi

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

Beitrag von esdd »

Grigi hat geschrieben: Eine kleine Frage habe ich noch: Kann man den Bruch in den Achsen (und evtl. auch am Balken) als solchen kennzeichnen? Also beispielsweise mit zwei diagonal verlaufenden Strichen.
Du kannst nach der letzten axis axis Umgebung Striche Deiner Wahl einzeichnen. Hier mal waagrechte:
...
       \end{axis}
       % Trennung von oberem und unterem Diagrammteil
       \fill[white] 
         ([shift={(-.2,.05)}]current axis.south west)coordinate(h1)
         rectangle 
         ([shift={(.2,-.05)}]current axis.south east)coordinate(h2)
       ;
       % Trennstriche an Achsen
       \draw
         (h1)--+(.4,0)
         (h1|-h2)--+(.4,0)
         (h2)--+(-.4,0)
         (h1-|h2)--+(-.4,0)
       ;
     \end{tikzpicture} 
     \captionof{figure}{Fliessfrontfortschritt der VARI-Referenzproben} 
     \label{fig.:FF-RTM-REF} 
   \end{minipage} 
\end{center} 
\end{document}
Bild

PS: Bitte sieh Dir an, was der Status "Rückfrage" bedeutet.
Dateianhänge
gl_barplotsplit.png
gl_barplotsplit.png (16.77 KiB) 1843 mal betrachtet

Grigi
Forum-Newbie
Forum-Newbie
Beiträge: 3
Registriert: Fr 5. Mai 2017, 18:29
Wohnort: Clausthal

Beitrag von Grigi »

Super! Dankeschön noch mal für die schnelle Hilfe und ein schönes Restwochenende. :wink:

Antworten