2011-02-01 93 views
3

爲了清楚起見,我已經隔離了我的問題,並使用了一個小而完整的代碼段來描述它。Python + GNU Plot:處理缺失值

我有一堆數據,但有很多缺失的部分。我想忽略這些(如果它是一個線形圖,圖中的中斷)。我已經設定 」?」成爲缺失數據的標誌。這裏是我的代碼片段:

import math 
import Gnuplot 

gp = Gnuplot.Gnuplot(persist=1) 
gp("set datafile missing '?'") 

x = range(1000) 

y = [math.sin(a) + math.cos(a) + math.tan(a) for a in x] 

# Force a piece of missing data 
y[4] = '?' 

data = Gnuplot.Data(x, y, title='Plotting from Python') 
gp.plot(data); 

gp.hardcopy(filename="pyplot.png",terminal="png") 

但它不工作:

> python missing_test.py 
Traceback (most recent call last): 
    File "missing_test.py", line 8, in <module> 
    data = Gnuplot.Data(x, y, title='Plotting from Python') 
    File "/usr/lib/python2.6/dist-packages/Gnuplot/PlotItems.py", line 560, in Data 
    data = utils.float_array(data) 
    File "/usr/lib/python2.6/dist-packages/Gnuplot/utils.py", line 33, in float_array 
    return numpy.asarray(m, numpy.float32) 
    File "/usr/lib/python2.6/dist-packages/numpy/core/numeric.py", line 230, in asarray 
    return array(a, dtype, copy=False, order=order) 
ValueError: setting an array element with a sequence. 

什麼錯?

回答

4

Gnuplot呼籲numpy.asarray將您的Python列表轉換爲numpy數組。 不幸的是,這個命令(dtype=numpy.float32)與包含字符串的Python列表不兼容。

您可以複製這樣的錯誤:

In [36]: np.asarray(['?',1.0,2.0],np.float32) 
--------------------------------------------------------------------------- 
ValueError        Traceback (most recent call last) 

/usr/lib/python2.6/dist-packages/numpy/core/numeric.pyc in asarray(a, dtype, order) 
    228 
    229  """ 
--> 230  return array(a, dtype, copy=False, order=order) 
    231 
    232 def asanyarray(a, dtype=None, order=None): 

ValueError: setting an array element with a sequence. 

此外,Gnuplot python module (version 1.7) docs

  • 沒有爲在陣列中的數據丟失的數據點(其中 gnuplot的經允許沒有規定'set missing'命令)。

我不確定這是否在版本1.8中得到了修復。

你是如何結婚的人gnuplot? Have you tried matplotlib