2013-05-07 61 views
2

我想繪製一個截斷曲面並保存爲pdf格式。用重複的數據繪製曲面

我正在繪製滿足某些方程的曲面。爲了獲得更多「美麗」的照片,我正在「切割」離開劇情區域的表面上的部分。我這樣做基本上是通過將邊界外的點映射到邊界中的點,所以我在相應的陣列中生成重複的數據。當我試圖挽救這個表面.pdf格式(這是我想什麼),我收到以下錯誤:

Can only output finite numbers in 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

歡迎來到SO!這看起來像是正確的問題。 – tacaswell 2013-05-07 16:15:34

回答

1

您可以通過一些隨機噪聲修改X在切割邊緣處的結果。在ax.plot_surface之前加入以下兩行:

mask = C == -2 
X[mask] += np.random.normal(scale=1e-5, size=np.sum(mask)) 
+0

大@HYRY! ...所以,只是爲了理解......在X = C處,C = -2,你在X中增加了一些小項1e-15,所以在實踐中(和matplotlib)它們並不是全部相同的點,但他們的眼睛?非常感謝! – PepeToro 2013-05-08 07:24:38

+0

這是一個討厭的把戲,我喜歡它,非常好:) – user2820579 2014-10-23 22:22:26