Python 保存pdf时出现matplotlib错误

Python 保存pdf时出现matplotlib错误,python,matplotlib,scikit-learn,Python,Matplotlib,Scikit Learn,我有以下python代码: import numpy as np import sklearn as sk import pandas as pd import scipy as sp import matplotlib.pyplot as plt import sys from sklearn.decomposition import PCA from sklearn.svm import OneClassSVM np.random.seed(0) x1 = np.random.nor

我有以下python代码:

import numpy as np
import sklearn as sk
import pandas as pd
import scipy as sp
import matplotlib.pyplot as plt
import sys
from sklearn.decomposition import PCA
from sklearn.svm import OneClassSVM



np.random.seed(0)

x1 = np.random.normal((1,1), 0.1, (200, 2))
x2 = np.random.normal((1,0), .1, (200, 2))
x3 = np.random.normal((0,1), .1, (200, 2))
x4 = np.array([[0.5, 0.5],
               [0.5, 1],
               [1, 0.5]])


X = np.vstack([x1, x2, x3])#, x4])
X = sk.preprocessing.scale(X)

X_new = np.vstack([x1, x2, x3, x4])
X_new = sk.preprocessing.scale(X_new)



n, p = X_new.shape

anomaly_index = np.array(range(n-3, n))
normal_index = np.array(range(n-3))

#plt.scatter(X_new[normal_index,0], X_new[normal_index,1])
#plt.scatter(X_new[anomaly_index,0], X_new[anomaly_index,1], marker='*', c='r')
#plt.show()


gammas = [0.5]#, 0.7, 0.9]
nus = [0.01]#, 0.3, 0.8]
nrow = len(gammas)
ncol = len(nus)


j = 0
for gamma in gammas:
    for nu in nus:
        j += 1

        svm = OneClassSVM(kernel='rbf', degree=2, 
                          gamma=gamma, coef0=0.0, 
                          tol=0.001, 
                          nu=nu, shrinking=True, 
                          cache_size=200, 
                          verbose=False, 
                          max_iter=-1, random_state=None)
        svm.fit(X)

        anomaly_score =  - svm.decision_function(X_new)
        vmin = anomaly_score.min()
        vmax = anomaly_score.max()


        xx1, yy1 = np.meshgrid(np.linspace(X_new[:,0].min()-0.3, 
                                           X_new[:,0].max()+0.3, 1000), 
                               np.linspace(X_new[:,1].min()-0.3, 
                                           X_new[:,1].max()+0.3, 1000))
        Z1 = svm.decision_function(np.c_[xx1.ravel(), yy1.ravel()])
        Z1 = Z1.reshape(xx1.shape)



        plt.subplot(nrow, ncol, j)
        plt.title(r'$\gamma=$' + str(gamma) + r'   $\nu=$' + str(nu) + '')
        plt.scatter(X_new[normal_index, 0], X_new[normal_index, 1], 
                    c=anomaly_score[normal_index],  alpha=2, s=50, 
                    vmin=vmin, vmax=vmax)
        plt.scatter(X_new[anomaly_index, 0], 
                    X_new[anomaly_index, 1], marker='*',
                    c=anomaly_score[anomaly_index],  alpha=2, s=90,
                    vmin=vmin, vmax=vmax)

        plt.colorbar()
        #cb = plt.colorbar()
        #tick_locator = ticker.MaxNLocator(nbins=5)
        #cb.locator = tick_locator
        #cb.update_ticks()

        plt.contourf( xx1, yy1, Z1, cmap=plt.cm.Blues,
                      levels=np.linspace(Z1.min(), 0.3, 7), alpha=0.1)
        plt.xlim(X_new[:,0].min()-0.3, X_new[:, 0].max()+0.3)
        plt.ylim(X_new[:,1].min()-0.3, X_new[:, 1].max()+0.3)
        plt.xlabel(r'$x_1$', size=20)
        plt.ylabel(r'$x_2$', size=20)
        plt.locator_params(nbins=4)
        plt.tight_layout()
#plt.savefig('one_class_svm_3_clusters_grid.pdf')
plt.show()
这工作正常,但如果我取消对plt.savefig的注释,我会收到以下错误:

Process Python[/home/donbeo/Documents/pythoncode/fault_detection/one_class_svm/oc_svm_3_clusters.py] finished
Python 3.4.0 (default, Jun 19 2015, 14:20:21) 
[GCC 4.8.2] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> >>> >>> >>> >>> 

Process Python[/home/donbeo/Documents/pythoncode/fault_detection/one_class_svm/oc_svm_3_clusters.py] finished
Python 3.4.0 (default, Jun 19 2015, 14:20:21) 
[GCC 4.8.2] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> >>> >>> >>> Traceback (most recent call last):
  File "/usr/local/lib/python3.4/dist-packages/matplotlib/colors.py", line 355, in to_rgba
    'number in rbga sequence outside 0-1 range')
ValueError: number in rbga sequence outside 0-1 range

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/home/donbeo/Documents/pythoncode/fault_detection/one_class_svm/oc_svm_3_clusters.py", line 98, in <module>
    plt.savefig(plot_path + 'one_class_svm_3_clusters_grid.pdf')
  File "/usr/local/lib/python3.4/dist-packages/matplotlib/pyplot.py", line 577, in savefig
    res = fig.savefig(*args, **kwargs)
  File "/usr/local/lib/python3.4/dist-packages/matplotlib/figure.py", line 1476, in savefig
    self.canvas.print_figure(*args, **kwargs)
  File "/usr/local/lib/python3.4/dist-packages/matplotlib/backends/backend_qt5agg.py", line 161, in print_figure
    FigureCanvasAgg.print_figure(self, *args, **kwargs)
  File "/usr/local/lib/python3.4/dist-packages/matplotlib/backend_bases.py", line 2211, in print_figure
    **kwargs)
  File "/usr/local/lib/python3.4/dist-packages/matplotlib/backends/backend_pdf.py", line 2485, in print_pdf
    self.figure.draw(renderer)
  File "/usr/local/lib/python3.4/dist-packages/matplotlib/artist.py", line 59, in draw_wrapper
    draw(artist, renderer, *args, **kwargs)
  File "/usr/local/lib/python3.4/dist-packages/matplotlib/figure.py", line 1085, in draw
    func(*args)
  File "/usr/local/lib/python3.4/dist-packages/matplotlib/artist.py", line 59, in draw_wrapper
    draw(artist, renderer, *args, **kwargs)
  File "/usr/local/lib/python3.4/dist-packages/matplotlib/axes/_base.py", line 2110, in draw
    a.draw(renderer)
  File "/usr/local/lib/python3.4/dist-packages/matplotlib/artist.py", line 59, in draw_wrapper
    draw(artist, renderer, *args, **kwargs)
  File "/usr/local/lib/python3.4/dist-packages/matplotlib/collections.py", line 772, in draw
    Collection.draw(self, renderer)
  File "/usr/local/lib/python3.4/dist-packages/matplotlib/artist.py", line 59, in draw_wrapper
    draw(artist, renderer, *args, **kwargs)
  File "/usr/local/lib/python3.4/dist-packages/matplotlib/collections.py", line 320, in draw
    self._offset_position)
  File "/usr/local/lib/python3.4/dist-packages/matplotlib/backends/backend_pdf.py", line 1658, in draw_path_collection
    antialiaseds, urls, offset_position):
  File "/usr/local/lib/python3.4/dist-packages/matplotlib/backend_bases.py", line 488, in _iter_collection
    gc0.set_foreground(fg)
  File "/usr/local/lib/python3.4/dist-packages/matplotlib/backend_bases.py", line 1008, in set_foreground
    self._rgb = colors.colorConverter.to_rgba(fg)
  File "/usr/local/lib/python3.4/dist-packages/matplotlib/colors.py", line 376, in to_rgba
    'to_rgba: Invalid rgba arg "%s"\n%s' % (str(arg), exc))
ValueError: to_rgba: Invalid rgba arg "[ 0.  0.  0.  2.]"
number in rbga sequence outside 0-1 range
>>> 
处理Python[/home/donbeo/Documents/pythoncode/fault\u detection/one\u class\u svm/oc\u svm\u 3\u clusters.py]完成
Python 3.4.0(默认值,2015年6月19日,14:20:21)
[GCC 4.8.2]在linux上
有关详细信息,请键入“帮助”、“版权”、“信用证”或“许可证”。
>>> >>> >>> >>> >>> 
进程Python[/home/donbeo/Documents/pythoncode/fault\u detection/one\u class\u svm/oc\u svm\u 3\u clusters.py]完成
Python 3.4.0(默认值,2015年6月19日,14:20:21)
[GCC 4.8.2]在linux上
有关详细信息,请键入“帮助”、“版权”、“信用证”或“许可证”。
>>>>>>>>>>>>>>>回溯(最近一次呼叫最后一次):
文件“/usr/local/lib/python3.4/dist packages/matplotlib/colors.py”,第355行,to_rgba
“rbga序列中的数字超出0-1范围”
ValueError:rbga序列中的数字超出0-1范围
在处理上述异常期间,发生了另一个异常:
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
文件“/home/donbeo/Documents/pythoncode/fault\u detection/one\u class\u svm/oc\u svm\u 3\u clusters.py”,第98行,在
plt.savefig(plot\u path+'one\u class\u svm\u 3\u clusters\u grid.pdf')
savefig中的文件“/usr/local/lib/python3.4/dist packages/matplotlib/pyplot.py”,第577行
res=图savefig(*args,**kwargs)
savefig中的文件“/usr/local/lib/python3.4/dist packages/matplotlib/figure.py”,第1476行
self.canvas.print_图(*args,**kwargs)
文件“/usr/local/lib/python3.4/dist packages/matplotlib/backends/backend_qt5agg.py”,第161行,如图所示
图canvasagg.打印图(self,*args,**kwargs)
文件“/usr/local/lib/python3.4/dist packages/matplotlib/backend\u base.py”,第2211行,如图所示
**kwargs)
文件“/usr/local/lib/python3.4/dist-packages/matplotlib/backends/backend_pdf.py”,第2485行,打印为pdf
self.figure.draw(渲染器)
文件“/usr/local/lib/python3.4/dist packages/matplotlib/artist.py”,第59行,在draw_包装中
绘制(艺术家、渲染器、*args、**kwargs)
文件“/usr/local/lib/python3.4/dist packages/matplotlib/figure.py”,绘图中第1085行
func(*args)
文件“/usr/local/lib/python3.4/dist packages/matplotlib/artist.py”,第59行,在draw_包装中
绘制(艺术家、渲染器、*args、**kwargs)
文件“/usr/local/lib/python3.4/dist packages/matplotlib/axes/_base.py”,第2110行,在绘图中
a、 绘制(渲染器)
文件“/usr/local/lib/python3.4/dist packages/matplotlib/artist.py”,第59行,在draw_包装中
绘制(艺术家、渲染器、*args、**kwargs)
文件“/usr/local/lib/python3.4/dist packages/matplotlib/collections.py”,绘图中第772行
Collection.draw(自绘制、渲染器)
文件“/usr/local/lib/python3.4/dist packages/matplotlib/artist.py”,第59行,在draw_包装中
绘制(艺术家、渲染器、*args、**kwargs)
文件“/usr/local/lib/python3.4/dist packages/matplotlib/collections.py”,绘图中第320行
自偏移(位置)
文件“/usr/local/lib/python3.4/dist packages/matplotlib/backends/backend\u pdf.py”,第1658行,在draw\u path\u集合中
抗锯齿、URL、偏移量(U位置):
文件“/usr/local/lib/python3.4/dist packages/matplotlib/backend\u base.py”,第488行,在iter\u集合中
gc0.设置前景(前景)
文件“/usr/local/lib/python3.4/dist packages/matplotlib/backend\u base.py”,第1008行,在set\u前台
self._rgb=colors.colorConverter.to_rgba(fg)
文件“/usr/local/lib/python3.4/dist packages/matplotlib/colors.py”,第376行,to_rgba
'to_rgba:无效的rgba参数“%s”\n%s%%(str(arg),exc))
ValueError:to_rgba:无效的rgba参数“[0.0.0.2.]”
rbga序列中的数字超出0-1范围
>>> 

查看错误消息,它会告诉您出了什么问题。回溯的最后一行显示rgba颜色的alpha(第四个值)设置为2,而它应该介于0和1之间

plt.scatter(X_new[normal_index, 0], X_new[normal_index, 1], 
                c=anomaly_score[normal_index],  alpha=0.5, s=50, 
                vmin=vmin, vmax=vmax)
plt.scatter(X_new[anomaly_index, 0], 
                X_new[anomaly_index, 1], marker='*',
                c=anomaly_score[anomaly_index],  alpha=0.5, s=90,
                vmin=vmin, vmax=vmax)
作为一个小例子

x1 = np.random.normal((1,1), 0.1, (200, 2))
plt.scatter(x1[:,0], x1[:,1], alpha=2)
plt.show()
将给出相同的错误消息。只需将alpha值替换为0到1之间的数字,错误就会消失:

x1 = np.random.normal((1,1), 0.1, (200, 2))
plt.scatter(x1[:,0], x1[:,1], alpha=0.5)
plt.show()
在代码中,更改以下行中的alpha值。在这里,我将其替换为0.5,但您可以选择您想要的内容,只要它介于0和1之间

plt.scatter(X_new[normal_index, 0], X_new[normal_index, 1], 
                c=anomaly_score[normal_index],  alpha=0.5, s=50, 
                vmin=vmin, vmax=vmax)
plt.scatter(X_new[anomaly_index, 0], 
                X_new[anomaly_index, 1], marker='*',
                c=anomaly_score[anomaly_index],  alpha=0.5, s=90,
                vmin=vmin, vmax=vmax)

你能把这个简化成一个简单的例子吗?这件事太多了。非常感谢,它很管用。奇怪的是,我能用
alpha=2
保存png绘图,不客气:-)我不知道你为什么能保存png绘图,真奇怪。