> At the moment I am very fond of a particular
>function, SphericalPlot3D. There is a problem:
>
> It does not seem to have an option PlotStyle.
>Plot does have PlotStyle option via which I can
>set the line width of the graphic.
>
> What methods are there by which I can change the
>line width of SphericalPlot3D? At the moment I am
>changing the PostScript files manually. I have also
>tried the AbsoluteThickness[0.01] to no effect.
SphericalPlot3D is built on-top of ParametricPlot3D.
It plots a function defined in spherical coordinates.
The arguments and options it takes are passed on to
ParametricPlot3D which generates a Graphics3D object
which is displayed.
I presume that you are plotting a surface and you want
to change the weight of the edges of the polygons which
SphericalPlot3D draws. If you want to do something
the same mechanism applies.
There are quite a number of ways to do this. One could
define an option for SphericalPlot3D to do this and
make an amended version of the package. However probably
the simplest way to fix this is to make a function which
will redisplay a Graphics3D object after adding some
directives to change the appearance. This can be done
with the following function...
SetStyle[ Graphics3D[ obj_, opts___], style_] :=
Graphics3D[ {style, obj}, opts]
SetStyle[ Graphics3D[ obj_, opts___], style_List] :=
Graphics3D[ Append[ style, obj], opts]
It could be used as so...
p = SphericalPlot3D[ 1, {t,0,Pi}, {p,0,2Pi}]
Show[
SetStyle[ p, EdgeForm[ Thickness[ 0.01]]]
]
> In fact SphericalPlot3D[] missing a lot of
>options. For example it does not have an
>AxesOrigin (which Plot again has), by which I
>can specify the location of the Cartesian
>coordinate system. The Axes -> True gives me
>three lines which do not look like a cartesian
>coordinate system at all. A coordinate system
>immersed with the 3D graphic would be needed.
The axes which are drawn for the 3D graphics are similar
to Frame axes in 2D graphics. This means that they go around
the edges of the bounding box of the 3D primitives. You can
use the AxesEdge option to specify which edges of the box are
used. One of the advantages of having axes with tick marks and
labels which go around the edge of the 3D image is that this
ensures that the labels do not interfere with the objects which
are drawn. If you want to have simple line axes inside an
image this can be done. A function like this will work...
Options[ AddMyAxes] = {AxesOrigin -> {0,0,0}}
AddMyAxes[ g:Graphics3D[ obj_, opts___], opt1___] :=
Block[{down, up, orgin, axes},
{down, up} = Transpose[ FullOptions[ g, PlotRange]] ;
origin = AxesOrigin /. {opt1} /. Options[ Add3DAxes];
axes = Table[ Line[
{ReplacePart[ origin, Part[ down, i], i],
ReplacePart[ origin, Part[ up, i], i]}],
{i,3}] ;
Graphics3D[ {axes, obj}, opts]
]
then
Show[ AddMyAxes[ p]]
where p is a Graphics3D object, will display the visible parts of
three lines inside the bounding box.
Tom Wickham-Jones
WRI