我想绘制一个截断曲面并以pdf格式保存。
我正在绘制满足某些方程的曲面。为了拥有更多的美丽"图片我是"切割"离开地块边界的表面部分。我基本上是通过将边界外的点映射到边界中的点来实现这一点,因此我在相应的数组中生成重复数据。当我尝试以.pdf格式(这是我想要的)保存这些表面时,我收到以下错误:
只能在PDF中输出有限数字
我假设这个错误恰好来自matplotlib,当试图在相等点之间生成一个表面时。但是,我可以保存.png,我不喜欢。这有解决方法吗?这里我包括一个评论和工作的例子。
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import numpy as np
#Set the size of the figures and some parameters
f_width=2.5
f_height=((np.sqrt(5)-1)/2)*f_width
fig_size = [f_width,f_height]
fig = plt.figure(num=1, figsize=fig_size);
ax = Axes3D(fig)
### --- CREATE THE MESH --- ###
x = np.linspace(-2,2.0,50)
b = np.linspace(-3,3,50)
B,X = np.meshgrid(b,x)
### ---------------------- ###
### --- CREATE SURFACE --- ###
a = -2
C = -X**4 - a*X**2 - B*X
### ---------------------- ###
r,c = np.shape(C)
## -- CUT THE SURFACE .. comment all this for the uncut version -- ##
for j in range(r):
for k in range(c):
if C[j][k]<-2 and X[j][k]>0:
C[j][k] =-2
roots = np.roots([1,0,a,B[j][k],C[j][k] ])
roots = roots[roots.imag==0]
X[j][k] = np.real(roots[roots.real>0])
if C[j][k]<-2 and X[j][k]<0:
C[j][k] = -2
roots = np.roots([1,0,a,B[j][k],C[j][k] ])
roots = roots[roots.imag==0]
X[j][k] = np.real(roots[roots.real<0])
## ------------------------- end of cut -------------------------- ##
## -- PLOT THE SURFACE -- ##
ax.plot_surface(C,B,X,rstride = 1, alpha=0.5 ,
cstride = 1, color = '0.5',linewidth = 0.,
antialiased = True,zorder=0.5)
### --- CONFIGURE AXES --- ###
ax.xaxis.set_ticks([])
ax.yaxis.set_ticks([])
ax.zaxis.set_ticks([])
ax.set_xlim3d(-2, 4)
ax.set_ylim3d(-3,3)
ax.set_zlim3d(-3,2)
ax.set_xlabel(r'$c$')
ax.set_ylabel(r'$b$')
ax.set_zlabel(r'$x$')
ax.view_init(15,15)
### ---------------------- ###
#plt.savefig('figure.pdf')
plt.savefig('figure.png',dpi=300)
答案 0 :(得分:1)
您可以通过一些随机噪声修改切割边缘处的X的结果。在ax.plot_surface
之前添加以下两行:
mask = C == -2
X[mask] += np.random.normal(scale=1e-5, size=np.sum(mask))