2016-12-19 58 views
0

我正在用多邊形羣繪製曲面。繪圖非常簡單,如下所示。刪除Axes3d中的空白(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 

我得到的圖像如下所示。與小圖的大白色空間。我想讓這個數字覆蓋大部分空間。 我該如何做到這一點?

enter image description here

+0

減少軸限制?例如'ax.set_xlim(-1.1 *半徑,1.1 *半徑)'等。 – tom

+0

沒有我使用的軸限制只適合繪製的形狀。所以這不是解決方案 –

+0

'fig.subplots_adjust(left = 0,right = 1,bottom = 0,top = 1)'將移除軸外的很多空白 – tom

回答

1

該圖邊距可以通過設置fig.subplots_adjust(top=1, bottom=0, left=0, right=1)降低。這可能或可能不夠,取決於實際數字。

另外請注意,如果axis方向設置爲相等,則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

1

幾種方法可以修改空白:

  1. 減少軸內的空白。要做到這一點,你可以使用修改xyz限制:

    ax.set_xlim() 
    ax.set_ylim() 
    ax.set_zlim() 
    
  2. 降低軸外的空白。要做到這一點,你可以使用:

    fig.subplots_adjust(left=0, right=1, bottom=0, top=1) 
    
  3. 最後,你可以只保存圖的一部分,當你調用savefig。您可以使用bbox_inches kwarg修改此區域,使用實際的Bbox而不是將其設置爲tight

例如,讓我們從matplotlib 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

​​

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