Datenpunkte auf Funktion in regelmäßigen Abständen markieren

Antwort erstellen


Diese Frage dient dazu, das automatisierte Versenden von Formularen durch Spam-Bots zu verhindern.
Smilies
:D :) :( :o :shock: :? 8) :lol: :-x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen:

BBCode ist eingeschaltet
[img] ist eingeschaltet
[flash] ist ausgeschaltet
[url] ist eingeschaltet
Smilies sind eingeschaltet

Die letzten Beiträge des Themas

Ich habe die Datenschutzerklärung gelesen und bin damit einverstanden.

   

Wenn du eine Datei oder mehrere Dateien anhängen möchtest, gib die Details unten ein.

Ansicht erweitern Die letzten Beiträge des Themas: Datenpunkte auf Funktion in regelmäßigen Abständen markieren

von chris_Waechter » Mi 13. Aug 2014, 10:18

esdd hat geschrieben:Wenn Du allerdings Messwerte hast, dann sollte vielleicht besser jeder so-und-so-vielte Messwert markiert werden. Dafür kann man mark phase und mark repeat nutzen.
Das Problem ist nur dass diese Werte in keinen gleichmäßigen Abständen folgen. Wenn sich längere Zeit nichts ändert gibt's auch keine Werte.

Der andere Vorschlag hat aber wunderbar funktioniert, besten Dank dafür!

Bild

von esdd » Di 12. Aug 2014, 21:12

Über die Schnittpunkte könnte man das so lösen:
\documentclass[margin=10pt]{standalone} 

\usepackage{pgfplots} 
\pgfplotsset{compat=1.10}

\usetikzlibrary{intersections}

\begin{document} 

\begin{tikzpicture}[punkt/.style={circle,inner sep=2pt,fill=red}]
    \begin{axis}[% 
    width = \textwidth, 
    xmajorgrids, 
    ymin = {0},
    domain=0:1.25,
    %xmin = {0}, 
    %xmax = {1.25}, 
    xtick = {0,0.078,...,1.25}, 
    xticklabels = { }, 
    yticklabels = { }, 
    enlarge x limits = 0.05,
    ] 
    \addplot [samples = 500,name path=kurve] {sin(deg( (2*3.141/2.5)*x))}
      coordinate[pos=0](s)coordinate[pos=1](e);

    \pgfplotsinvokeforeach{1,...,15}{
      \path[name path=line] ({axis cs:#1*0.078,0}|-current axis.south)--({axis cs:#1*0.078,0}|-current axis.north);
      \node[name intersections={of=kurve and line},punkt]at(intersection-1){};
    }
    \end{axis} 
    \foreach \p in {s,e}\node[punkt] at (\p){};
\end{tikzpicture} 
\end{document}
Wenn Du allerdings Messwerte hast, dann sollte vielleicht besser jeder so-und-so-vielte Messwert markiert werden. Dafür kann man mark phase und mark repeat nutzen. Hier ist mal ein Beispiel mit einer Datentabelle:


\begin{filecontents*}{\jobname-data.dat}
       0.000       20.00       20.00       20.00       20.00       20.00
       1.000       20.00       20.00       20.00       20.00       20.00
       2.000       20.00       20.00       20.00       20.00       20.00
       3.000       20.08       20.08       20.08       20.08       20.07
       4.000       20.28       20.28       20.28       20.26       20.23
       5.000       20.63       20.63       20.62       20.57       20.51
       6.000       21.11       21.11       21.10       20.99       20.87
       7.000       21.70       21.70       21.70       21.48       21.32
       8.000       22.39       22.39       22.38       22.03       21.80
       9.000       23.16       23.16       23.14       22.62       22.32
\end{filecontents*}
 \documentclass{scrartcl}
 \usepackage{pgfplots}
 \pgfplotsset{compat=1.10,
 }
 \usepackage[ngerman]{babel}
 \usepackage[utf8]{inputenc}
 \begin{document}

 \begin{tikzpicture}
    \begin{axis}
       \addplot[mark=*,mark phase=1,mark repeat=3] table [x index=0,y index=1] {\jobname-data.dat};
    \end{axis}
 \end{tikzpicture}
 \end{document}
Gruß
Elke

von chris_Waechter » Di 12. Aug 2014, 20:44

Danke für den Vorschlag, aber wie verhält sich das ganze denn bei Messwerten? Wie gesagt, es handelt sich bei dem Graph nur um etwas Sinus-ähnliches das man aber nicht in eine Formel fassen kann. Der Sinus war eigentlich nur ein Beispiel, da alle echten Messdaten einfach zu viel gewesen wären.

von esdd » Di 12. Aug 2014, 19:25

Füge einen zweiten Plot mit der Option only marks, der entsprechenden Markeranzahl als Wert für samples und der zugehörigen domain an:
\addplot [red,samples = 17,only marks,domain=0:1.25] {sin(deg( (2*3.141/2.5)*x))};
Ich habe jetzt 17 Punkte markieren lassen, weil die Kurve 17 Linien schneidet.

Bitte beachte, dass die Angabe von xmin und xmax nur Einfluss auf die Darstellung hat, die Voreinstellung der domain (Standard -5:5) aber nicht ändert. Deine 500 Berechnungspunkte für den eigentlichen Plot verteilen sich deshalb auf den x-Bereich von -5 bis 5.

In dem folgenden Beispiel gebe ich deshalb für beide Plots domain=0:1.25 vor.
\documentclass[margin=10pt]{standalone} 

\usepackage{pgfplots} 
\pgfplotsset{compat=1.10}

\begin{document} 

\begin{tikzpicture} 
    \begin{axis}[% 
    width = \textwidth, 
    xmajorgrids, 
    ymin = {0},
    domain=0:1.25,
    %xmin = {0}, 
    %xmax = {1.25}, 
    xtick = {0,0.078,...,1.25}, 
    xticklabels = {}, 
    yticklabels = {}, 
    enlarge x limits = 0.05,
    ] 
    \addplot [samples = 100] {sin(deg( (2*3.141/2.5)*x))};
    \addplot [red,samples = 17,only marks] {sin(deg( (2*3.141/2.5)*x))};
    \end{axis} 
\end{tikzpicture} 
\end{document}
Gruß
Elke

Datenpunkte auf Funktion in regelmäßigen Abständen markieren

von chris_Waechter » Di 12. Aug 2014, 16:21

Hallo,

Ich habe ein Diagramm in welchem viele Messwerte aufgetragen sind. Das ergibt eine mehr oder weniger Sinus-förmige Halbwelle im Graphen. Nun möchte ich auf dieser Kurve in regelmäßigen Abständen 16 Marker setzten, z.B. rote Punkte. Die Gesamtzeit (auf der x-Achse, = xmax), welche aufgetragen wird, beträgt 1.25 (ms). Also müsste alle 1.25/16 = 0.078 ms eine Markierung erfolgen. So ist auch das Raster eingestellt.

Ein Gedanke wäre 16 Nodes von Hand einzufügen, wobei ich dann jede x- und y- Koordinate einzeln ermitteln muss. Das finde ich nicht sehr elegant und da ich mehrere solcher Diagramme habe wäre das auch zeitaufwändig.

Gibt es dazu eine schöne Variante? Könnte man z.B. die Schnittpunkte des Koordinatensystems mit dem Graphen ermitteln oder gibt es vielleicht sogar eine nodes Funktion die genau das veranlassen würde?

Besten Dank im Vorraus :)
\documentclass{scrreprt}

\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage[english, ngerman]{babel}
\usepackage{tikz}
\usepackage{pgfplots}

\begin{document}

\begin{tikzpicture}
	\begin{axis}[%
	width = \textwidth,
	xmajorgrids,
	ymin = {0},
	xmin = {0},
	xmax = {1.25},
	xtick = {0,0.078,...,1.25},
	xticklabels = {,,},
	yticklabels = {,,},
	enlarge x limits = 0.05
	]
	\addplot [samples = 500] {sin(deg( (2*3.141/2.5)*x))};
	\end{axis}
	
\end{tikzpicture}

\end{document}

Nach oben