|
From: Rene B. <sup...@gm...> - 2011-02-23 22:21:13
|
Hi all,
I'm making a 3d plot using Axes3D (plot_surface) and I want to get rid
of the 3d gray box that surrounds the object so that only the object
shows up. Is there a way to do it? After creating my Axes3D instance, I
can't find much else than methods to change the x,y,z labels and axis
limits.
I found a hack using myAXINFO to change the color of each "panel" but
the axis line still remains there.
Ideally, there would be methods to access the color, visibility, etc.,
of these elements. Maybe it's somewhere I can't find them...
Here's a code snippet derived from one of the website's examples:
#############
from mpl_toolkits.mplot3d import Axes3D
from matplotlib import cm
from matplotlib.ticker import LinearLocator, FixedLocator,
FormatStrFormatter
import matplotlib.pyplot as plt
import numpy as np
fig = plt.figure()
ax = fig.gca(projection='3d')
X = np.arange(-5, 5, 0.25)
Y = np.arange(-5, 5, 0.25)
X, Y = np.meshgrid(X, Y)
R = np.sqrt(X**2 + Y**2)
Z = np.sin(R)
surf = ax.plot_surface(X, Y, Z, rstride=1, cstride=1, cmap=cm.jet,
linewidth=0, antialiased=False)
ax.set_zlim3d(-1.01, 1.01)
# The following makes the panels white, but the axis line remains there
myAXINFO = { 'x': {'i': 0, 'tickdir': 1, 'juggled': (1, 0, 2), 'color':
(1.0, 1.0, 1.0, 1.0, 1.0)}, 'y': {'i': 1, 'tickdir': 0, 'juggled': (0,
1, 2), 'color': (1.0, 1.0, 1.0, 1.0, 1.0)}, 'z': {'i': 2, 'tickdir': 0,
'juggled': (0, 2, 1), 'color': (1.0, 1.0, 1.0, 1.0, 1.0)} }
ax.w_zaxis._AXINFO = myAXINFO
ax.w_yaxis._AXINFO = myAXINFO
ax.w_xaxis._AXINFO = myAXINFO
plt.show()
#############
Thanks!
Rene
|
|
From: Benjamin R. <ben...@ou...> - 2011-02-23 22:34:08
|
On Wed, Feb 23, 2011 at 4:19 PM, Rene Breton <sup...@gm...>wrote:
> Hi all,
>
> I'm making a 3d plot using Axes3D (plot_surface) and I want to get rid
> of the 3d gray box that surrounds the object so that only the object
> shows up. Is there a way to do it? After creating my Axes3D instance, I
> can't find much else than methods to change the x,y,z labels and axis
> limits.
>
> I found a hack using myAXINFO to change the color of each "panel" but
> the axis line still remains there.
>
> Ideally, there would be methods to access the color, visibility, etc.,
> of these elements. Maybe it's somewhere I can't find them...
>
>
> Here's a code snippet derived from one of the website's examples:
>
> #############
> from mpl_toolkits.mplot3d import Axes3D
> from matplotlib import cm
> from matplotlib.ticker import LinearLocator, FixedLocator,
> FormatStrFormatter
> import matplotlib.pyplot as plt
> import numpy as np
>
> fig = plt.figure()
> ax = fig.gca(projection='3d')
> X = np.arange(-5, 5, 0.25)
> Y = np.arange(-5, 5, 0.25)
> X, Y = np.meshgrid(X, Y)
> R = np.sqrt(X**2 + Y**2)
> Z = np.sin(R)
> surf = ax.plot_surface(X, Y, Z, rstride=1, cstride=1, cmap=cm.jet,
> linewidth=0, antialiased=False)
> ax.set_zlim3d(-1.01, 1.01)
>
> # The following makes the panels white, but the axis line remains there
> myAXINFO = { 'x': {'i': 0, 'tickdir': 1, 'juggled': (1, 0, 2), 'color':
> (1.0, 1.0, 1.0, 1.0, 1.0)}, 'y': {'i': 1, 'tickdir': 0, 'juggled': (0,
> 1, 2), 'color': (1.0, 1.0, 1.0, 1.0, 1.0)}, 'z': {'i': 2, 'tickdir': 0,
> 'juggled': (0, 2, 1), 'color': (1.0, 1.0, 1.0, 1.0, 1.0)} }
> ax.w_zaxis._AXINFO = myAXINFO
> ax.w_yaxis._AXINFO = myAXINFO
> ax.w_xaxis._AXINFO = myAXINFO
>
> plt.show()
> #############
>
>
> Thanks!
>
>
> Rene
>
>
>
Rene,
Unfortunately, you have stumbled upon one of the ugliness of the mplot3d
implementation. I am hoping to have more control available for the next
release. But right now, there is no way to turn off the axes spines
(because they aren't implemented as spines). If you really want to dig into
the source code, you could change the color argument to the Line2D call in
the init3d() method in matplotlib/lib/mpl_toolkits/axis3d.py
I am sorry I can not be more helpful.
Ben Root
|
|
From: Rene B. <sup...@gm...> - 2011-02-23 22:54:55
|
Thanks much for the quick answer Ben!
At least now I know it doesn't exist, yet. I might dig into the source
code to change the color as you suggest. As a workaround, maybe I will
simply tweak the .ps output in Adobe Illustrator; should be easy enough
to remove such thing.
By the way, I'm very glad you (and people) took over the mplot3d. I
really think that 3D plotting was the number one missing thing in
Matplotlib and Python more generally. (mayavi2 is way to complicated and
clunky for what most people need)
If I may make another suggestion, besides getting more control over the
axes spines, it would be to allow the axes rendering to "mix" multiple
plot objects. Let's say one plots a sphere and a cylinder (like a rod)
that goes through the sphere and get the part of the cylinder that lies
inside the sphere to be hidden. Of course, I realize it might not be
trivial to do, depending exactly how plots are rendered.
Cheers,
Rene
On 11-02-23 05:33 PM, Benjamin Root wrote:
> On Wed, Feb 23, 2011 at 4:19 PM, Rene Breton <sup...@gm...
> <mailto:sup...@gm...>> wrote:
>
> Hi all,
>
> I'm making a 3d plot using Axes3D (plot_surface) and I want to get rid
> of the 3d gray box that surrounds the object so that only the object
> shows up. Is there a way to do it? After creating my Axes3D instance, I
> can't find much else than methods to change the x,y,z labels and axis
> limits.
>
> I found a hack using myAXINFO to change the color of each "panel" but
> the axis line still remains there.
>
> Ideally, there would be methods to access the color, visibility, etc.,
> of these elements. Maybe it's somewhere I can't find them...
>
>
> Here's a code snippet derived from one of the website's examples:
>
> #############
> from mpl_toolkits.mplot3d import Axes3D
> from matplotlib import cm
> from matplotlib.ticker import LinearLocator, FixedLocator,
> FormatStrFormatter
> import matplotlib.pyplot as plt
> import numpy as np
>
> fig = plt.figure()
> ax = fig.gca(projection='3d')
> X = np.arange(-5, 5, 0.25)
> Y = np.arange(-5, 5, 0.25)
> X, Y = np.meshgrid(X, Y)
> R = np.sqrt(X**2 + Y**2)
> Z = np.sin(R)
> surf = ax.plot_surface(X, Y, Z, rstride=1, cstride=1, cmap=cm.jet,
> linewidth=0, antialiased=False)
> ax.set_zlim3d(-1.01, 1.01)
>
> # The following makes the panels white, but the axis line remains there
> myAXINFO = { 'x': {'i': 0, 'tickdir': 1, 'juggled': (1, 0, 2), 'color':
> (1.0, 1.0, 1.0, 1.0, 1.0)}, 'y': {'i': 1, 'tickdir': 0, 'juggled': (0,
> 1, 2), 'color': (1.0, 1.0, 1.0, 1.0, 1.0)}, 'z': {'i': 2, 'tickdir': 0,
> 'juggled': (0, 2, 1), 'color': (1.0, 1.0, 1.0, 1.0, 1.0)} }
> ax.w_zaxis._AXINFO = myAXINFO
> ax.w_yaxis._AXINFO = myAXINFO
> ax.w_xaxis._AXINFO = myAXINFO
>
> plt.show()
> #############
>
>
> Thanks!
>
>
> Rene
>
>
>
> Rene,
>
> Unfortunately, you have stumbled upon one of the ugliness of the mplot3d
> implementation. I am hoping to have more control available for the next
> release. But right now, there is no way to turn off the axes spines
> (because they aren't implemented as spines). If you really want to dig
> into the source code, you could change the color argument to the Line2D
> call in the init3d() method in matplotlib/lib/mpl_toolkits/axis3d.py
>
> I am sorry I can not be more helpful.
> Ben Root
>
|
|
From: Benjamin R. <ben...@ou...> - 2011-02-24 00:28:27
|
On Wed, Feb 23, 2011 at 4:52 PM, Rene Breton <sup...@gm...>wrote: > Thanks much for the quick answer Ben! > > At least now I know it doesn't exist, yet. I might dig into the source > code to change the color as you suggest. As a workaround, maybe I will > simply tweak the .ps output in Adobe Illustrator; should be easy enough > to remove such thing. > Another issue may be the tickmarks, which are made separately in another segment of code. > > By the way, I'm very glad you (and people) took over the mplot3d. I > really think that 3D plotting was the number one missing thing in > Matplotlib and Python more generally. (mayavi2 is way to complicated and > clunky for what most people need) > > Thank you for your vote of confidence. This is exactly the intent of mplot3d, which is to allow for the possibility of basic 3d plotting features without the need to go "all-in" to a major 3d plotting system. We are still a long way from what I envision for mplot3d. > If I may make another suggestion, besides getting more control over the > axes spines, it would be to allow the axes rendering to "mix" multiple > plot objects. Let's say one plots a sphere and a cylinder (like a rod) > that goes through the sphere and get the part of the cylinder that lies > inside the sphere to be hidden. Of course, I realize it might not be > trivial to do, depending exactly how plots are rendered. > > You are not the first to request this, and you will not be the last. Unfortunately, it is an intractable problem that can never be completely solved by the 2d rendering framework employed by matplotlib. If/When matplotlib gains an opengl backend, this problem will be revisited. Please do continue to feel free to continue commenting on mplot3d and how you think it can be better. And, as always, patches are welcome! Ben Root |