...making Linux just a little more fun!
Amit Saha [amitsaha.in at gmail.com]
Hello TAG:
Can this be a possible 2-cent tip?
Couple of things first up:
* GNU plot supports piping, So, echo "plot sin(x)" | gnuplot will plot the sin(x) function.
* However, the plot disappears even before you could see it. For that echo "plot sin(x)" | gnuplot -persist , is useful. It persists the GNU plot main window
The usefulness of the second point is that, if you have a "pipe descriptor" describing a pipe to the open GNU plot instance , you can plot more plots on the first plot, without opening a new GNU plot instance. We shall be using this idea in our code.
#include <stdio.h> #define GNUPLOT "gnuplot -persist" int main(int argc, char **argv) { FILE *gp; gp = popen(GNUPLOT,"w"); /* 'gp' is the pipe descriptor */ if (gp==NULL) { printf("Error opening pipe to GNU plot. Check if you have it! \n"); exit(0); } fprintf(gp, "set samples 2000\n"); fprintf(gp, "plot abs(sin(x))\n"); fprintf(gp, "rep abs(cos(x))\n"); fclose(gp); return 0; }
The above code will produce a comparative plot of absolute value of sin(x) and cos(x) on the same plot. The popen function call is documented at http://www.opengroup.org/pubs/online/7908799/xsh/popen.html. This code/idea should work on GCC and Linux and any other language and OS that supports piping.
Utility: If you have a application which is continuously generating some data, which you will finally plot, then you can plot the data for every new set of data- that gives a nice visualization about how the data is changing with the iterations of your application. This is a perfect way to demonstrate convergence to the best solutions in Evolutionary Algorithms, such as Genetic Algorithms.
Best, Amit
-- Journal: http://amitksaha.wordpress.com, µ-blog: http://twitter.com/amitsaha
Amit Saha [amitsaha.in at gmail.com]
On Sun, Oct 4, 2009 at 4:03 PM, Amit Saha <amitsaha.in@gmail.com> wrote:
> Hello TAG: > > Can this be a possible 2-cent tip? > > > Couple of things first up: > > * GNU plot supports piping, So, echo "plot sin(x)" | gnuplot will > plot the sin(x) function. > * However, the plot disappears even before you could see it. For > that echo "plot sin(x)" | gnuplot -persist , is useful. It persists > the GNU plot main window > > The usefulness of the second point is that, if you have a "pipe > descriptor" describing a pipe to the open GNU plot instance , you can > plot more plots on the first plot, without opening a new GNU plot > instance. We shall be using this idea in our code. > > <code> > > #include <stdio.h> > #define GNUPLOT "gnuplot -persist" > > int main(int argc, char **argv) > { > FILE *gp; > gp = popen(GNUPLOT,"w"); /* 'gp' is the pipe descriptor */ > if (gp==NULL) > { > printf("Error opening pipe to GNU plot. Check if you have it! \n"); > exit(0); > } > > fprintf(gp, "set samples 2000\n"); > fprintf(gp, "plot abs(sin(x))\n"); > fprintf(gp, "rep abs(cos(x))\n"); > fclose(gp); > > return 0; > } > > </code> > > The above code will produce a comparative plot of absolute value of > sin(x) and cos(x) on the same plot. The popen function call is > documented at http://www.opengroup.org/pubs/online/7908799/xsh/popen.html. > This code/idea should work on GCC and Linux and any other language and > OS that supports piping. > > Utility: If you have a application which is continuously generating > some data, which you will finally plot, then you can plot the data for > every new set of data- that gives a nice visualization about how the > data is changing with the iterations of your application. This is a > perfect way to demonstrate convergence to the best solutions in > Evolutionary Algorithms, such as Genetic Algorithms. >
Btw, its already up on my blog, if that matters.
-Amit
-- Journal: http://amitksaha.wordpress.com, µ-blog: http://twitter.com/amitsaha
Thomas Adam [thomas.adam22 at gmail.com]
On Sun, Oct 04, 2009 at 04:03:05PM +0530, Amit Saha wrote:
> Utility: If you have a application which is continuously generating > some data, which you will finally plot, then you can plot the data for > every new set of data- that gives a nice visualization about how the > data is changing with the iterations of your application. This is a > perfect way to demonstrate convergence to the best solutions in > Evolutionary Algorithms, such as Genetic Algorithms.
Or just use a named FIFO at the shell:
mkfifo /tmp/gnuplot while :; do (gnuplot -persist) < /tmp/gnuplot; done
Then you need only do:
echo "plot sin(x)" > /tmp/gnuplot
... for as many times as you like. And as it's at the shell, you could even use a heredoc, etc.
-- Thomas Adam
-- "It was the cruelest game I've ever played and it's played inside my head." -- "Hush The Warmth", Gorky's Zygotic Mynci.
Amit Saha [amitsaha.in at gmail.com]
On Sun, Oct 4, 2009 at 4:29 PM, Thomas Adam <thomas.adam22@gmail.com> wrote:
> On Sun, Oct 04, 2009 at 04:03:05PM +0530, Amit Saha wrote: >> Utility: If you have a application which is continuously generating >> some data, which you will finally plot, then you can plot the data for >> every new set of data- that gives a nice visualization about how the >> data is changing with the iterations of your application. This is a >> perfect way to demonstrate convergence to the best solutions in >> Evolutionary Algorithms, such as Genetic Algorithms. > > Or just use a named FIFO at the shell: > > ``` > mkfifo /tmp/gnuplot > while :; do (gnuplot -persist) < /tmp/gnuplot; done > ''' > > Then you need only do: > > ``` > echo "plot sin(x)" > /tmp/gnuplot > ''' > > ... for as many times as you like. And as it's at the shell, you could even > use a heredoc, etc.
Cool. Thanks for adding to it!
Best, Amit
-- Journal: http://amitksaha.wordpress.com, µ-blog: http://twitter.com/amitsaha