I\'m getting ready for a presentation and I have some example figures of 3D matplotlib figures. However, the gridlines are too light to see on the projected images.
If you don't mind having all the lines thicker then you could adjust the default rc settings.
Given a graph such as:
We can add:
import matplotlib as mpl
mpl.rcParams['lines.linewidth'] = 2
To increase the default line width of all lines, giving a result of:
Alternatively, if you feel this looks ugly, you could use:
ax.w_xaxis.gridlines.set_lw(3.0)
ax.w_yaxis.gridlines.set_lw(3.0)
ax.w_zaxis.gridlines.set_lw(3.0)
to adjust the line width of each axis to 3.0, producing:
In order to update the colour, so the grid-lines really pop, you could add:
ax.w_xaxis._axinfo.update({'grid' : {'color': (0, 0, 0, 1)}})
ax.w_yaxis._axinfo.update({'grid' : {'color': (0, 0, 0, 1)}})
ax.w_zaxis._axinfo.update({'grid' : {'color': (0, 0, 0, 1)}})
Which produces:
The methods are pretty hacky, but as far as I am aware there is no simpler way of achieving these results!! Hope this helps; let me know if you require any further assistance!
If to lighten the background of grid, can use setting the pane color more light (eg:white) using Axes3DSubplot object as below.
ax.w_xaxis.pane.set_color('w');
ax.w_yaxis.pane.set_color('w');
ax.w_zaxis.pane.set_color('w');
Or else to highlight the grid lines further, can updated grid color parameter of plot.
plt.rcParams['grid.color'] = "black"
Unfortunately this doesn't seem to be exposed. Looking over the source, the key internal variable is call _AXINFO
which we can override by careful subclassing.
Add this code after your figure is created, and style it with the dict custom_AXINFO
:
from mpl_toolkits.mplot3d import Axes3D
import mpl_toolkits.mplot3d.axis3d as axis3d
# New axis settings
custom_AXINFO = {
'x': {'i': 0, 'tickdir': 1, 'juggled': (1, 0, 2),
'color': (0.00, 0.00, 0.25, .75)},
'y': {'i': 1, 'tickdir': 0, 'juggled': (0, 1, 2),
'color': (0.20, 0.90, 0.90, 0.25)},
'z': {'i': 2, 'tickdir': 0, 'juggled': (0, 2, 1),
'color': (0.925, 0.125, 0.90, 0.25)},}
class custom_XAxis(axis3d.Axis):
_AXINFO = custom_AXINFO
class custom_YAxis(axis3d.Axis):
_AXINFO = custom_AXINFO
class custom_ZAxis(axis3d.Axis):
_AXINFO = custom_AXINFO
class custom_Axes3D(Axes3D):
def _init_axis(self):
'''Init 3D axes; overrides creation of regular X/Y axes'''
self.w_xaxis = custom_XAxis('x', self.xy_viewLim.intervalx,
self.xy_dataLim.intervalx, self)
self.xaxis = self.w_xaxis
self.w_yaxis = custom_YAxis('y', self.xy_viewLim.intervaly,
self.xy_dataLim.intervaly, self)
self.yaxis = self.w_yaxis
self.w_zaxis = custom_ZAxis('z', self.zz_viewLim.intervalx,
self.zz_dataLim.intervalx, self)
self.zaxis = self.w_zaxis
for ax in self.xaxis, self.yaxis, self.zaxis:
ax.init3d()
# The rest of your code below, note the call to our new custom_Axes3D
points = (5*np.random.randn(3, 50)+np.tile(np.arange(1,51), (3, 1))).transpose()
fig = plt.figure(figsize = (10,10))
ax = custom_Axes3D(fig)
This is monkey-patching at it's worst, and should not be relied upon to work for later versions.
Fixing the facecolors was easier than the grid lines, as this requires an override of one of the __init__
methods, though it could be done with more work.
It does not seem difficult to expose this to the end user, and as such I can imagine that this may be fixed in later versions.
Just use this to change the linewidth:
plt.rcParams['grid.linewidth'] = 2
Full scripts to plot the figure:
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
points = (5*np.random.randn(3, 50)+np.tile(np.arange(1,51), (3, 1))).transpose()
fig = plt.figure(figsize = (10,10))
ax = fig.add_subplot(111, projection='3d')
ax.scatter(points[:,0], points[:,1], points[:,2])
#ax.view_init(elev=0., azim=0)
ax.set_ylim([0, 60])
ax.set_zlim([0, 60])
ax.set_xlim([0, 60])
ax.set_zlabel('Cytokine')
ax.set_ylabel('Parameter')
plt.rcParams['grid.linewidth'] = 4 # change linwidth
plt.rcParams['grid.color'] = "black" # change color