I'd like to replace the mark of my plot with a mini brownian diffusion. I'll probably need to embed it in a `pic`. I have the ingredients, I need a little help (some would say I am missing a pi(e)c(e)... ) on the recipe. I don't look for the version below with one brownian replicated 5 times and not consistent with the measure on the main graph. ![MAinplot2.png](/image?hash=545e69920b248944cf8f79ba2abee0d2bd7bcf1be3ecfb4e724fba8e371ae384) I imagine more something like (Poorly copied pasted) with one brownian per period, whose coordinates are consistent with the main plot. ![TAPic000.png](/image?hash=c45665aaad7f9cab50f178befe5b346433c671cd3c8585b7411954ef0a0ff929) **Where do I need help ?** I'd like each brownian - to start at the mark - have a width of one tick for the pic - diffusion being consistent with the main plot grid Details in the MWE below. ``` \documentclass[tikz]{standalone} \usepackage{pgfplots, pgfplotstable} \usetikzlibrary{positioning} \tikzset{ declare function={ invgauss(\a,\b) = sqrt(-2*ln(\a))*cos(deg(2*pi*\b)); } } %----------------------------------------------------------------- % Code from Jake @ TeX.SE to generate brownian motions % If you have an idea to load to improve the compilation time \makeatletter \pgfplotsset{ table/.cd, brownian motion/.style={ create on use/brown/.style={ create col/expr accum={ (\coordindex>0)*( max( min( invgauss(rnd,rnd)*0.25*sqrt(1)+\pgfmathaccuma, \pgfplots@brownian@max ), \pgfplots@brownian@min ) ) + (\coordindex<1)*\pgfplots@brownian@start }{\pgfplots@brownian@start} }, y=brown, x expr={\coordindex}, brownian motion/.cd, #1, /.cd }, brownian motion/.cd, min/.store in=\pgfplots@brownian@min, min=-inf, max/.store in=\pgfplots@brownian@max, max=inf, start/.store in=\pgfplots@brownian@start, start= 0 } \makeatother %----------------------------------------------------------------- % Create the pic that generates brownian motions % I did my homework and read the pgfmanual. % It enabled me to use parameters in `pic` % The idea is to have flexibility on the brownian % \pic{BM=color/Starting@y/nbs of paths/nbs of points in the path}; % "nbs of points in the path" represents the subdivision of 1 unit of time \tikzset{pics/BM/.style args={#1/#2/#3/#4}{ code = {% \pgfmathsetseed{3} \pgfplotstablenew{#4}\wiener % Initialise an empty table with #4 steps for brownians \node[](#1){ \begin{tikzpicture} \begin{axis}[ axis line style={draw=none}, tick style={draw=none}, xtick=\empty, ytick=\empty, % xlabel = subdivision of 1 unit of time, % ylabel = $S$, ] \foreach \i in {1,...,#3}{% <- I can draw #3 paths % start is a paramater to make it start at the mark on the main plot \addplot[#1,smooth] table [brownian motion={start=#2}] {\wiener}; % \addplot[#1,smooth] table % [brownian motion={start=#2,min=80,max=120}] {\wiener}; % no impact of min and max... } \end{axis} \end{tikzpicture} }; }}} \begin{document} % Main plot \begin{tikzpicture} \begin{axis}[ xlabel = time, ylabel = $S$ ] %I'll apply it to a function later % \addplot+[domain=0:5] {f(x)}; % But as a start, I set the list of points manually \addplot[color=blue,smooth,mark=*] coordinates { (0,100) (1,102) (2,95) (3,101) (4,105) (5,98) }; \end{axis} \end{tikzpicture} % I'll display one consistent type \begin{tikzpicture} \pic{BM=orange/100/10/200}; % First point \end{tikzpicture} \begin{tikzpicture} \pic{BM=green/102/10/200}; % Second point \end{tikzpicture} \begin{tikzpicture} \pic{BM=blue/95/10/200}; % Third point \end{tikzpicture} \begin{tikzpicture} \pic{BM=orange/101/10/200}; % Fourth point \end{tikzpicture} \end{document} ```
This is an answer that literally uses `pic`s as plot marks. The `pic` has various options which I hope are somewhat selfexplanatory. Please note that generally you will be better off if you dial a rather recent compatibility mode of `pgfplots`. I chose `\pgfplotsset{compat=1.17}` and there is no guarantee that the following works with ancient versions. To make a `pic` a plot mark, one can use something of the sort ``` \pgfdeclareplotmark{Brownian}{\pic[every mark]{Brownian};} ``` The `every mark` key is used to allow the user to pass styles to the `pic` using the `mark options` key, so this works just like any other plot mark. The `axis direction cs:` prefix is crucial to have reasonable pics inside an `axis` environment. This also means that you cannot use them outside an `axis` unless you take extra steps, see the PS below for one out of several options to accomplish this. Finally, we use `scatter classes` to define different plot marks with different `mark options`, they can then simply be added in square brackets after the coordinates, as the following example illustrates. ``` \documentclass[tikz]{standalone} \usepackage{pgfplots} \pgfplotsset{compat=1.17} \tikzset{pics/Brownian/.style={code={ \tikzset{Brownian/.cd,#1}% \def\pv##1{\pgfkeysvalueof{/tikz/Brownian/##1}}% \foreach \XXX in {1,...,\pv{N}} { \draw[pic actions] (axis direction cs:0,0) foreach \YYY in {1,...,\pv{M}} {-- ++ (axis direction cs:{\pv{dx}},{\pv{dy}*(rnd-0.5)})} ;} }},Brownian/.cd,N/.initial=25,M/.initial=25,dx/.initial=0.04,dy/.initial=0.25} \begin{document} \pgfdeclareplotmark{Brownian}{\pic[every mark]{Brownian};} % Main plot \begin{tikzpicture} \begin{axis}[xmax=6, scatter/classes={ a={mark=Brownian,mark options={red,Brownian/dy=0.4,Brownian/N=40}}, b={mark=Brownian,mark options={blue}}, c={mark=Brownian,mark options={orange,Brownian/dy=0.12}} }, xlabel = time, ylabel = $S$ ] \addplot[color=blue,smooth, scatter, scatter src=explicit symbolic,] coordinates { (0,100) [c] (1,102) [b] (2,95) [a] (3,101) [a] (4,105) [b] (5,98) [c] }; \end{axis} \end{tikzpicture} \end{document} ``` ![Screen Shot 2021-02-21 at 10.52.46 AM.png](/image?hash=7aeff7d1ef95bef48985ec906bf564c4cab8eb838254ac75ff932837d1e566e7) P.S. If one wants to create a `pic` that works inside *and* outside of an `axis` environment, one can use the `\pgfplotsifinaxis` macro. There are other options available, but since this is not central to the current question I won't spell them out since I did not test any of them. ``` \tikzset{pics/Brownian/.style={code={ \tikzset{Brownian/.cd,#1}% \def\pv##1{\pgfkeysvalueof{/tikz/Brownian/##1}}% \foreach \XXX in {1,...,\pv{N}} {\pgfplotsifinaxis{% \draw[pic actions] (axis direction cs:0,0) foreach \YYY in {1,...,\pv{M}} {-- ++ (axis direction cs:{\pv{dx}},{\pv{dy}*(rnd-0.5)})};}{% \draw[pic actions] (0,0) foreach \YYY in {1,...,\pv{M}} {-- ++ ({\pv{dx}},{\pv{dy}*(rnd-0.5)})};}{% }} }},Brownian/.cd,N/.initial=25,M/.initial=25,dx/.initial=0.04,dy/.initial=0.25} ```