Anzeige:
Ergebnis 1 bis 11 von 11

Thema: [pgfplots] Pfeile der Diagrammachsen vergrößern und von Werten absetzen

  1. #1
    Registrierter Benutzer
    Registriert seit
    08.10.2012
    Beiträge
    5

    Question [pgfplots] Pfeile der Diagrammachsen vergrößern und von Werten absetzen

    Hallo zusammen

    Zuerst möchte ich kurz Hallo sagen. Bin neu im Forum und sehr froh, dass ich solch ein Forum gefunden habe. Ich bin zwar kein blutiger Latex-Anfänger mehr, aber viel Erfahrung habe ich noch nicht. Bisher setzte ich Latex bei zwei Berichten ein und erstelle zur Zeit ein Satz an Vorlagen. Ich plane Latex für regelmäßig wiederkehrende Berichte, ein Pflichtenheft und eine Dokumentation einzusetzen.

    Jetzt zu meinem aktuellen Problem:

    Ich möchte mit pgfplots Messwertdiagramme zeichnen. Ich möchte eine möglichst gute Lösung finden, die ich später immer wieder bei ähnlichen Diagrammen einsetzen kann und nur die Datei mit den Daten austauschen muss.

    Das habe ich:

    Code:
    \documentclass[a4paper,12pt]{scrartcl}
    \usepackage{pgfplots}
    
    \usepackage{filecontents}
    \begin{filecontents}{diagramm.dat}
    Spannung    Strom
    1           0.1
    2           0.14
    3           0.2
    4           0.5
    5           0.4
    6           0.6
    7           0.3
    8           1
    \end{filecontents}
    
    \begin{document}
    
    \pgfkeys{/pgf/number format/.cd ,use comma}
    \pgfplotsset{every axis label/.append style={font=\scriptsize}, 
    every tick label/.append style={font=\scriptsize}, xtick=data}
    
    \begin{tikzpicture}
        \begin{axis}[
            title={Der Titel des Diagramms},
            width=0.9\textwidth,
            height=7cm,
            xlabel=Spannung {[}V{]},ylabel=Strom {[}I{]},
            axis x line=bottom,
            axis y line=left,
            ymin = 0,
        % enlarge x limits=0.1
            ]
            
            \addplot+[smooth] table {diagramm.dat};
        \end{axis}
    \end{tikzpicture}
    \end{document}
    So weit ist alles ganz gut. Aber die Pfeile der Diagrammachsen gefallen mir nicht. Sie sind mir zu zu klein (die kann man ja kaum erkennen) und vor allem sitzen sie einfach genau über den letzen Wert.
    Bei der x-Achse kann man sich ja noch dadurch helfen, in dem man das auskommentierte enlarge x limits=0.1 einsetzt. Für die y-Achse funktioniert es aber oft nicht.

    Das sauberste wäre es, wenn man die Pfeile einfach ein bisschen von den Werten nach oben bzw, links absetzen könnte oder einen (Mindest-)Abstand zwischen letzen angezeichneten Wert und Pfeil definieren kann.

    Vielleicht gibt es auch eine einfache Möglichkeit die Labels der Achsen immer in die Nähe der Pfeile zu bekommen?

    Also meine drei Fragen:
    • Wie bekomme ich die Pfeile weg von den Werten?
    • Wie mach ich die Pfeile etwas größer?
    • Wie bekomme ich die Achsenbeschriftung an die Pfeile?


    Schönen Gruß

  2. #2
    Registrierter Benutzer Avatar von bobmalaria
    Registriert seit
    28.11.2006
    Ort
    Düsseldorf
    Beiträge
    4.174
    hi,

    eigentlich sollte es reichen 'enlargelimits' als option zu setzen, oder?
    das mit den pfeilen wurde hier mal besprochen
    http://tex.stackexchange.com/questio...-pgfplots-axes

    uebrigens werden einheiten nicht mit []-klammern gesetzt. soviel ich weiss darf man die spannung als [U] ausdruecken, aber die einheit der spannung ist einfach volt, ohne klammern.
    Geändert von bobmalaria (09-10-2012 um 09:53 Uhr)
    Mein Ball ist umgefallen

  3. #3
    Registrierter Benutzer
    Registriert seit
    21.08.2009
    Beiträge
    496
    Hallo,

    du kannst auch eine andere Pfeilform aus der tikzlibrary arrows versuchen. enlargelimits=upper verlängert dir die y-Achse nach oben und die x-Achse nach rechts. Hier ist auch noch ein Vorschlag, wie die Labels in der Nähe der Pfeile positioniert werden können:
    Code:
    \documentclass{scrartcl}
    \usepackage{pgfplots}
    \pgfplotsset{compat=1.6}
    \usetikzlibrary{arrows}
    
    \usepackage{filecontents}
    \begin{filecontents}{diagramm.dat}
    Spannung    Strom
    1           0.1
    2           0.14
    3           0.2
    4           0.5
    5           0.4
    6           0.6
    7           0.3
    8           1
    \end{filecontents}
    
    \begin{document}
    
    \pgfkeys{/pgf/number format/.cd ,use comma}
    \pgfplotsset{%
      every axis label/.append style={font=\scriptsize}, 
      every tick label/.append style={font=\scriptsize},
      xtick=data}
    
    \begin{tikzpicture}
        \begin{axis}[
            title={Der Titel des Diagramms},
            width=0.8\textwidth,
            height=7cm,
            xlabel=Spannung {[}V{]},ylabel=Strom {[}I{]},
            axis x line=bottom,
            x axis line style={-triangle 45},
            x label style={at={(1,0)}, below right},
            axis y line=left,
            y axis line style={-triangle 45},
            y label style={rotate=-90,at={(0,1)}, above left},
            enlargelimits=upper,
            ymin = 0,
            ]
            \addplot+[smooth] table {diagramm.dat};
        \end{axis}
    \end{tikzpicture}
    \end{document}
    Gruß
    Elke

  4. #4
    Registrierter Benutzer
    Registriert seit
    08.10.2012
    Beiträge
    5
    Hallo

    Vielen Dank für die tollen Antworten. Die haben mich deutlich weitergebracht:

    Das von bobmalaria verlinkte Möglichkeit, die Pfeile größer zu machen klappt genauso gut wie die von esdd. Ich werde esdds Vorschlag nehmen. So gehts ziemlich einfach und sauber. Danke!

    Beim Problem mit den Labels ist esdds Vorschlag auch sehr ziehlführend. Allerdings habe ich es etwas verändert.

    Bei den Abstand zwischen Pfeil und höchsten gezeichneten Wert bin ich noch nicht entscheidend weitergekommen. (Ich muss zugeben, dass ich davor bei enlarge-Optionen nicht alle Argumente durchprobiert habe.) Es kommt wohl immer darauf an was der höchste Wert des Diagramms ist. In meinen Beispiel sieht man glaube ich gut, was das Problem ist:

    Code:
    \documentclass[a4paper,12pt]{scrartcl}
    \usepackage{pgfplots}
    \usetikzlibrary{arrows}
    
    \usepackage{filecontents}
    \begin{filecontents}{diagramm1.dat}
    Spannung    Strom
    1           0.1
    2           0.4
    3           0.6
    4           0.3
    5           1.1
    \end{filecontents}
    \begin{filecontents}{diagramm2.dat}
    Spannung    Strom
    1           0.1
    2           0.4
    3           0.6
    4           0.3
    5           1.0
    \end{filecontents}
    
    \begin{document}
    
    \pgfkeys{/pgf/number format/.cd ,use comma}
    \pgfplotsset{every axis label/.append style={font=\scriptsize}, 
    every tick label/.append style={font=\scriptsize}, xtick=data}
    
    \begin{tikzpicture}
        \begin{axis}[
            xlabel = {[}U{]} in V, ylabel={[}I{]} in mA,
            width = 0.5\textwidth,
            height = 7cm,
            axis x line=bottom,
            x axis line style={-triangle 45},
            x label style={at={(1,0)}, below},
            axis y line=left,
            y axis line style={-triangle 45},
            y label style={at={(0,1)}, above left},
            ymin = 0,
    %         enlargelimits = upper,
            enlarge x limits = upper
            ]
            \addplot+[smooth] table {diagramm1.dat};
        \end{axis}
    \end{tikzpicture}
    
    \begin{tikzpicture}
        \begin{axis}[
            xlabel = {[}U{]} in V, ylabel={[}I{]} in mA,
            width = 0.5\textwidth,
            height = 7cm,
            axis x line=bottom,
            x axis line style={-triangle 45},
            x label style={at={(1,0)}, below},
            axis y line=left,
            y axis line style={-triangle 45},
            y label style={at={(0,1)}, above left},
            ymin = 0,
    %         enlargelimits = upper,
            enlarge x limits = upper
            ]
            \addplot+[smooth] table {diagramm2.dat};
        \end{axis}
    \end{tikzpicture}
    \end{document}
    Im unteren Diagramm müsste ich jetzt statt der Zeile enlargelimits = upper, die Zeile enlarge x limits = upper auskommentieren. Und ich glaube, wenn es andere Werte gibt und die y-Achse dementsprechend eine andere Einteilung hat, muss ich wieder rumprobieren.
    Also den Anspruch, einer allgemeingültige Lösung, näher ich mich damit nicht.

    PS: @bobmalaria: Das mit den Einheiten stimmt. War ja auch eher ein Quick&Dirty-Beispiel

  5. #5
    Registrierter Benutzer
    Registriert seit
    21.08.2009
    Beiträge
    496
    Hallo,

    in der Präambel habe ich noch \pgfplotsset{compat=1.6} stehen, damit die Möglichkeiten der aktuellen Version genutzt werden. Ansonsten sind hier noch zwei Vorschläge, wie du das Labelproblem lösen kannst. Aber du wirst das sicher für jedes Diagramm neu entscheiden und je nach Bedarf unterschiedliche Werte für die Optionen nehmen müssen. Die Verlängerung der Achsen kann man zum Beispiel relativ oder absolut einstellen.
    Code:
    \documentclass[a4paper,12pt]{scrartcl}
    \usepackage{pgfplots}
    \pgfplotsset{compat=1.6}
    \usetikzlibrary{arrows}
    
    \usepackage{filecontents}
    \begin{filecontents}{diagramm1.dat}
    Spannung    Strom
    1           0.1
    2           0.4
    3           0.6
    4           0.3
    5           1.1
    \end{filecontents}
    \begin{filecontents}{diagramm2.dat}
    Spannung    Strom
    1           0.1
    2           0.4
    3           0.6
    4           0.3
    5           1.0
    \end{filecontents}
    
    \begin{document}
    
    \pgfkeys{/pgf/number format/.cd ,use comma}
    \pgfplotsset{every axis label/.append style={font=\scriptsize}, 
    every tick label/.append style={font=\scriptsize}, xtick=data}
    
    \begin{tikzpicture}
        \begin{axis}[
            xlabel = {[}U{]} in V, ylabel={[}I{]} in mA,
            width = 0.5\textwidth,
            height = 7cm,
            axis x line=bottom,
            x axis line style={-triangle 45},
            x label style={at={(1,0)}, below},
            enlarge x limits = {abs value=1,upper},
            axis y line=left,
            y axis line style={-triangle 45},
            y label style={at={(0,1)},left,anchor=south},
            ymin = 0,
            ytick={0,0.2,0.4,...,1},
            enlarge y limits = {abs value=0.15,upper}
            ]
            \addplot+[smooth] table {diagramm1.dat};
        \end{axis}
    \end{tikzpicture}
    
    \begin{tikzpicture}
        \begin{axis}[
            xlabel = {[}U{]} in V, ylabel={[}I{]} in mA,
            width = 0.5\textwidth,
            height = 7cm,
            axis x line=bottom,
            x axis line style={-triangle 45},
            x label style={at={(1,0)}, below},
            enlarge x limits = {abs value=1,upper},
            axis y line=left,
            y axis line style={-triangle 45},
            y label style={at={(0,1)},left,anchor=south},
            ymin = 0,
            ytick=data,
            enlarge y limits = {abs value=0.2,upper}
            ]
            \addplot+[smooth] table {diagramm2.dat};
        \end{axis}
    \end{tikzpicture}
    \end{document}
    Gruß
    Elke

  6. #6
    Registrierter Benutzer
    Registriert seit
    08.10.2012
    Beiträge
    5
    Hallo

    \pgfplotsset{compat=1.6} bringt bei mir:

    Code:
    Package pgfkeys Error: Choice '1.6' unknown in key '/pgfplots/compat/labels' \pgfplotsset{compat=1.6}
    ein \pgfplotsset{compat=1.5} bewirkt, dass die Labels direkt an die Achse rücken und die Werte überdecken. Meine aber, dass man das mit einer Option wieder gerade biegen könnte. An den Position der Pfeile ändert es nichts.

    Benutze Ubuntu. Also vermutlich das TexLive von 2009

    Den Rest möchte ich mir nach dem Abendessen ansehen. Danke schon mal

  7. #7
    Registrierter Benutzer
    Registriert seit
    21.08.2009
    Beiträge
    496
    Hallo,

    dann mit compat=1.5 und nach von den Achsen weg geschobenen Labeln. Links immer mit einer absoluten Verlängerung der Achsen und rechts mit einer relativen. Wird nur upper angegeben, dann wird die Achse um 0.1=10% verlängert.
    Code:
    \documentclass[a4paper,12pt]{scrartcl}
    \usepackage{pgfplots}
    \pgfplotsset{compat=1.5}
    \usetikzlibrary{arrows}
    
    \usepackage{filecontents}
    \begin{filecontents}{diagramm1.dat}
    Spannung    Strom
    1           0.1
    2           0.4
    3           0.6
    4           0.3
    5           1.1
    \end{filecontents}
    \begin{filecontents}{diagramm2.dat}
    Spannung    Strom
    1           0.1
    2           0.4
    3           0.6
    4           0.3
    5           1.0
    \end{filecontents}
    
    \begin{document}
    
    \pgfkeys{/pgf/number format/.cd ,use comma}
    \pgfplotsset{every axis label/.append style={font=\scriptsize}, 
    every tick label/.append style={font=\scriptsize}, xtick=data}
    
    \begin{tikzpicture}
        \begin{axis}[
            xlabel = {[}U{]} in V, ylabel={[}I{]} in mA,
            width = 0.5\textwidth,
            height = 7cm,
            axis x line=bottom,
            x axis line style={-triangle 45},
            x label style={at={(1,0)},below,yshift=-20pt,anchor=north east,inner sep=0pt},
            enlarge x limits = {abs value=0.5,upper},
            axis y line=left,
            y axis line style={-triangle 45},
            y label style={at={(0,1)},yshift=20pt,left,anchor=south east,inner sep=0pt},
            ymin = 0,
            enlarge y limits = {abs value=0.09,upper}
            ]
            \addplot+[smooth] table {diagramm1.dat};
        \end{axis}
    \end{tikzpicture}
    \hfill
    \begin{tikzpicture}
        \begin{axis}[
            xlabel = {[}U{]} in V, ylabel={[}I{]} in mA,
            width = 0.5\textwidth,
            height = 7cm,
            axis x line=bottom,
            x axis line style={-triangle 45},
            x label style={at={(1,0)},below,yshift=-20pt,anchor=north east,inner sep=0pt},
            enlarge x limits = {upper},
            axis y line=left,
            y axis line style={-triangle 45},
            y label style={at={(0,1)},yshift=20pt,left,anchor=south east,inner sep=0pt},
            ymin = 0,
            enlarge y limits = {value=0.09,upper}
            ]
            \addplot+[smooth] table {diagramm1.dat};
        \end{axis}
    \end{tikzpicture}
    
    \begin{tikzpicture}
        \begin{axis}[
            xlabel = {[}U{]} in V, ylabel={[}I{]} in mA,
            width = 0.5\textwidth,
            height = 7cm,
            axis x line=bottom,
            x axis line style={-triangle 45},
            x label style={at={(1,0)},below,yshift=-20pt,anchor=north east,inner sep=0pt},
            enlarge x limits = {abs value=0.5,upper},
            axis y line=left,
            y axis line style={-triangle 45},
            y label style={at={(0,1)},yshift=20pt,left,anchor=south east,inner sep=0pt},
            ymin = 0,
            enlarge y limits = {abs value=0.1,upper}
            ]
            \addplot+[smooth] table {diagramm2.dat};
        \end{axis}
    \end{tikzpicture}
    \hfill
    \begin{tikzpicture}
        \begin{axis}[
            xlabel = {[}U{]} in V, ylabel={[}I{]} in mA,
            width = 0.5\textwidth,
            height = 7cm,
            axis x line=bottom,
            x axis line style={-triangle 45},
            x label style={at={(1,0)},below,yshift=-20pt,anchor=north east,inner sep=0pt},
            enlarge x limits = {upper},
            axis y line=left,
            y axis line style={-triangle 45},
            y label style={at={(0,1)},yshift=20pt,left,anchor=south east,inner sep=0pt},
            ymin = 0,
            enlarge y limits = {upper}
            ]
            \addplot+[smooth] table {diagramm2.dat};
        \end{axis}
    \end{tikzpicture}
    \end{document}
    Gruß
    Elke

  8. #8
    Registrierter Benutzer
    Registriert seit
    08.10.2012
    Beiträge
    5
    Elke du bist genial ;-) Es funktioniert nicht nur (bis her), ich blick jetzt auch halbwegs dahinter.

    Eine Frage vielleicht noch: Warum bewirkt ein {abs value=0.09,upper} hier das gleiche wie ein {value=0.09,upper}? Oder anders gefragt: Auf was bezieht sich der relative bzw. absolute Wert?

    Gibt es vielleicht noch eine Möglichkeit einer Achse zu sagen, dass sie auf für "ausgelassene" Werte, die also nicht angeschrieben sind, einen Strich zeichnen soll? Also hier für 0,1 0,3 0,5 usw auf der y-Achse. Ohne die einzelnen Tick natürlich einzeln einzutragen. Wenn das aber nicht so einfach geht, ist es auch nicht so wichtig.

    Gruß

  9. #9
    Registrierter Benutzer
    Registriert seit
    21.08.2009
    Beiträge
    496
    Die Option, mit der du zwischen den beschrifteten Ticks an der y-Achse je einen weiteren einfügen lassen kannst, heißt "minor y tick num=1". Die zusätzlichen Striche machen es natürlich schwieriger die Achse so zu verlängern, dass kein Tick in unmittelbarer Nähe des Pfeiles ist ...

    Das "abs value=0.09,upper" verlängert die eigentlich bis 1,1 gehende y-Achse um den absoluten Wert 0,09 auf 1,19. Das "value=0.09,upper" verlängert die y-Achse um 9% der sonst bis 1,1 gehenden Achse, also auf 1,199. Den Unterschied sieht man kaum, aber beides verhindert, dass bei 1,2 ein weiterer Tick gezeichnet wird.

    Gruß
    Elke

  10. #10
    Registrierter Benutzer
    Registriert seit
    08.10.2012
    Beiträge
    5
    Ah, jetzt wird das logisch. Ich hatte aus irgend einen Grund gedacht, die Ticks werden nur im Wertebereich der Messwerte gezeichnet und wenn man die Achse verlängert, verlängert sich eben nur der Strich. Mit deiner Erklärung ist aber die Sache klar: Ich muss nur darauf achten, dass die Achse (höchstens) bis kurz vor dem nächsten Tick verlängert wird. Eigentlich ganz einfach

    Die zusätzlichen Ticks funktionieren auch.

    Danke nochmal für deine großartige Hilfe. Jetzt versteh ich das Paket viel besser

  11. #11
    Registrierter Benutzer
    Registriert seit
    21.08.2009
    Beiträge
    496
    Hallo,

    Zitat Zitat von Silmaril Beitrag anzeigen
    Ich hatte aus irgend einen Grund gedacht, die Ticks werden nur im Wertebereich der Messwerte gezeichnet und wenn man die Achse verlängert, verlängert sich eben nur der Strich.
    Für deine xticks stimmt das wegen "\pgfplotsset{...,xtick=data}". Die Option sorgt dafür, dass die xticks genau an den Stellen gezeichnet werden, an denen du Werte für den Plot vorgibst. Ich hab die Verlängerung der x-Achse hier mal übertrieben und im zweiten Beispiel mal einen x-Wert etwas verändert:
    Code:
    \documentclass[a4paper,12pt]{scrartcl}
    \usepackage{pgfplots}
    \pgfplotsset{compat=1.5}
    \usetikzlibrary{arrows}
    
    \usepackage{filecontents}
    \begin{filecontents}{diagramm1.dat}
    Spannung    Strom
    1           0.1
    2           0.4
    3           0.6
    4           0.3
    5           1.1
    \end{filecontents}
    
    \begin{document}
    
    \pgfkeys{/pgf/number format/.cd ,use comma}
    \pgfplotsset{every axis label/.append style={font=\scriptsize}, 
    every tick label/.append style={font=\scriptsize}, xtick=data}
    
    \begin{tikzpicture}
        \begin{axis}[
            xlabel = {[}U{]} in V, ylabel={[}I{]} in mA,
            width = 0.5\textwidth,
            height = 7cm,
            axis x line=bottom,
            x axis line style={-triangle 45},
            x label style={at={(1,0)},below,yshift=-20pt,anchor=north east,inner sep=0pt},
            enlarge x limits = {abs value=3,upper},
            axis y line=left,
            y axis line style={-triangle 45},
            y label style={at={(0,1)},yshift=20pt,left,anchor=south east,inner sep=0pt},
            ymin = 0,
            minor y tick num=1,
            enlarge y limits = {abs value=0.09,upper}
            ]
            \addplot+[smooth] table {diagramm1.dat};
        \end{axis}
    \end{tikzpicture}
    \hfill
    \begin{tikzpicture}
        \begin{axis}[
            xlabel = {[}U{]} in V, ylabel={[}I{]} in mA,
            width = 0.5\textwidth,
            height = 7cm,
            axis x line=bottom,
            x axis line style={-triangle 45},
            x label style={at={(1,0)},below,yshift=-20pt,anchor=north east,inner sep=0pt},
            enlarge x limits = {abs value=3,upper},
            axis y line=left,
            y axis line style={-triangle 45},
            y label style={at={(0,1)},yshift=20pt,left,anchor=south east,inner sep=0pt},
            ymin = 0,
            minor y tick num=1,
            enlarge y limits = {abs value=0.09,upper}
            ]
            \addplot+[smooth] table {diagramm2.dat};
        \end{axis}
    \end{tikzpicture}
    \end{document}
    Gruß
    Elke

Stichworte

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •