If the graph $G=(V,E)$ has a lot of symmetries, then using **spectral realizations** might give you nice drawings that reflects these symmetries. The success of this method (e.g. whether the drawing is planar, whether all vertices are on a sphere) depends on a lot of factors, some of which are not completely clear to me. However, what I can tell you is that it works for the graphs of all uniform 3-polytopes (so, e.g., the dodecahedron). I explain the most straight forward way to do it, some tweaks might be neccessary for the general case: > **Costruction.** Let $\theta$ be an eigenvalue of (the adjacency matrix of) $G$, and $v_1,v_2,v_3\in\Bbb R^n$ three ortho-normal eigenvectors to $\theta$. Construct the matrix $M:=(v_1,v_2,v_3)\in\Bbb R^{n\times 3}$ with the $v_i$ as columns. The rows of that matrix are a 3-dimensional embedding of the vertices of $G$. Usually, you should take $\theta_2$, i.e., the second-largest eigenvalue of the adjacency matrix of $G$. Surprisingly, this eigenvalue has multiplicity three for most symmetric graphs that come from 3-polytopes (exceptions are, as far as I know, only prisms). This means, you cannot do anything wrong by choosing just any orthonormal basis of eigenvectors. Here is code for Mathematica to automatically find a nice drawing of the dodecahedral graph: G = GraphData["DodecahedralGraph"]; A = AdjacencyMatrix[G]; n = VertexCount[G]; eval = Eigenvalues[A // N]; th2 = RankedMax[eval, 2]; evec = NullSpace[A - th2*IdentityMatrix[n]]; GraphPlot3D[G, VertexCoordinateRules -> Table[i -> evec[[{1,2,3}, i]], {i, 1, n}] ] Output: <img src="https://i.sstatic.net/w72uz.png" width="250" /> If $\theta_2$ has multiplicity $<3$, you can add eigenvectors of other eigenvalues until you have three, preferably from the next largest eigenvalues. Just do not use the largest eigenvalue. --- For your example in the comments (the capped cube), we have the problem that $\theta_2$ has multiplicity one. However, as explained, we could use eigenvectors of $\theta_3$ (which has multiplicity two) to complete to a set of three vectors. Use this: th2 = RankedMax[eval, 2]; th3 = RankedMax[eval, 3]; evec = NullSpace[A - th2*IdentityMatrix[n]] ~Join~ NullSpace[A - th3*IdentityMatrix[n]]; Output: <img src="https://i.sstatic.net/aXfA7.png" width="250" /> For general graphs one should certainly follow a more dynamic approach, e.g. sorting the eigenvectors by their eigenvalues and taking the largest three (but not the largest one).