alt text

Wieso geht eigentlich

Open in Online-Editor
foreach \k in {1,...,5}{
            \addplot+[mark=none, blue] {x^(\k+2) - x^(\k+1) -1} node[above, ]{\k};
}

nicht?

Wenn man irgendeinText statt \k verwendet, geht es. :(

Falsche Eingabe oder ein Bug?

BTW: Hat jemand eine Idee für einen gescheiten Maßstab, so dass die Kurven 'kurviger' werden?

Open in Online-Editor
\documentclass[border=5pt, varwidth]{standalone}
%\documentclass[ngerman]{scrartcl}
\usepackage[ngerman]{babel}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage{lmodern}
\usepackage{pgfplots}

\begin{document}
\begin{tikzpicture}
\begin{axis}
[
%title =,
xlabel = $x$,
ylabel = $y$,
samples = 200,
domain = -2:2,
%ymin= -1,
ymax = 10,
ymin=-10,
xmax=2,
axis lines = middle, 
%y=0.2cm,
%x=1cm
]
\foreach \k in {1,...,5}{
        \addplot+[mark=none, blue] {x^(\k+2) - x^(\k+1) -1} ;
        % node[above, ]{\k};
}
\end{axis}
\end{tikzpicture}
\end{document}

gefragt 27 Jun, 15:07

cis's gravatar image

cis
5.4k860168
Akzeptiert: 68%

bearbeitet 27 Jun, 15:14

Vier der fünf \usepackage sind völlig überflüssig für das Beispiel.

(27 Jun, 18:17) Henri

Einen Möglichkeit, wie Du die Parameter mit an die Graphen schreiben kannst, findest Du ganz unten. Wie @Henri würde ich das aber nicht empfehlen und statt dessen ebenfalls \pgfplotsinvokeforeach und eine Legende verwenden.

Dafür kannst Du eine cycle list mit unterschiedlichen Linienstilen verwenden, zum Beispiel linestyles mit drei verschiedenen Linienstilen oder linestyles* mit fünf verschiedenen Linienstilen.

alt text

Code:

Open in Online-Editor
\documentclass[border=5pt]{standalone}
\usepackage{pgfplots}
\pgfplotsset{compat=newest}% compat setzen
\begin{document}
\begin{tikzpicture}
  \begin{axis}[
    xlabel=$x$,ylabel=$y$,
    samples=200,domain=-2:2,
    ymin=-10,ymax=10,
    axis lines=middle,
    legend pos=outer north east,
    cycle list name=linestyles*
    ]
    \pgfplotsinvokeforeach{1,...,5}{
      \addplot{x^(#1+2) - x^(#1+1) -1};
      \addlegendentry{$k = #1$};
    }
  \end{axis}
\end{tikzpicture}
\end{document}

Wenn Du Graphen für noch mehr Parameter zeichnen möchtest, kannst Du cycle multi list verwenden. Beispielsweise

Open in Online-Editor
cycle multi list={
  black,gray!80\nextlist
  linestyles*
}

Hier werden die ersten fünf Graphen schwarz mit verschiedenen Linienstilen gezeichnet und die letzten beiden dann grau.

alt text

Code:

Open in Online-Editor
\documentclass[border=5pt]{standalone}
\usepackage{pgfplots}
\pgfplotsset{compat=newest}% compat setzen
\begin{document}
\begin{tikzpicture}
  \begin{axis}[
    xlabel=$x$,ylabel=$y$,
    samples=200,domain=-2:2,
    ymin=-10,ymax=10,
    axis lines=middle,
    legend pos=outer north east,
    cycle multi list={
      black,gray!80\nextlist
      linestyles*
    }
    ]
    \pgfplotsinvokeforeach{1,...,7}{
      \addplot{x^(#1+2) - x^(#1+1) -1};
      \addlegendentry{$k = #1$};
    }
  \end{axis}
\end{tikzpicture}
\end{document}

In dem konkreten Fall könntest Du schon auch \foreach verwenden, musst aber dafür sorgen, dass die Schleifenvariable sofort expandiert wird, da die \addplot Befehle erst ausgewertet werden, wenn die Schleifenvariablen gar nicht mehr gelten. Aber da sind noch eine ganze Reihe anderer Probleme:

  • Mit domain=-2:2 und ymax=10 liegen die "Enden" der Plots teilweise außerhalb des Diagramms und die Nodes werden damit teilweise oder ganz abgeschnitten. Das lässt sich verhindern mit clip=false, allerdings braucht man dann unbedingt auch eine Begrenzung der y-Werte, also restrict y to domain=-10:10. Da die Steigung am "Ende" teils sehr groß ist, liegt der letzte Punkt mitunter unterhalb von y=10, wie unten für k=5 zu sehen ist.
  • Wenn die Graphen am "Ende" nur einen geringen horizontalen Abstand haben, berühren oder überlappen sich die angegebenen Parameter.
  • In Deinem Fall kann man die Nodes überall oberhalb der "Enden" setzen. Wenn ein Teil der Funktionen am "Ende" fällt statt steigt, müsste dieser Teil Nodes unterhalb bekommen.
  • Dadurch, dass die Graphen alle gleich gezeichnet werden, lässt sich für x<0 nicht erkennen, welche Kurve zu welchem Parameter gehört.

alt text

Code:

Open in Online-Editor
\documentclass[border=5pt]{standalone}
\usepackage{pgfplots}
\pgfplotsset{compat=newest}% compat setzen
\begin{document}
\begin{tikzpicture}
\begin{axis}
[
xlabel = $x$,
ylabel = $y$,
samples = 200,
domain = -2:2,
ymax = 10,
ymin=-10,
xmax=2,
axis lines = middle, 
restrict y to domain=-10:10,% <-
clip=false% <-
]
\foreach \k in {1,...,7}{
  \edef\temp{%
    \noexpand\addplot[] {x^(\k+2) - x^(\k+1) -1}
     node[above]{\k};
  }
  \temp
}
\end{axis}
\end{tikzpicture}
\end{document}
Permanenter link

beantwortet 28 Jun, 04:27

esdd's gravatar image

esdd
14.2k53251

Das Problem ist, dass \foreach grouping ist, \addplot aber nicht gruppiert sein darf (Warum steht irgendwo im Manual, kann mich aber gerade nicht erinnern). Es gibt zum einen die Alternative \pgfplotsforeachungrouped was die gleiche Syntax wie \foreach hat und \pgfplotsinvokeforeach bei dem man keine Iterationsvariable hat, sondern #1 im Schleifenkörper verwendet. Der Vorteil daran ist, dass es keinerlei Expansion bedarf um den Iteratiosschritt zu bekommen. Daher verwende ich das fast immer.

Statt den Wert von k an die Kurven zu schreiben würde ich sie lieber unterschiedlich einfärben (ich habe einen Gradient von rot nach blau gewählt) und eine Legende machen. Das erspart viele Kopfschmerzen, die eine unterschiedliche Positionierung für jedes verschiedene k mit sich gebracht hätte. Damit das ganze schwarz-weiß-agnostisch bleibt kann man mit cycle list name=linestyles* das Strichmuster der Linien alternieren. Zusätzlich könnte man die Farben im Gradienten auch über eine Cycle List definieren und welche mit hohem Kontrast nehmen; colorbrewer hilft dabei.

Hat jemand eine Idee für einen gescheiten Maßstab, so dass die Kurven 'kurviger' werden?

Keine Ahnung, was hier gemeint ist. Vielleicht sowas? Damit die Kurven glatter werden dreht man einfach samples hoch, aber samples=200 ist schon ziemlich viel. Zusätzlich kann man die geplotteten Punkte statt mit geraden Linien mit Splines verbinden indem man die Option smooth mitgibt.

Open in Online-Editor
\documentclass{article}
\usepackage{pgfplots}
\begin{document}
\begin{tikzpicture}
  \begin{axis}[
    xlabel=$x$,ylabel=$y$,
    samples=200,domain=-2:2,
    restrict y to domain=-10:10,
    axis lines=middle,
    legend pos=outer north east,
    cycle list name=linestyles*
    ]
    \pgfplotsinvokeforeach{1,...,5}{
      \addplot+[mark=none,blue!\the\numexpr(#1-1)*25\relax!red] {x^(#1+2) - x^(#1+1) -1};
      \addlegendentry{$k = #1$};
    }
  \end{axis}
\end{tikzpicture}
\end{document}

alt text

Permanenter link

beantwortet 27 Jun, 18:05

Henri's gravatar image

Henri
10.0k31730

bearbeitet 28 Jun, 17:33

"Statt den Wert von k an die Kurven zu schreiben würde ich sie lieber unterschiedlich einfärben..." - das möchte ich gerade nicht. Bendenke: Etwa bei einem SW-Ausdruck geht die Theorie flöten... ;)

(27 Jun, 18:26) cis
Deine Antwort auf die Frage (nicht auf andere Antworten)
Knebel-Vorschau

Folge dieser Frage

Per E-Mail:

Wenn Du Dich anmeldest, kannst Du Updates hier abonnieren

Per RSS:

Antworten

Antworten und Kommentare

Aktuelle Buch-Infos

LaTeX Cookbook

LaTeX Beginners Guide

Limitierter Rabatt ebook
50% Coupon code tDRet6Y

Markdown-Grundlagen

  • *kursiv* oder _kursiv_
  • **Fett** oder __Fett__
  • Link:[Text](http://url.com/ "Titel")
  • Bild?![alt Text](/path/img.jpg "Titel")
  • nummerierte Liste: 1. Foo 2. Bar
  • zum Hinzufügen ein Zeilenumbruchs füge einfach zwei Leerzeichen an die Stelle ein, an der die neue Zeile sein soll.
  • grundlegende HTML-Tags werden ebenfalls unterstützt

Zugeordnete Themen:

×492
×160

Frage gestellt: 27 Jun, 15:07

Frage wurde angeschaut: 548 Mal

Zuletzt aktualisiert: 28 Jun, 17:33