Matplotlib 使用重复数据绘制曲面

Matplotlib 使用重复数据绘制曲面,matplotlib,plot,Matplotlib,Plot,我想绘制一个剖切面并以pdf格式保存。 我正在绘制满足某些方程的曲面。为了有更多的“美丽”的图片,我正在“切割”超出情节界限的部分。基本上,我是通过将边界外的点映射到边界内的点来实现的,因此我在相应的数组中生成重复数据。当我尝试以.pdf格式保存此曲面时(这是我想要的格式),我收到以下错误: 只能以PDF格式输出有限的数字 我假设在尝试在相等点之间生成曲面时,此错误正是来自matplotlib。但是,我可以保存在.png中,这是我不喜欢的。有解决办法吗?在这里,我包括一个评论和工作的例子 imp

我想绘制一个剖切面并以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)
导入matplotlib.pyplot作为plt
从mpl_toolkits.mplot3d导入Axes3D
将numpy作为np导入
#设置图形的大小和一些参数
f_宽度=2.5
f_高度=((np.sqrt(5)-1)/2)*f_宽度
fig_尺寸=[f_宽度,f_高度]
图=plt.图(num=1,figsize=fig_size);
ax=Axes3D(图)
###---创建网格--###
x=np.linspace(-2,2.0,50)
b=np.linspace(-3,3,50)
B、 X=np.meshgrid(B,X)
### ---------------------- ###
###---创建曲面--###
a=-2
C=-X**4-a*X**2-B*X
### ---------------------- ###
r、 c=np.形状(c)
##--切割表面。。对未剪切版本的所有这些进行注释--##
对于范围(r)内的j:
对于范围(c)中的k:
如果C[j][k]0:
C[j][k]=-2
根=np.根([1,0,a,B[j][k],C[j][k])
根=根[roots.imag==0]
X[j][k]=np.real(根[roots.real>0])

如果C[j][k],您可以通过一些随机噪声修改切割边上X的结果。在ax.plot_surface
之前添加以下两行:

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

欢迎来到SO!这看起来正是正确的问题。太好了@HYRY。。。所以,我只是想了解。。。在点X,C,其中C=-2,你将一些1e-15阶的小术语添加到X中,因此在实践中(和matplotlib中)它们并不都是相同的点,但在眼睛看来它们是?谢谢!