3
1

Hallo, habe folgende(s) Problem(e)

Ich hab ein Diagramm mit 3 Linien bei denen sich 2 an einer Stelle schneiden. Diesen Schnittpunkt möchte ich gerne automatisch finden und beschriften. Dazu soll folgendes Passieren:

1) Punkt einzeichnen
2) Punkt mit Break Even Point beschriften
3) vom Schnittpunkt eine Strichlinie auf die X-Achse
4) Wert der X-Achse angeben
5) Linie möglichst abgerundet darstellen ( Also wie bei Excel mit interpolierten Linien

optional
5)vom Schnittpunkt eine Strichlinie auf die Y-Achse
6) Wert der Y-Achse angeben

verwende bislang folgenden Code

Code:

Open in writeLaTeX
\documentclass{article}
\usepackage{pgfplots}
\pgfplotsset{
width=1\textwidth,
height=0.7\textwidth,
every axis legend/.append style={at={(0.1,0.7)},anchor=south west,   % Position der Legende in diesem Fall untere linke Ecke bei x=0% und y=100%
cells={anchor=west}},            % Position der Beschriftung innerhalt der Legende (east, center, west)
title style={at={(0.5,1.05)}}            % Position der Überschrift                  
}

\begin{document}  
\begin{tikzpicture}
   \begin{axis}[
      xlabel = Menge\,/\,Tsd. Tonnen,
      xmin = 0, xmax = 1,
      ylabel = Kosten\,/\,Mio. Euro,
      ymin = 0, ymax = 7,
      title=\textbf{Break Even Point},
      ]
      \addplot coordinates {
(0 ,0)
(0.250 ,1.179361)
(0.500 ,1.218722)
(0.750 ,1.258084)
(1.000 ,1.297445)
         };
      \addplot coordinates {
(0,3.000000)
(0.250,4.179361)
(0.500,4.218722)
(0.750,4.258084)
(1.000,4.297445)
         };
      \addplot coordinates {
(0 ,0)
(0.250 ,1.625041)
(0.500 ,3.250082)
(0.750 ,4.875123)
(1.000 ,6.500165)
         };
      \legend{
         Wert1,
         Wert2,
         Wert3}
   \end{axis}
\end{tikzpicture}
\end{document}

jensDiagrammSchnittpunkt

hoffe sehr ihr könnt mir helfen. Bin dabei leider bereits ziemlich unter Zeitdruck

gefragt 17 Dez '14, 16:19

jens's gravatar image

jens
31113
Akzeptiert-Rate: 0%

bearbeitet 17 Dez '14, 18:07


Das Finden des Schnittpunktes ist der Antwort von @percusse auf TeX.SX entnommen. Die Linien lassen sich durch den Parameter smooth glätten. Ich kenne die Implementierung von smooth nicht aber vermute, dass es sich um kubische Splines handelt. Daher erkennt man bei der roten Kruve ein Überschwingen über die gestrichelte Linie. Da sich smooth leider nicht durch einen Gewichtungsparameter variieren lässt bleibt nur die Möglichkeit entweder eine explizite Funktion an die Datenpunkte zu fitten (z.B. mit gnuplot) oder die Implementierung von smooth entsprechend zu verändern.

Open in writeLaTeX
\documentclass{article}
\usepackage{pgfplots,tikz}
\usetikzlibrary{intersections}
\pgfplotsset{
  width=1\textwidth,
  height=0.7\textwidth,
  every axis legend/.append style={at={(0.1,0.7)},anchor=south west,   % Position der Legende in diesem Fall untere linke Ecke bei x=0% und y=100%
    cells={anchor=west}},            % Position der Beschriftung innerhalt der Legende (east, center, west)
  title style={at={(0.5,1.05)}}            % Position der Überschrift                  
}

% Extract coordinates, taken from the answer of precusse
% http://tex.stackexchange.com/questions/88386/
\makeatletter
\def\markxof#1{
\pgf@process{#1}
\pgfmathparse{\pgf@x/\pgfplotsunitxlength +\pgfplots@data@scale@trafo@SHIFT@x)/10^\pgfplots@data@scale@trafo@EXPONENT@x}
}
\def\markyof#1{
\pgf@process{#1}
\pgfmathparse{\pgf@y/\pgfplotsunitylength +\pgfplots@data@scale@trafo@SHIFT@y)/10^\pgfplots@data@scale@trafo@EXPONENT@y}
}
\makeatother

\tikzset{dot/.style={draw,fill,circle,inner sep=1.5pt}}

\begin{document}  
\begin{tikzpicture}
  \begin{axis}[
    xlabel = Menge\,/\,Tsd. Tonnen,
    xmin = 0, xmax = 1,
    ylabel = Kosten\,/\,Mio. Euro,
    ymin = 0, ymax = 7,
    title=\textbf{Break Even Point},
    ]
    \addplot+[smooth] coordinates {
      (0 ,0)
      (0.250 ,1.179361)
      (0.500 ,1.218722)
      (0.750 ,1.258084)
      (1.000 ,1.297445)
    };
    \addplot+[smooth,name path=A] coordinates {
      (0,3.000000)
      (0.250,4.179361)
      (0.500,4.218722)
      (0.750,4.258084)
      (1.000,4.297445)
    };
    \addplot+[smooth,name path=B] coordinates {
      (0 ,0)
      (0.250 ,1.625041)
      (0.500 ,3.250082)
      (0.750 ,4.875123)
      (1.000 ,6.500165)
    };
    \legend{
      Wert1,
      Wert2,
      Wert3}
    \path[name intersections={of=A and B,name=i}] (i-1) \pgfextra{
      \markxof{i-1}\xdef\xcoor{\pgfmathresult}
      \markyof{i-1}\xdef\ycoor{\pgfmathresult}
    };
    \draw[dashed] (axis cs:0,\ycoor) coordinate (ycoor)
    -- (i-1)
    -- (axis cs:\xcoor,0) coordinate (xcoor);
    \node[dot,pin={above left:Break Even Point}] at (i-1) {};
  \end{axis}
  \node[below right,rotate=90] at (xcoor) {\pgfmathprintnumber[fixed,precision=5]\xcoor};
  \node[above right] at (ycoor) {\pgfmathprintnumber[fixed,precision=5]\ycoor};
\end{tikzpicture}
\end{document}

alt text

Permanenter link

beantwortet 17 Dez '14, 21:34

Henri's gravatar image

Henri
15.7k133943
Akzeptiert-Rate: 46%

bearbeitet 22 Dez '14, 09:01

danke hierfür das ist schonmal Top. Mit "abgerundet" meine ich im Prinzip eine Ausgleichskurve über die Punkte. Wie bei Excel in einem XY-Diagramm mit interpolierten Linien. Dort werden die Punkte auch über eine Kurve verbunden. Denn der Verlauf meiner Daten hat in wirklichkeit ja auch keinen Knick, sondern verläuft vor derm zweiten Punkt wohl etwas steiler und macht dann eine kurve zu den anderen Punkten hin. (hoffe so ist es verständlicher)

(17 Dez '14, 23:24) jens

Ich glaube hier ist einfach smooth gemeint.

(18 Dez '14, 08:57) Johannes

ok muss ich dann die Koordinaten mit Punkten ohne linie einlesen und dann die linie drüber oder kann ich das dirket in einem zug machen???

(18 Dez '14, 12:11) jens

@jens Willkommen auf der TeXwelt! Kommentare und Rückfragen bitte als "Kommentar" posten, nicht als "Antwort" (ich habe die Antwort in einen Kommentar umgewandelt). Da sind hier echte Antworten im Sinne von Lösungen. Das verbessert die Übersicht und Sortierbarkeit. Der Aufbau hier ist anders (innovativer ;-)) als in klassischen Webforen, dauert sicher einen Moment zum Gewöhnen.

(18 Dez '14, 12:42) stefan ♦♦

ok verstanden

das Problem mit der "abgerundeten" Linie/Kurve hat sich übrigens erledigt, da ich meine Daten nochmal überarbeitet habe. Trotzdem wäre ich um die Antwort für die Zukunft dankbar

(18 Dez '14, 13:20) jens

@jens Du kannst das gern als eigenständige Frage posten. Das macht die Frage sichtbarer, hier geht es als Teilfrage evtl. unter. Ist auch gern gesehen hier, wir bearbeiten Fragen gern einzeln, da besser einsortierbar nach Themen als Sammelfragen, nur als Info.

(18 Dez '14, 13:57) stefan ♦♦

Hallo nochmal, eine kurze Frage ist noch aufgetaucht: Die Daten haben sich ein wenig geändert und die Linien sind verschoben. Nun ist der x-Wert des Schnittpunktes zu nahe an der 3.Linie.

Wie kann ich den angegebenen Wert (im Beispiel hier 0,65268) ewas nach oben verschieben??

(03 Feb '15, 11:54) jens
Ergebnis 5 von 7 show 2 more comments
Deine Antwort
Vorschau umschalten

Folgen dieser Frage

Per E-Mail:

Wenn sie sich anmelden, kommen Sie für alle Updates hier in Frage

Per RSS:

Antworten

Antworten und Kommentare

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ügen Sie einfach zwei Leerzeichen an die Stelle an der die neue Linie sein soll.
  • grundlegende HTML-Tags werden ebenfalls unterstützt

Frage-Themen:

×296
×53

gestellte Frage: 17 Dez '14, 16:19

Frage wurde gesehen: 13,882 Mal

zuletzt geändert: 03 Feb '15, 11:54