删除 Axes3d 中的空格(matplotlib)

had*_*i k 3 python matplotlib

我正在用一堆多边形绘制一个表面。绘图非常简单,如下所示。

def plotSurface(cell, numOfLayer, name=None, alpha = 0.5):
    #import the libraries
    from mpl_toolkits.mplot3d import Axes3D
    import matplotlib as mpl
    from mpl_toolkits.mplot3d.art3d import Poly3DCollection
    import numpy as np
    import matplotlib.pyplot as plt
    #limits of the plot
    radius = (numOfLayer>1)*(np.sqrt(3.)*(numOfLayer-1)-Length)+Length#the radius of circle to be projected on
    #plotting part
    fig = plt.figure(frameon=False,figsize=(12,10))
    ax = Axes3D(fig)
    ax.set_xlim((-2*radius,2*radius))
    ax.set_ylim((-2*radius,2*radius))
    ax.set_zlim((-0.5*radius,2*radius))
    ax.axis('off')
    #fig = plt.figure()
    #ax = fig.gca(projection='3d')
    ##iterating through the cell##
    for stuff happening here : verts are the polygon vertices
          #adding to 3d plot
          ax.add_collection3d(Poly3DCollection(verts,alpha = alpha))
    if name == None:#plot the figure
        plt.show()
    else:
        plt.savefig(name,bbox_inches='tight')
    return
Run Code Online (Sandbox Code Playgroud)

我得到的图像如下所示。巨大的空白与微小的身影。我希望图形覆盖大部分空间。我怎样才能做到这一点?

在此处输入图片说明

tmd*_*son 6

修改空格的几种方法:

  1. 减少轴内的空白。为此,您可以使用以下方法修改x,yz限制:

    ax.set_xlim()
    ax.set_ylim()
    ax.set_zlim()
    
    Run Code Online (Sandbox Code Playgroud)
  2. 减少轴外的空白。为此,您可以使用:

    fig.subplots_adjust(left=0, right=1, bottom=0, top=1)
    
    Run Code Online (Sandbox Code Playgroud)
  3. 最后,您可以在调用savefig. 您可以使用bbox_incheskwarg修改此区域,方法是使用实​​际值Bbox而不是将其设置为tight.

例如,让我们考虑一下matplotlib图库中的这张图片。请注意,我更改了轴和图形背景颜色,因此它们在下面的页面上清晰显示。

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

fig = plt.figure(figsize=(10,8))
# I added a pink axis background, just so its easy to see against the white page
ax = fig.add_subplot(111, projection='3d', facecolor='#FFAAAA')

u = np.linspace(0, 2 * np.pi, 100)
v = np.linspace(0, np.pi, 100)

x = 10 * np.outer(np.cos(u), np.sin(v))
y = 10 * np.outer(np.sin(u), np.sin(v))
z = 10 * np.outer(np.ones(np.size(u)), np.cos(v))
ax.plot_surface(x, y, z, rstride=4, cstride=4, color='b')

ax.axis('off')

# Save the original figure (using a grey background for the figure for clarity)
plt.savefig('3d_whitespace0.png', facecolor='#AAAAAA')
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

# Step 1 above: change the axes limits
ax.set_xlim(-8, 8)
ax.set_ylim(-8, 8)
ax.set_zlim(-8, 8)

plt.savefig('3d_whitespace1.png', facecolor='#AAAAAA')
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

# Step 2 above: change the subplot margins
fig.subplots_adjust(left=0, right=1, bottom=0, top=1)

plt.savefig('3d_whitespace2.png', facecolor='#AAAAAA')
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

# Step 3 above: save only a portion of the figure. Here we will cut one inch
# off each side of the figure, to change the 10in x 8in figure to 8in x 6in
bbox = fig.bbox_inches.from_bounds(1, 1, 8, 6)

plt.savefig('3d_whitespace3.png', bbox_inches=bbox, facecolor='#AAAAAA')
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明


Imp*_*est 3

可以通过设置减少图形边距fig.subplots_adjust(top=1, bottom=0, left=0, right=1)。这可能足够也可能不够,具体取决于实际数字。

另请注意,如果轴方面设置为相等,则figsize必须进行平方。(这里不是这种情况,但其他情况可能需要)。

最后转动的旋钮是减少轴限制。可以将它们设置为较小的值以减少对象周围的空白区域。例如,围绕原点绘制一个半径为 1 的球体,人们可能会想设置限制以使[-1,1]整个球体适合绘图。然而,这会在周围留下很多空白。减少限制[-0.57,0.57]将使球体很好地融入图形中。为了看到这种效果,我在下面的示例中将轴保持打开状态。

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

u = np.linspace(0, 2 * np.pi, 12)
v = np.linspace(0, np.pi,15)
x =  np.outer(np.cos(u), np.sin(v))
y =  np.outer(np.sin(u), np.sin(v))
z =  np.outer(np.ones(np.size(u)), np.cos(v))
F = np.sin(x)*y + z
F = (F-F.min())/(F-F.min()).max()

#Set colours and render
fig = plt.figure(figsize=(8,4))
fig.subplots_adjust(top=1, bottom=0, left=0, right=1, wspace=0)
ax = fig.add_subplot(121, projection='3d')
ax2 = fig.add_subplot(122, projection='3d')

# plotting a sphere with radius 1. 
# Naturally, setting the limits to 1 makes sense
ax.plot_surface(x,y,z,  rstride=1, cstride=1, facecolors=cm.jet(F), alpha=0.5)
ax.set_xlim(np.array([-1,1]))
ax.set_ylim(np.array([-1,1]))
ax.set_zlim(np.array([-1,1]))

# plotting a sphere with radius 1. 
# but now reducing the limits
ax2.plot_surface(x,y,z,  rstride=1, cstride=1, facecolors=cm.jet(1-F), alpha=0.5) 
ax2.set_xlim(np.array([-1,1])*.57)
ax2.set_ylim(np.array([-1,1])*.57)
ax2.set_zlim(np.array([-1,1])*.57)

#ax.axis('off') # turned on to see the effect. Turn off to have a nice image.
plt.show()
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述