I've recently begun development on a project that requires me to visualize graphs, and I am looking for a decent algorithm to tackle this problem.
The graphs I'm drawing model data flow, so a reasonable drawing could be left-to-right or top-to-bottom. They are, of course, directed and mostly acyclic -- that is, there might be a few backwards edges, but these would be a small proportion and I would be happy to remove these before calculating vertex positions if having a DAG as input would substantially improve runtime.
I'm using C++ and Qt for this project and am already very familiar with the Elastic Nodes and the Diagram Scene examples Qt provides. If anyone has seen KCacheGrind, what I'm trying to do is similar to its call graph visualization.
My current attempts have included an original algorithm that assigns each node to a layer based on its minimum distance from the root and then tries to position the nodes inside each layer in such a way that edge crossings are minimized. I was unable to implement the last part of that correctly, and I believe the problem to be NP-Hard.
What I'm looking for is guidance as to what kinds of algorithms have been used to efficiently solve this problem in the past.