Python 调整三维Matplotlib图形上的网格线
我正在准备演示,我有一些3D matplotlib图形的示例。但是,网格线太轻,无法在投影图像上看到。 我尝试使用适用于二维图形的栅格方法:Python 调整三维Matplotlib图形上的网格线,python,matplotlib,Python,Matplotlib,我正在准备演示,我有一些3D matplotlib图形的示例。但是,网格线太轻,无法在投影图像上看到。 我尝试使用适用于二维图形的栅格方法: 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
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')
ax.grid(linewidth=20)
但这似乎不适用于3D图形。有什么建议吗?不幸的是,这似乎没有被公开。查看源代码,关键的内部变量是call
\u AXINFO
,我们可以通过仔细的子类化来覆盖它
在创建图形后添加此代码,并使用dictcustom_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)
这是最糟糕的猴子补丁,不应该依赖它来为以后的版本工作。
修复面颜色比网格线更容易,因为这需要覆盖一个\uuuu init\uuuu
方法,尽管这需要更多的工作才能完成
向最终用户公开这一点似乎并不困难,因此我可以想象,这可能会在以后的版本中得到修复。如果您不介意所有线条都加厚,那么您可以调整默认的rc设置 给出一个图表,例如: 我们可以补充:
import matplotlib as mpl
mpl.rcParams['lines.linewidth'] = 2
要增加所有行的默认线宽,请给出以下结果:
或者,如果您觉得这看起来很难看,您可以使用:
ax.w_xaxis.gridlines.set_lw(3.0)
ax.w_yaxis.gridlines.set_lw(3.0)
ax.w_zaxis.gridlines.set_lw(3.0)
要将每个轴的线宽调整为3.0,请生成:
为了更新颜色,使网格线真正弹出,您可以添加:
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)}})
产生:
这些方法非常粗糙,但据我所知,没有更简单的方法来实现这些结果!!希望这有帮助;如果您需要任何进一步的帮助,请告诉我 如果要使网格背景变亮,可以使用Axes3DSubplot对象将窗格颜色设置为更亮(例如:白色),如下所示
ax.w_xaxis.pane.set_color('w');
ax.w_yaxis.pane.set_color('w');
ax.w_zaxis.pane.set_color('w');
或者为了进一步突出显示网格线,可以更新绘图的网格颜色参数
plt.rcParams['grid.color'] = "black"
只需使用此选项更改线宽:
plt.rcParams['grid.linewidth'] = 2
绘制图形的完整脚本:
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
@JudoWill-如果这个答案解决了你的问题,你应该接受它!在matplotlib版本3.1.1中,这对我不起作用。看起来现在可以执行ax.w_xaxis.plane.set_color((1,0,0));ax.w_xaxis.plane.set_alpha(0.5)。看起来它忽略了set_color中的alpha通道,但使用set_alpha中的通道。