1

I'm trying to create a plot of the light distribution. I want to do exactly what step one of this question asks: Statistical analysis on Bell shaped (Gaussian) curve.

Right now I have an array of values. I want the index number of the array element to be on the x axis of the plot and the actual value stored at the index to be the on the y axis. I'm trying to do this using OpenCV but OpenCV's histogram functions only seem to plot the frequency of values and nothing else.

1 Answer 1

1

I have found cvplot useful, although very limited: http://code.google.com/p/cvplot/

Also it is fairly easy to embed python and feed matplotlib it commands from c++. I have used this to produce nice looking graphs, which you definitely won't get from cvplot. Here is a quick and dirty class, followed by an example, but no doco (of course there is a heap of doco for matplotlib):

// Interface to Python's Matplotlib
#include <Python.h>     
using namespace std;

class PyPlot
{
private:
    // Singleton Constructor
    PyPlot() : locked(false)
    {
        Py_SetProgramName("argv[0]");  /* optional but recommended */
        Py_Initialize();

        PyRun_SimpleString(
            "import numpy as np\n"
            "import matplotlib.pyplot as plt\n"
            "import matplotlib.text as text\n"
            "import matplotlib as mpl\n"
            );
    }

    ~PyPlot()
    {
        Py_Finalize();
    }


    // prevent copies of singleton
    PyPlot(PyPlot const&);    // No  implemention
    void operator=(PyPlot const&); // No implemention


    string to_string(double dval)
    {  
        return std::to_string(long double(dval));
    }

    string to_string(int ival)
    {      
        return std::to_string(long long(ival));
    }


public:
    // get singleton instance
    static PyPlot& getInstance()
    {
        static PyPlot    instance; // Guaranteed to be destroyed.
        // Instantiated on first use.
        return instance;
    }

    // prevent reentry to Matplotlib's show()
    bool locked;


    inline void print_time()
    {
        PyRun_SimpleString("from time import time,ctime\n"
                     "print 'Today is',ctime(time())\n");
    }

    inline void exec(string command)
    {
        PyRun_SimpleString(command.c_str());
    }

    inline void show()
    {
        locked = true;
        exec("plt.show()\n");
        locked = false;
    }

    inline void title(string s, string args = "")
    {
        string command = "plt.title(r'" + s + "'";
        if(args.length() != 0)
            command += ", " + args;
        command += ")\n";
        exec(command);
    }

    inline void xlabel(string s, string args = "")
    {
        string command = "plt.xlabel(r'" + s + "'";
        if(args.length() != 0)
            command += ", " + args;
        command += ")\n";
        exec(command);
    }

    inline void ylabel(string s, string args = "")
    {
        string command = "plt.ylabel(r'" + s + "'";
        if(args.length() != 0)
            command += ", " + args;
        command += ")\n";
        exec(command);
    }

    inline void legend(string args = "")
    {
        string command = "plt.legend(";
        if(args.length() != 0)
            command += args;
        command += ")\n";
        exec(command);
    }

    template <typename T>
    inline void define_vector(string name, vector<T> values)
    {
           string command = name + " = [";

           vector<T>::iterator it;
           for(it = values.begin(); it != values.end(); it++)
           {
               command += to_string(*it);

               if(it + 1 != values.end())
                   command += ", ";
           }
           command += "]\n";
           exec(command);
    }

    template <typename T>
    inline void plot(vector<T> x, vector<T> y, string args = "")
    {
        define_vector("x", x);
        define_vector("y", y);

        string command = "plt.plot(x, y";
        if(args.length() != 0)
            command += ", " + args;
        command += ")\n";
        exec(command);
    }

    template <typename T>
    inline void plot(vector<T> y, string args = "")
    {
        define_vector("y", y);
        vector<int> x;
        for(unsigned int i = 0; i < y.size(); i ++)
            x.push_back(i);

        define_vector("x", x);

        string command = "plt.plot(x, y";
        if(args.length() != 0)
            command += ", " + args;
        command += ")\n";
        exec(command);
    }

    inline void example()
    {
        double xa[] = {0.5,   0.7,   0.9 ,   1.3 ,   1.7 ,   1.8};
        vector<double> x;
        x.assign(xa, xa + 6);

        double ya[] = {0.1 ,   0.2 ,   0.75 ,   1.5 ,   2.1 ,   2.4};
        vector<double> y;
        y.assign(ya, ya + 6);

        plot(x, y);
        plot(x, y, "'go', markersize=20");

        exec(
            "plt.xticks( np.arange(0,3) )\n"
            "plt.yticks( np.arange(0,2.5,0.2) )\n"
            );
        xlabel("x axis");
        ylabel("y axis");
        title("My Plot Example");
        show();
    }
};

#endif

Then use it like this:

PyPlot &plt = PyPlot::getInstance();

std::vector<int> values;

plt.exec("mpl.rcParams['font.family']='Times New Roman'\n"
         "mpl.rcParams['lines.linewidth'] = 2\n"
            "mpl.rcParams['axes.linewidth'] = 3\n"
            "mpl.rc('xtick', labelsize=12)\n"
            "mpl.rc('ytick', labelsize=12)\n"
            "ax = plt.gca()\n"
            "ax.set_ylim(0, 100)\n"
            );

plt.plot(values, "'go-', label='values'");
plt.ylabel("Value", "fontsize=14");
plt.xlabel("Index", "fontsize=14");
plt.show();

This has the matplotlib commands need to to create a histogram: http://matplotlib.org/examples/api/histogram_demo.html

And of course you need Python installed. All works fine with Python 2.7.3 / Win 7/ VS2010/ OpenCV 2.4.4

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.