调整3D Matplotlib图形中的网格线

9

我正在为一次演示做准备,需要展示一些3D matplotlib图形的示例。然而,在投影的图片上,网格线太淡了,无法看清。

example 3D image

我尝试使用适用于2D图形的网格方法:

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图形无效。有什么建议吗?
4个回答

16

如果您不介意所有的线条都变粗,您可以调整默认的 rc 设置。

例如给定以下图形:

enter image description here

我们可以添加:

import matplotlib as mpl
mpl.rcParams['lines.linewidth'] = 2

如果您想增加所有线条的默认线宽,则会得到以下结果:

enter image description here

或者,如果您认为这看起来很丑,您可以使用:

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,输出:

enter image description here

为了更新颜色,使得网格线更加醒目,您可以添加:

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)}})

这样会产生:

在此输入图片描述

这些方法相当不正式,但据我所知,没有更简单的方法来实现这些结果!希望这可以帮到你;如果需要进一步协助,请告诉我!


@JudoWill - 如果这个答案解决了你的问题,你应该接受它! - Jamie
在matplotlib版本3.1.1中,这对我不起作用。 - Kappie001

3

很遗憾,这似乎没有暴露出来。查看源代码,关键的内部变量是调用_AXINFO,我们可以通过仔细的子类化来覆盖它。

enter image description here

在创建图形后添加此代码,并使用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)

这是最糟糕的猴子补丁,不应依赖于后续版本的工作。

修复面颜色比网格线更容易,因为这需要覆盖其中一个__init__方法,虽然可以通过更多的工作来完成。

似乎很容易将其公开给最终用户,因此我可以想象这可能会在以后的版本中修复。


看起来现在你可以执行ax.w_xaxis.plane.set_color((1,0,0)); ax.w_xaxis.plane.set_alpha(0.5)。看起来它忽略了set_color中的alpha通道,但使用了set_alpha中的alpha通道。 - Ben

1

只需使用此功能更改线宽:

plt.rcParams['grid.linewidth'] = 2

plotted by the code below:

绘制该图形的完整脚本:

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

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"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接