我正在用一堆多边形绘制一个表面。绘图非常简单,如下所示。
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)
我得到的图像如下所示。巨大的空白与微小的身影。我希望图形覆盖大部分空间。我怎样才能做到这一点?
修改空格的几种方法:
减少轴内的空白。为此,您可以使用以下方法修改x,y和z限制:
ax.set_xlim()
ax.set_ylim()
ax.set_zlim()
Run Code Online (Sandbox Code Playgroud)
减少轴外的空白。为此,您可以使用:
fig.subplots_adjust(left=0, right=1, bottom=0, top=1)
Run Code Online (Sandbox Code Playgroud)
最后,您可以在调用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)
可以通过设置减少图形边距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)
| 归档时间: |
|
| 查看次数: |
4760 次 |
| 最近记录: |