Matplotlib 3D: Remove axis ticks & draw upper edge border?

classic Classic list List threaded Threaded
6 messages Options
Reply | Threaded
Open this post in threaded view
|

Matplotlib 3D: Remove axis ticks & draw upper edge border?

fosa
Hello,

I've been trying to no avail to use the settings that usually work with
matplotlib 2D.  I'd like to remove the 3D graph ticks, and extend the
darkened color edge to the upper sides as well.  As a bonus if someone knows
how to control the axis of rotation for a 3d animation, to effectively
control the centering, that would be a great help as well.

Here is a self contained code block that I've been hacking away at with a
dull knife:

import numpy as np
import matplotlib as mpl
from matplotlib import pyplot as plt
from matplotlib import animation
from mpl_toolkits.mplot3d import Axes3D

mpl.rcParams['ytick.color'] = 'white'
#mpl.rcParams['ytick.left'] = False

sample = np.random.random_integers(low=1,high=5, size=(10,3))

# Create a figure and a 3D Axes
fig = plt.figure(figsize=(5,5))

ax = Axes3D(fig)

#ax.w_xaxis.set_tick_params(color='white')

#ax.axes.tick_params
ax.axes.tick_params(bottom=False, color='blue')
##['size', 'width', 'color', 'tickdir', 'pad', 'labelsize',
##'labelcolor', 'zorder', 'gridOn', 'tick1On', 'tick2On',
##'label1On', 'label2On', 'length', 'direction', 'left', 'bottom',
##'right', 'top', 'labelleft', 'labelbottom',
##'labelright', 'labeltop', 'labelrotation']

colors = np.mean(sample[:, :], axis=1)

ax.scatter(sample[:,0], sample[:,1], sample[:,2],

           marker='o', s=20, c=colors, alpha=1)

ax.tick_params(color='red')
ax.spines['left'].set_color('green')

frame1 = plt.gca()
frame1.axes.xaxis.set_visible(False)
#frame1.axes.xaxis.axes.set_xticks([])
frame1.axes.xaxis.set_ticklabels([])
frame1.axes.yaxis.set_ticklabels([])
frame1.axes.zaxis.set_ticklabels([])
#frame1.axes.yaxis.set_tick_params(color='white')

And the image it generates:
<http://matplotlib.1069221.n5.nabble.com/file/t5138/3dSO.png>

Setting #frame1.axes.xaxis.axes.set_xticks([]) causes all the grid lines to
disappear, instead of just the ticks themselves.
Is it required to go into whatever is drawing/rendering and adjust the
length of the grid line? T_T





--
Sent from: http://matplotlib.1069221.n5.nabble.com/matplotlib-users-f3.html
_______________________________________________
Matplotlib-users mailing list
[hidden email]
https://mail.python.org/mailman/listinfo/matplotlib-users
Reply | Threaded
Open this post in threaded view
|

Re: Matplotlib 3D: Remove axis ticks & draw upper edge border?

Benjamin Root
Sorry, those features are just not possible with the current design. The code assumes that all rotations are done from the center. And the tick marks aren't handled the same way they are in 2D graphs, unfortunately. Also, the code has just three backing panels. It is possible to make one or more of them invisible, but you can't add more panels. In fact, you wouldn't want other panels to appear because it is assumed that these panels will always appear behind any other artists. Any other panels would run the risk of being composed incorrectly with the contents of the plot, creating "Escher effects" -- visual paradoxes. Nothing is stopping you, though, from putting in your own panel from a Poly3D or Patch3D object. In fact, you can just create a Patch artist and put it through the 2d to 3d converter function in mplot3d.art3d.

I would consider the current state of tick control to be buggy, and I agree that effort should be spent fixing it. Having the ability to specify an arbitrary point of rotation is an interesting feature and I wouldn't be opposed to a merge request adding that feature.


On Thu, Mar 1, 2018 at 8:30 AM, fosa <[hidden email]> wrote:
Hello,

I've been trying to no avail to use the settings that usually work with
matplotlib 2D.  I'd like to remove the 3D graph ticks, and extend the
darkened color edge to the upper sides as well.  As a bonus if someone knows
how to control the axis of rotation for a 3d animation, to effectively
control the centering, that would be a great help as well.

Here is a self contained code block that I've been hacking away at with a
dull knife:

import numpy as np
import matplotlib as mpl
from matplotlib import pyplot as plt
from matplotlib import animation
from mpl_toolkits.mplot3d import Axes3D

mpl.rcParams['ytick.color'] = 'white'
#mpl.rcParams['ytick.left'] = False

sample = np.random.random_integers(low=1,high=5, size=(10,3))

# Create a figure and a 3D Axes
fig = plt.figure(figsize=(5,5))

ax = Axes3D(fig)

#ax.w_xaxis.set_tick_params(color='white')

#ax.axes.tick_params
ax.axes.tick_params(bottom=False, color='blue')
##['size', 'width', 'color', 'tickdir', 'pad', 'labelsize',
##'labelcolor', 'zorder', 'gridOn', 'tick1On', 'tick2On',
##'label1On', 'label2On', 'length', 'direction', 'left', 'bottom',
##'right', 'top', 'labelleft', 'labelbottom',
##'labelright', 'labeltop', 'labelrotation']

colors = np.mean(sample[:, :], axis=1)

ax.scatter(sample[:,0], sample[:,1], sample[:,2],

           marker='o', s=20, c=colors, alpha=1)

ax.tick_params(color='red')
ax.spines['left'].set_color('green')

frame1 = plt.gca()
frame1.axes.xaxis.set_visible(False)
#frame1.axes.xaxis.axes.set_xticks([])
frame1.axes.xaxis.set_ticklabels([])
frame1.axes.yaxis.set_ticklabels([])
frame1.axes.zaxis.set_ticklabels([])
#frame1.axes.yaxis.set_tick_params(color='white')

And the image it generates:
<http://matplotlib.1069221.n5.nabble.com/file/t5138/3dSO.png>

Setting #frame1.axes.xaxis.axes.set_xticks([]) causes all the grid lines to
disappear, instead of just the ticks themselves.
Is it required to go into whatever is drawing/rendering and adjust the
length of the grid line? T_T





--
Sent from: http://matplotlib.1069221.n5.nabble.com/matplotlib-users-f3.html
_______________________________________________
Matplotlib-users mailing list
[hidden email]
https://mail.python.org/mailman/listinfo/matplotlib-users


_______________________________________________
Matplotlib-users mailing list
[hidden email]
https://mail.python.org/mailman/listinfo/matplotlib-users
Reply | Threaded
Open this post in threaded view
|

Re: Matplotlib 3D: Remove axis ticks & draw upper edge border?

Mike Kaufman-3
What I did as a workaround this is to modify the plot limits:

#########################################################################
#
#########################################################################
def equalize_plotlimits_3d(ax):

   xl = ax.get_xlim()
   yl = ax.get_ylim()
   zl = ax.get_zlim()

   xr = xl[1] - xl[0]
   yr = yl[1] - yl[0]
   zr = zl[1] - zl[0]

   xave = (xl[1] + xl[0])/2
   yave = (yl[1] + yl[0])/2
   zave = (zl[1] + zl[0])/2

   maxr = max([xr,yr,zr])

   ax.set_xlim(xave-maxr/2, xave+maxr/2)
   ax.set_ylim(yave-maxr/2, yave+maxr/2)
   ax.set_zlim(zave-maxr/2, zave+maxr/2)

   xl = ax.get_xlim()
   yl = ax.get_ylim()
   zl = ax.get_zlim()

   return [xl,yl,zl]

#########################################################################
#
#########################################################################
def pan(axis, shift, ax=None, dodraw=True):

   if not ax: ax = gca()

   which = dict(x=0,y=1,z=2)
   setter = [ax.set_xlim, ax.set_ylim, ax.set_zlim]
   getter = [ax.get_xlim, ax.get_ylim, ax.get_zlim]

   lim = getter[which[axis]]()
   lim[0] += shift
   lim[1] += shift

   setter[which[axis]](lim)
   if dodraw:
     draw()

def xpan(*args, **kwargs):
   pan('x', *args, **kwargs)
def ypan(*args, **kwargs):
   pan('y', *args, **kwargs)
def zpan(*args, **kwargs):
   pan('z', *args, **kwargs)

#########################################################################
#
#########################################################################
def zoom(scale, ax=None, dodraw=True):

   if not ax: ax = gca()

   xl = ax.get_xlim()
   yl = ax.get_ylim()
   zl = ax.get_zlim()

   xr = xl[1] - xl[0]
   yr = yl[1] - yl[0]
   zr = zl[1] - zl[0]

   xave = (xl[1] + xl[0])/2
   yave = (yl[1] + yl[0])/2
   zave = (zl[1] + zl[0])/2

   maxr = max([xr,yr,zr])

   ax.set_xlim(xave-maxr/2/scale, xave+maxr/2/scale)
   ax.set_ylim(yave-maxr/2/scale, yave+maxr/2/scale)
   ax.set_zlim(zave-maxr/2/scale, zave+maxr/2/scale)

   xl = ax.get_xlim()
   yl = ax.get_ylim()
   zl = ax.get_zlim()

   if dodraw:
     draw()


On 3/1/18 11:44 AM, Benjamin Root wrote:

> Sorry, those features are just not possible with the current design. The
> code assumes that all rotations are done from the center. And the tick
> marks aren't handled the same way they are in 2D graphs, unfortunately.
> Also, the code has just three backing panels. It is possible to make one
> or more of them invisible, but you can't add more panels. In fact, you
> wouldn't want other panels to appear because it is assumed that these
> panels will always appear behind any other artists. Any other panels
> would run the risk of being composed incorrectly with the contents of
> the plot, creating "Escher effects" -- visual paradoxes. Nothing is
> stopping you, though, from putting in your own panel from a Poly3D or
> Patch3D object. In fact, you can just create a Patch artist and put it
> through the 2d to 3d converter function in mplot3d.art3d.
>
> I would consider the current state of tick control to be buggy, and I
> agree that effort should be spent fixing it. Having the ability to
> specify an arbitrary point of rotation is an interesting feature and I
> wouldn't be opposed to a merge request adding that feature.
>
>
> On Thu, Mar 1, 2018 at 8:30 AM, fosa <[hidden email]
> <mailto:[hidden email]>> wrote:
>
>     Hello,
>
>     I've been trying to no avail to use the settings that usually work with
>     matplotlib 2D.  I'd like to remove the 3D graph ticks, and extend the
>     darkened color edge to the upper sides as well.  As a bonus if
>     someone knows
>     how to control the axis of rotation for a 3d animation, to effectively
>     control the centering, that would be a great help as well.
>
>     Here is a self contained code block that I've been hacking away at
>     with a
>     dull knife:
>
>     import numpy as np
>     import matplotlib as mpl
>     from matplotlib import pyplot as plt
>     from matplotlib import animation
>     from mpl_toolkits.mplot3d import Axes3D
>
>     mpl.rcParams['ytick.color'] = 'white'
>     #mpl.rcParams['ytick.left'] = False
>
>     sample = np.random.random_integers(low=1,high=5, size=(10,3))
>
>     # Create a figure and a 3D Axes
>     fig = plt.figure(figsize=(5,5))
>
>     ax = Axes3D(fig)
>
>     #ax.w_xaxis.set_tick_params(color='white')
>
>     #ax.axes.tick_params
>     ax.axes.tick_params(bottom=False, color='blue')
>     ##['size', 'width', 'color', 'tickdir', 'pad', 'labelsize',
>     ##'labelcolor', 'zorder', 'gridOn', 'tick1On', 'tick2On',
>     ##'label1On', 'label2On', 'length', 'direction', 'left', 'bottom',
>     ##'right', 'top', 'labelleft', 'labelbottom',
>     ##'labelright', 'labeltop', 'labelrotation']
>
>     colors = np.mean(sample[:, :], axis=1)
>
>     ax.scatter(sample[:,0], sample[:,1], sample[:,2],
>
>                 marker='o', s=20, c=colors, alpha=1)
>
>     ax.tick_params(color='red')
>     ax.spines['left'].set_color('green')
>
>     frame1 = plt.gca()
>     frame1.axes.xaxis.set_visible(False)
>     #frame1.axes.xaxis.axes.set_xticks([])
>     frame1.axes.xaxis.set_ticklabels([])
>     frame1.axes.yaxis.set_ticklabels([])
>     frame1.axes.zaxis.set_ticklabels([])
>     #frame1.axes.yaxis.set_tick_params(color='white')
>
>     And the image it generates:
>     <http://matplotlib.1069221.n5.nabble.com/file/t5138/3dSO.png
>     <http://matplotlib.1069221.n5.nabble.com/file/t5138/3dSO.png>>
>
>     Setting #frame1.axes.xaxis.axes.set_xticks([]) causes all the grid
>     lines to
>     disappear, instead of just the ticks themselves.
>     Is it required to go into whatever is drawing/rendering and adjust the
>     length of the grid line? T_T
>
>
>
>
>
>     --
>     Sent from:
>     http://matplotlib.1069221.n5.nabble.com/matplotlib-users-f3.html
>     <http://matplotlib.1069221.n5.nabble.com/matplotlib-users-f3.html>
>     _______________________________________________
>     Matplotlib-users mailing list
>     [hidden email] <mailto:[hidden email]>
>     https://mail.python.org/mailman/listinfo/matplotlib-users
>     <https://mail.python.org/mailman/listinfo/matplotlib-users>
>
>
>
>
> _______________________________________________
> Matplotlib-users mailing list
> [hidden email]
> https://mail.python.org/mailman/listinfo/matplotlib-users
>

_______________________________________________
Matplotlib-users mailing list
[hidden email]
https://mail.python.org/mailman/listinfo/matplotlib-users
Reply | Threaded
Open this post in threaded view
|

Re: Matplotlib 3D: Remove axis ticks & draw upper edge border?

fosa
In reply to this post by fosa
Hi Mike thanks for replying. I can't quite get your methods to work. Would
you mind posting a barebones example of a 3d plot with the ticks disabled?



--
Sent from: http://matplotlib.1069221.n5.nabble.com/matplotlib-users-f3.html
_______________________________________________
Matplotlib-users mailing list
[hidden email]
https://mail.python.org/mailman/listinfo/matplotlib-users
Reply | Threaded
Open this post in threaded view
|

filling

vincent_mathoscope
hi
i have a draw in black and white as a mosaic
i can get the coordinates of one point in each field af the mosaic
what i miss would be an option to "fill"
does such an option exist in Matplotlib ?

        ––––––––––––––––––––––––––
                  Vincent Douce
               :=: Mathoscope :=:
             http://mathoscope.xyz
                 06°13°11°07°26
          Bagnères de Bigorre 65200





_______________________________________________
Matplotlib-users mailing list
[hidden email]
https://mail.python.org/mailman/listinfo/matplotlib-users
        ––––––––––––––––––––––––––
                  Vincent Douce
               :=: Mathoscope :=:
             http://mathoscope.xyz
                 06°13°11°07°26
          Bagnères de Bigorre 65200
Reply | Threaded
Open this post in threaded view
|

Re: filling

Paul Hobson-2
Do you have an example image for reference? Can you share the code you've already written.

Matplotlib can draw full or hollow polygons that represent an area and use full or hollow markers that represent a point.

There is also the concept of a "span" that is boundless in one dimension, and constrained in the other:
https://matplotlib.org/gallery/api/span_regions.html#sphx-glr-gallery-api-span-regions-py


-paul

On Thu, Mar 8, 2018 at 8:29 AM, Vincent Douce Mathoscope <[hidden email]> wrote:
hi
i have a draw in black and white as a mosaic
i can get the coordinates of one point in each field af the mosaic
what i miss would be an option to "fill"
does such an option exist in Matplotlib ?

        ––––––––––––––––––––––––––
                  Vincent Douce
               :=: Mathoscope :=:
             http://mathoscope.xyz
                 06°13°11°07°26
          Bagnères de Bigorre 65200





_______________________________________________
Matplotlib-users mailing list
[hidden email]
https://mail.python.org/mailman/listinfo/matplotlib-users


_______________________________________________
Matplotlib-users mailing list
[hidden email]
https://mail.python.org/mailman/listinfo/matplotlib-users