Sometimes an NPR surface effect, or half-toning, etc. is best achieved by using a Shader to RGB node in EEVEE, or the Blender Internal renderer, either of which can feed the light-response of a surface (as a color) back into the rendering pipeline for further manipulation. This can't be done directly in Cycles, where shaders don't produce definite colors on their own - they are functions determining what to do with (possibly a large number of) incoming samples of light.
If you want this kind of non-physical feedback from Cycles, you can do it indirectly, by baking the colors resulting from shading into a texture before using the texture in another material in another render, or by using the colors resulting from shading in compositing. But that can be expensive, in processing time, and your time.
Here's a simple example using Blender Internal:
The sphere has a couple of mixed textures influencing its normal. The effect of the normal on the lit surface is then put through a color ramp, with this result, after a Freestyle outline is added:
Use toon bsdf shader on cycles.