Packages

Package for some nice color functions...some of them are now standard in Mathematica6 (with other names, though)
If you don't have the package you have to replace the function Rainbow[_] by e.g Hue[]; very close is (Hue[0.7(1-#)]&)

<< Physik`ColorFunctions`

Functions

Set of rotation matrices in 3D

rotX[α_] := {{1, 0, 0}, {0, 
            Cos[α], -Sin[α]}, {0, Sin[α], 
            Cos[α]}};
rotY[α_] := {{Cos[α], 0, Sin[α]}, {0, 1, 
            0}, {-Sin[α], 0, 
            Cos[α]}};
rotZ[α_] := {{Cos[α], -Sin[α], 
            0}, {Sin[α], Cos[α], 0}, {0, 0, 1}};

Function to rotate  and shift objects of a graph.
The input is similar to that of ParamaetricPlot3D[___] including the Options[___].
Additional arguments are:
	a colorfunction depending on the same parameters as the geometry function
	{x,y,z} a vector that shifts the object
	{α,β,γ} three Euler-angles (in the z-y-z-system) that rotate the object

shiftAndRotate[fun_, 
        colorfun_, {θ_, θs_, θe_}, {φ_, φs_, φe_}, {x_, y_, 
          z_}, {α_, β_, γ_}, 
        opts___] := 
Module[
{
graph, color, sentopts, p1, p2, 
          rotMX = zMX[γ] . yMX[β] . 
              zMX[α]
}, 
{p1, 
            p2} = PlotPoints /. {opts} /. 
            Options[ParametricPlot3D]; 
sentopts = 
          Join[{DisplayFunction -> 
                Identity}, {opts}]; 
color = 
          Flatten[Table[(colorfun /. {θ -> 
                      i, φ -> 
                      j}), {j, φs, φe - ((φe - φs)/(p2 - 1)), ((φe - φs)/(p2 - 1))}, {i, θs, θe - ((θe - θs)/(p1 - 1)), ((θe - θs)/(p1 - 1))}], 
            1]; 

graph = 
          ParametricPlot3D[
            fun, {θ, θs, θe}, {φ, φs, φe}, 
            Evaluate[Sequence @@ sentopts]]; 
graph = 
          First[graph]; 
graph = #[[1]] & /@ 
            graph; 
graph = {Polygon[Take[#, 3]], 
                Polygon[
                  Take[RotateRight[#, 2], 
                    3]]} & /@ (({x, y, z} + 
                          rotMX . #) & /@ # & /@ 
                graph); 
graph = 
          Transpose[
            Join[{color}, Transpose[graph]]]; 
Return[
          Flatten[graph]]
]

As an example look at this quadrupole moment

\(\(testLst = 
        shiftAndRotate[{Sin[θ] Cos[φ], 
              Sin[θ] Sin[φ], Cos[θ]} 
            Abs[SphericalHarmonicY[2, 
                0, θ, φ]], {EdgeForm[], 
SurfaceColor[
If[
                SphericalHarmonicY[2, 0, θ, φ] > 
                  0, 
	
                If[Sin[6  φ] > 0, Rainbow[Cos[45  °]\^2], 
                  RGBColor[1, 1, 1]], 
If[
                  Sin[6  φ] > 0, Rainbow[Cos[45  °]\^2], 
                  RGBColor[0, 0, 0]]], GrayLevel[ .8], 5]}, {θ, 
            0. , π}, {φ, 0. , 2  π}, {0, 0, 0}, {0, 
            45.  °, 0}, PlotPoints -> {80, 80}];\)\)

\(Show[
      Graphics3D[
        testLst], 
LightSources -> {
{{1, 1, 1}, 
            GrayLevel[ .6]}, 
{{0, 1, 1}, 
            GrayLevel[ .6]}
}, Axes -> False, 
      AxesLabel -> {"x", "y", "z"}, 
      ViewPoint -> {0.589, \ \(-3.166\), \ 1.040}]\)

Arrays

The graphs maybe combined like this

In general one has a list of moment coordinates containing positions and rotations

positionList = 
        Flatten[Table[{{i, j, 0}, {0, (π/2), 
                Random[Real, {0, 2  π}]}}, {i, 0, 3}, {j, 0, 3}], 
          1];

graphList = {};
\(\(Table[
AppendTo[
          graphList, 
shiftAndRotate[
{Sin[θ] 
                  Cos[φ], Sin[θ] Sin[φ], 
                Cos[θ]}  .70\ Abs[
                SphericalHarmonicY[1, 
                  0, θ, φ]], 
{EdgeForm[], 
              SurfaceColor[
	
                If[SphericalHarmonicY[1, 0, θ, φ] > 0, 
                  RGBColor[1, 0, 0], 
                  RGBColor[ .7, 1, 
                    0]], 
\ \ \ \ \ \ \ \ \ GrayLevel[ .8], 
                5]}, 
{θ, 0. , π}, {φ, 
              0. , 2  π}, 
            positionList[[k, 1]], 
            positionList[[k, 2]], 
            PlotPoints -> {35, 20}]], 
{k, 1, 
          Length[positionList]}];\)\)

Show[
      Graphics3D[
        graphList], 
LightSources -> {
{{1, 1, 1}, 
            GrayLevel[ .6]}, 
{{0, 1, 1}, 
            GrayLevel[ .6]}
}, Axes -> False, 
      ViewPoint -> {0.113,  -0.923,  3.253}]

It is also possible to make an orientation dependent coloring (in this case with respect to |z|)

positionList2 = 
        Flatten[Table[{{i, j, 
                0}, {0, (π/16) (i + j), (π/11) (i - 
                      j)}}, {i, 0, 8}, {j, 0, 8}], 1];

graphList2 = {};
\(\(Table[
AppendTo[
          graphList2, 
shiftAndRotate[
{Sin[θ] 
                  Cos[φ], Sin[θ] Sin[φ], 
                Cos[θ]}  .70\ Abs[
                SphericalHarmonicY[2, 
                  0, θ, φ]], 
{EdgeForm[], 
              SurfaceColor[
	
                If[SphericalHarmonicY[2, 0, θ, φ] > 
                    0, 
	
                  If[Sin[3  φ] > 0, 
                    Rainbow[
                      Cos[positionList2[[k, 2, 2]]]\^2], 
                    RGBColor[1, 1, 1]], \ \ \ \ \ 
	\ If[
                    Sin[3  φ] > 0, 
                    Rainbow[
                      Cos[positionList2[[k, 2, 2]]]\^2], 
                    RGBColor[0, 0, 
                      0]]], 
\ \ \ \ \ \ \ \ \ 
	GrayLevel[ .8], 5]}, 
{θ, 
              0. , π}, {φ, 0. , 2  π}, 
            positionList2[[k, 1]], 
            positionList2[[k, 
              2]], 
PlotPoints -> {25, 15}]], 
{k, 1, Length[positionList2]}];\)\)

Show[
      Graphics3D[
        graphList2], 
LightSources -> {
{{1, 1, 1}, 
            GrayLevel[ .6]}, 
{{0, 1, 1}, 
            GrayLevel[ .6]}
}, Axes -> False, 
      ViewPoint -> {-2.000,  -7.381,  4.727}]