Passing Python functions to Gnuplot -
plotting python function in gnuplot not straightforward although there solutions. example, 1 either cast values array or manually translate expression gnuplot’s syntax. here example uses module gnuplot.py
interface:
#!/usr/bin/env python import gnuplot import numpy np ## define function ## func = lambda x, x0, y0, w: y0 * np.exp( -4*np.log(2) * ( (x-x0) / w )**2 ) # works regular function: # def func(x, x0, y0, w): # return y0 * np.exp( -4*np.log(2) * ( (x-x0) / w )**2 ) popt = (10.1, 5, 2) ## linspace ## x = np.linspace(0, 20, num=1000) # (x min, x max, number of points) y = func(x, *popt) func_linspace = gnuplot.data(x, y, with_='lines', title='linspace') ## expression “translation” (lambda only) ## func_translation = gnuplot.func( '{y0} * exp( -4*log(2) * ( (x-{x0}) / {w} )**2 )'.format( x0=popt[0], y0=popt[1], w=popt[2], ), title='expression translation') ## plot ## g = gnuplot.gnuplot() g.plot(func_linspace, func_translation)
the first method works fine decent number of points fails when zooming-in or changing window out of array’s limits, while second 1 works @ zoom level. illustrate point, let’s zoom-in output of previous script:
for reason, interesting find way plot python functions (lambda or regular functions) gnuplot functions. can think of 2 solution: automatically translating expression (works “simple” lambda functions”), or having gnuplot directly use python function.
first solution: expression translation (simple lambda functions only)
this method not tricky automate, impossible implement elaborate functions. still use method simple lambda functions. sketch behaviour of implementation:
>>> def lambda_to_gnuplot(func, popt): ... # determine if translation possible ... # extract function expression , replace parameters values ... return func_expression # str >>> lambda_to_gnuplot( ... lambda x, x0, y0, w: y0 * np.exp( -4*np.log(2) * ( (x-x0) / w )**2), ... (10.1, 5, 2)) '5 * exp( -4*log(2) * ( (x-10.1) / 2 )**2 )'
would there way implement lambda_to_gnuplot
function in python?
second solution: directly passing python function gnuplot
the “perfect” solution having gnuplot use python function. in daring dreams, like:
>>> def func(x, x0, y0, w): ... if x < x0: ... return 0 ... else: ... return y0 * np.exp( -4*np.log(2) * ( (x-x0) / w )**2) >>> func_direct = gnuplot.pyfunction(lambda x: func(x, 10.1, 5, 2)) >>> g.plot(func_direct)
this easiest solution use, implementation tough, if not impossible. any hints on how solution might implemented? answer may of course bypass gnuplot.py
.
i not sure if i'm answering question, try executing python script system call within gnuplot passing argument(s).
for instance, imagine simple python script test.py
:
import sys x=float(sys.argv[1]) print x**2
which return square of argument when called shell:
:~$ python test.py 2 4.0 :~$ python test.py 3 9.0 :~$ python test.py 4 16.0
now, within gnuplot, turn function:
gnuplot> f(x) = real(system(sprintf("python test.py %g", x))) gnuplot> print f(1) 1.0 gnuplot> print f(2) 4.0 gnuplot> print f(3) 9.0 gnuplot> print f(4) 16.0
i added real()
string output system call converted float. allows use regular gnuplot function. don't need mention take lot longer execute plot x**2
:
f(x) = real(system(sprintf("python test.py %g", x))) plot f(x)
Comments
Post a Comment