La forma más fácil de gráficar funciones (y no solo lineales) es creando una jerarquía de clases que encapsule cada operación o "sub-función" posible.
Luego se hace un "interprete" de la cadena introducida por el usuario para que se evalúe la expresión completa.
Por ejemplo: Se puede crear la clase Expresión de la cual se hereden: constante, variable y operación. De operación se pueden heredar: suma, resta, multiplicación y división, Y otras como seno, coseno, etc... Cada clase debe implementar un método evaluar().
Si quieres más ayuda, tengo un pequeño ejemplo en Java.