Verbesserung des TikZ-Koordinatensystems/Spannungsverlaufs

Verbesserung des TikZ-Koordinatensystems/Spannungsverlaufs

Ich bin relativ neu bei TikZ (das ist bisher mein zweites TikZ-Bild :))

Es sieht ziemlich genau so aus, wie ich es mir vorstelle, aber ich denke, der Code könnte optimiert werden. Ich muss ziemlich viele ähnliche Spannungskurven zeichnen, daher wäre es nett, wenn Sie mir bei der Optimierung helfen könnten!

Bitte beachten: Die Differenz zwischen den Zeitangaben und der optischen Darstellung der Kurve ist beabsichtigt!

Danke!

\documentclass{article}
    \usepackage{tikz}
    \usepackage{verbatim}
    \usepackage[active,tightpage]{preview}

    \PreviewEnvironment{tikzpicture}
    \setlength\PreviewBorder{10pt}

\begin{document}
    \begin{tikzpicture}

% horizontal axis
\draw[->] (0,0) -- (6.5,0) node (xaxis) [anchor=north] {t};

% vertical axis
\draw[->] (0,0) -- (0,2.5) node (yaxis) [anchor=east] {U};

% line
\draw[dotted] (1,0) coordinate (a) -- (1,1);
\draw[dotted]   (2,0) -- (2,2)
            (4,0) -- (4,2)
            (5,0) -- (5,1)
            (6,0) -- (6,1);

% labels time
    \draw   (0.5,1) node[anchor=north] {$t_0$}
    (1.5,1) node[anchor=north] {$t_r$}
    (3,1) node[anchor=north] {$t_1$}
    (4.5,1) node[anchor=north] {$t_f$}
    (5.5,1) node[anchor=north] {$t_2$};

%labels timestep
\draw   (0,0) node[anchor=north] {0}
    (1,0) node[anchor=north] {1}
    (2,0) node[anchor=north] {4}
    (4,0) node[anchor=north] {10}
    (5,0) node[anchor=north] {11}
    (6,0) node[anchor=north] {13};        

%labels voltage
\draw   (-0.5,1) node {$U_1$}
    (-0.5,2) node {$U_2$};

% Us
\draw[thick] (0,1) -- (1,1) -- (2,2) -- (4,2) -- (5,1) -- (6,1);
%\draw[thick] (6,1) sin (7,0) cos (8,1);

    \end{tikzpicture}
\end{document}

Grafik

Antwort1

Vielleicht hilft der folgende Code. Er reduziert die gesamte Spannungslinienzeichnung auf eine foreachSchleife, in der jedes Element aus vier Werten besteht x coordinate/y coordinate/time label/segment label. Die Koordinaten der Anfangspunkte sindverstecktInnenparameter initially.

\documentclass[tikz,border=10pt]{standalone}

\begin{document}
\begin{tikzpicture}

% horizontal axis
\draw[->] (0,0) -- (6.5,0) node (xaxis) [anchor=north] {t};

% vertical axis
\draw[->] (0,0) node[below]{0} -- (0,2.5) node (yaxis) [anchor=east] {U};

\foreach \x/\y/\t/\l [remember=\x as \lastx (initially 0), 
                       remember=\y as \lasty (initially 1)] in 
                       {1/1/1/$t_0$,2/2/4/$t_r$,4/2/10/$t_1$,5/1/11/$t_f$,6/1/13/$t_2$}{
% voltage line
    \draw (\lastx,\lasty)--(\x,\y);
% vertical reference
    \draw[dotted] (\x,\y)--(\x,0) node[below] {\t};
% time label
    \path (\lastx,1)--node[below] {\l} (\x,1);
}

\path (0,1) node[left] {$U_1$};
\path (0,2) node[left] {$U_2$};


\end{tikzpicture}
\end{document}

Bildbeschreibung hier eingeben

Antwort2

Ich bin mir nicht ganz sicher, wie eine Spannungskurve im Allgemeinen aussieht, aber es scheint, dass Sie einige (t,U)-Koordinaten, Beschriftungen für die t-Achse und die Indizes für die Regionen angeben müssen. Ich würde eine Schleife verwenden \foreachund alles in ein Makro werfen, das die Anfangsspannung und eine durch Kommas getrennte Liste der „Koordinaten“ für die Spannungskurve akzeptiert, wie folgt:

\documentclass{article}
    \usepackage{tikz}
    \usetikzlibrary{calc}
    \usepackage{verbatim}
    \usepackage[active,tightpage]{preview}

    \PreviewEnvironment{tikzpicture}
    \setlength\PreviewBorder{10pt}

    % \VoltageCurve[#1]{#2}
    %    #1 = optional initial voltage (default 1)
    %    #2 = comma separated list of t/U/t-label/t-subscript
    \newcommand\VoltageCurve[2][1]{%
       \begin{tikzpicture}
          \draw  (0,0) node[anchor=north] {0};
          \def\Umax{#1}
          \foreach \t/\U/\tlab/\tsub [remember=\t as \tt (initially 0),
                                      remember=\U as \UU (initially #1)] in {#2} {
             \draw  (\t,0) node[anchor=north] {\tlab};
             \draw[dotted](\t,0)--(\t,\U);
             \draw[thick](\tt,\UU)--(\t,\U);
             \node[anchor=north] at ($ (\tt,1)!0.5!(\t,1) $) {$t_\tsub$};
             \ifnum\U>\Umax\xdef\Umax{\U}\fi% Umax = max{y}
          }
          % axes
          \draw[thin,->] (0,0) -- (\tt+0.5,0) node [anchor=north] {t};
          \draw[thin,->] (0,0) -- (0,\Umax+0.5) node[anchor=east] {U};
          % labels
          \node at (-0.5, #1) {$U_1$};
          \node at (-0.5, \Umax) {$U_2$};
      \end{tikzpicture}%
    }

\begin{document}
    \VoltageCurve{1/1/1/0, 2/2/4/r, 4/2/10/1, 5/1/11/f, 6/1/13/2}

    \VoltageCurve[2]{1/1/1/0, 2/2/4/r, 5/3/10/1, 7/1/11/f, 8/3/13/2, 9/1/16/z}
\end{document}

Hier ist die Ausgabe meines MWE:

Bildbeschreibung hier eingeben

Ein paar erklärende Worte:

  • die (Vorwärts-)Schrägstriche trennen die Variablen in der \foreachSchleife
  • Die Variablen \ttund \UU„merken“ sich die vorherigen Werte von \tbzw.\U
  • \Umaxmerkt sich den Maximalwert \Ufür das Zeichnen der \UAchse
  • Die \tKoordinaten werden als zunehmend angenommen
  • das optionale erste Argument gibt die Anfangsspannung an (Standard 1)
  • Das erste \t-Label wird als0
  • um das t_<sub>Etikett, das ich \usetikzlibrary{calc}zur Bestimmung des Punktes verwende, auf halbem Weg zwischen \ttund tzu platzieren ($ (\tt,1)!0.5!(\t,1) $). Es wäre vielleicht besser, die Höhe dieser Etiketten auf die Anfangsspannung einzustellen, indem man dies durch ersetzt ($ (\tt,#1)!0.5!(\t,#1) $).

verwandte Informationen