删除Axes3d(matplotlib)中的空白

2024-10-01 07:28:45 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在用一堆多边形绘制一个曲面。下面的绘图非常简单。在

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

我得到的图像如下。大的空白和微小的数字。我希望这个图形能覆盖大部分空间。 我怎么才能做到呢?在

enter image description here


Tags: thenameimportalphaplotasfigcell
2条回答

修改空白的几种方法:

  1. 减少轴内的空白。为此,可以使用以下方法修改xy和{}限制:

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

    fig.subplots_adjust(left=0, right=1, bottom=0, top=1)
    
  3. 最后,您可以在调用savefig时保存一部分数据。您可以使用bbox_incheskwarg修改此区域,方法是使用实际的Bbox,而不是将其设置为tight

例如,让我们考虑来自^{} gallery的图像。请注意,我已经更改了轴和图形的背景颜色,因此它们在下面的页面上显示得很清楚。在

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', axisbg='#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')

enter image description here

# 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')

enter image description here

# 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')

enter image description here

# 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')

enter image description here

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

还要注意,如果axes aspect设置为相等,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()

enter image description here

相关问题 更多 >