Delete axis fields in 3D graphics

I spent the last few days trying to find a way to remove tiny fields from the axes in a 3D plot. I tried ax.margins(0) and ax.autoscale_view('tight') and other approaches, but these small fields still exist. In particular, I do not like that the histograms of the bar are elevated, i.e. Their bottom is not at level zero - see an example image.

unwanted margins on all axes

In gnuplot, I would use "set xyplane at 0". In matplotlib, since there are fields on both sides on each axis, it would be great to control each of them.

Edit: The HYRY solution below works well, but the "X" axis gets the grid line drawn above it at Y = 0:

strange axis

+8
python matplotlib axes margins
source share
2 answers

There is no property or method that can modify these fields. You need to fix the source code. Here is an example:

 from mpl_toolkits.mplot3d import Axes3D import matplotlib.pyplot as plt import numpy as np ###patch start### from mpl_toolkits.mplot3d.axis3d import Axis if not hasattr(Axis, "_get_coord_info_old"): def _get_coord_info_new(self, renderer): mins, maxs, centers, deltas, tc, highs = self._get_coord_info_old(renderer) mins += deltas / 4 maxs -= deltas / 4 return mins, maxs, centers, deltas, tc, highs Axis._get_coord_info_old = Axis._get_coord_info Axis._get_coord_info = _get_coord_info_new ###patch end### fig = plt.figure() ax = fig.add_subplot(111, projection='3d') for c, z in zip(['r', 'g', 'b', 'y'], [30, 20, 10, 0]): xs = np.arange(20) ys = np.random.rand(20) # You can provide either a single color or an array. To demonstrate this, # the first bar of each set will be colored cyan. cs = [c] * len(xs) cs[0] = 'c' ax.bar(xs, ys, zs=z, zdir='y', color=cs, alpha=0.8) ax.set_xlabel('X') ax.set_ylabel('Y') ax.set_zlabel('Z') plt.show() 

Result:

enter image description here

Edit

To change the color of the grid lines:

 for axis in (ax.xaxis, ax.yaxis, ax.zaxis): axis._axinfo['grid']['color'] = 0.7, 1.0, 0.7, 1.0 

Edit2

Set X and Y lim:

 ax.set_ylim3d(-1, 31) ax.set_xlim3d(-1, 21) 
+6
source share

I had to slightly correct the decision, because in my case the x and y axes (but not z) had an extra margin, which when printing mins, maxs, deltas turned out to be deltas * 6.0/11 . Here is an updated patch that worked well in my case.

 ###patch start### from mpl_toolkits.mplot3d.axis3d import Axis def _get_coord_info_new(self, renderer): mins, maxs, cs, deltas, tc, highs = self._get_coord_info_old(renderer) correction = deltas * [1.0/4 + 6.0/11, 1.0/4 + 6.0/11, 1.0/4] mins += correction maxs -= correction return mins, maxs, cs, deltas, tc, highs if not hasattr(Axis, "_get_coord_info_old"): Axis._get_coord_info_old = Axis._get_coord_info Axis._get_coord_info = _get_coord_info_new ###patch end### 

(I also changed the fix logic a bit, so editing a function and reloading its module now works as expected in Jupyter.)

0
source share

All Articles