IMHO other answers do not exactly target the question: they are more focused on suggesting (awesome) tools for plotting point-based data rather than symbolic functions.
I would at least like to visualize the plotted points on the curve or find things like vertex, and other crucial information without much effort through the utility. Are there any 'open source' software that would enable me to do so?
I suggest you try Sage. From the website:
SageMath is a free open-source mathematics software system licensed under the GPL. It builds on top of many existing open-source packages: NumPy, SciPy, matplotlib, Sympy, Maxima, GAP, FLINT, R and many more. Access their combined power through a common, Python-based language or directly via interfaces or wrappers.
Mission: Creating a viable free open source alternative to Magma, Maple, Mathematica and Matlab.
Sage is one of the best open source software suite for working with symbolic functions. It runs on Linux and OS X, but there is no native version for Windows. Windows users can download a pre-built virtual machine or use the web based Sage Math Cloud. Basic accounts with plenty of hardware resources are free of charge.
Plot a symbolic function
Assuming you want to plot:

Do:
f(x) = sin(x)*cos(x/pi)
plot(f, (x, -5, 5))
You will get this output:

Note: if you want to use other symbolic variables, you need to define them first, because only x
is built-in. For example:
var('y z a b c d')
Let Sage show you some points
If you want to let Sage sample some points, you can do like this:
from sage.plot.plot import generate_plot_points
f(x) = sin(x)*cos(x/pi)
g = plot(f, (x, -5, 5))
points = generate_plot_points(f, (x, -5, 5))
h = line(points, markerfacecolor='gray', marker='o', markeredgewidth=0, linestyle="")
g+h

Note that these points might not be all of those used to draw the complete plot. You can increase the depth of the adaptive algorithm with a couple of parameters.
Pick exactly the plotted points
You can also hack into the g
object to get the first (and only) primitive (of type Line
) and access the data:
f(x) = sin(x)*cos(x/pi)
g = plot(f, (x, -5, 5))
l = g[0]
points = zip(l.xdata, l.ydata)
h = line(points, markerfacecolor='gray', marker='o', markeredgewidth=0, linestyle="")
g+h

Woah, that's a lot of points. :D
Decide where to place the points
Another approach is to place the points where you want. For example, you might want to plot a point every 0.5 units on the x-axis:
f(x) = sin(x)*cos(x/pi)
g = plot(f, (x, -5, 5))
points = [(x, f(x)) for x in srange(-5, 5.1, 0.5)]
h = line(points, markerfacecolor='gray', marker='o', markeredgewidth=0, linestyle="")
g+h

More options
You can get much fancier by:
- changing colors, line thickness, type of marker and so on
- add a
text
object to each point with coordinates
- set
ymin
and ymax
limits to the plot in order to draw functions with very high values
Possibilities are endless.
Check out the following links:
Save the plot
One more thing. If you want to save the figure, just call the save
method on any plot object.
For example:
g.save("nice.png")
(g+h).save("wonderful.pdf")