我已经阅读了一些我可以在这里或其他地方找到的问题。我使用 stackoverflow 上提供的其他问题编写了代码,但有时它仍无效。可能会出现三种类型的问题。我先在这里编写代码,然后列出问题:
from matplotlib.mlab import PCA
from mpl_toolkits.mplot3d import Axes3D
import numpy as np
from matplotlib import pyplot as plt
fig=plt.figure()
ax=plt.subplot(111,projection='3d')
sample=np.asarray(sample)
result=PCA(sample)
hist, xedges, yedges =np.histogram2d(result.Y[:,0],result.Y[:,1])
x_data, y_data = np.meshgrid( np.arange(hist.shape[1]),np.arange(hist.shape[0]) )
x_data = x_data.flatten()
y_data = y_data.flatten()
z_data = hist.flatten()
ax.bar3d( x_data,y_data,np.zeros(len(z_data)),1, 1, z_data )
fig.tight_layout()
fig.savefig('3Dhist.eps')
plt.show()
1-第一个问题是以下错误:
LinAlgError: SVD did not converge
97
98 def _raise_linalgerror_svd_nonconvergence(err, flag):
---> 99 raise LinAlgError("SVD did not converge")
100
101 def get_linalg_error_extobj(callback):
LinAlgError: SVD did not converge
当我的所有矢量共享一个相等的坐标时它会上升,即它们已经位于同一平面上。显然PCA仍然可以有一个独特的答案,但它给出了上述错误。要测试它,您可以将样本设置为:
sample=[[ 0., 0.2, 0. ],
[ 0.4, 0.2, 0. ],
[ 0.4, 0.4, 0. ],
[ 0., 0.2, 0. ],
[ 0.6, 0.2, 0. ]]
2- (半解决:请参阅答案部分。)第二个问题是以下警告:
/Users/****/Library/Enthought/Canopy_64bit/User/lib/python2.7/site-packages/mpl_toolkits/mplot3d/axes3d.py:1673: RuntimeWarning: invalid value encountered in divide
for n in normals])
/Users/****/Library/Enthought/Canopy_64bit/User/lib/python2.7/site-packages/matplotlib/colors.py:394: RuntimeWarning: invalid value encountered in greater
if (c.ravel() > 1).any() or (c.ravel() < 0).any():
/Users/****/Library/Enthought/Canopy_64bit/User/lib/python2.7/site-packages/matplotlib/colors.py:394: RuntimeWarning: invalid value encountered in less
if (c.ravel() > 1).any() or (c.ravel() < 0).any():
我不知道这个警告的原因,但这通常会在我从我的发行版中生成的大样本上升。
3-3问题是我无法以.png
之外的任何其他格式保存它,否则它无效。澄清我使用的数组是numpy.float64
。
答案 0 :(得分:0)
我已经为感兴趣的人找到了第二期的答案。似乎matplotlib中的3D绘图存在严重问题。你可以在这里查看: matplotlib bar3d clipping problems