0

gnuplot.py を使用して次のデータを印刷しようとしています。

data = [[datetime.datetime(2013, 1, 15, 17, 45), 16.00], [datetime.datetime(2013, 1, 16, 17, 45), 15.98], [datetime.datetime(2013, 1, 17, 17, 45), 15.94]]

だから私はこのように始めました:

gp=Gnuplot.Gnuplot()
gp('set data style linespoints')
gp('set xdata time')
gp('set timefmt "%Y-%m-%d"')
gp('set xrange ["2012-12-20":"2013-02-12"]')
gp.plot(data)

そして、私は次の応答を受け取ります:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python2.6/dist-packages/Gnuplot/_Gnuplot.py", line 285, in plot
    self._add_to_queue(items)
  File "/usr/lib/python2.6/dist-packages/Gnuplot/_Gnuplot.py", line 255, in _add_to_queue
    self.itemlist.append(PlotItems.Data(item))
  File "/usr/lib/python2.6/dist-packages/Gnuplot/PlotItems.py", line 549, in Data
    data = utils.float_array(data[0])
  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.

次に、次のリストに変換しようとしました。

[['2013-01-15', 16.00], ['2013-01-16', 15.98], ['2013-01-17', 15.94]]

同じ結果です。

どこに問題があるのか​​ 誰にも手がかりがありますか?

ありがとう。

4

1 に答える 1

2

問題 (私が信じている) は、トレースバックから取り出した gnuplot-py 内の次の行にあります。

return numpy.asarray(m, numpy.float32)

最終的には、gnuplot-py が日時 (または文字列) データをnumpy.float32オブジェクトに変換しようとしています。ただし、いくつかのフープを飛び越えても構わないと思っている場合は、おそらくこれを機能させることができます.


ソースを調べると、ソリューションのこの部分は実際には必要ない場合があります。 最初に行う必要があるのは、内部の行を代わりにutils.py使用するように変更してから、再インストールすることです。これは、やや標準的なエポック表記を使用できるようにするためです。(または、トレースバックで参照されているファイルを変更するだけで、おそらく再インストール手順をバイパスできます。行番号も表示されます):numpy.float64numpy.float32gnuplot-py

File "/usr/lib/python2.6/dist-packages/Gnuplot/utils.py", line 33, in float_array
    return numpy.asarray(m, numpy.float32)

33行目numpy.asarray(m,numpy.float64)は、


浮動小数点数を使用してエポック情報を格納できます (float32十分な精度が得られないと思います...)

def secs_since_epoch(date_time,epoch=datetime.datetime(1970,1,1,0,0,0)):
    """
    compute seconds since a particular epoch.  The default epoch is the unix
    epoch -- e.g. Jan. 1 1970.
    """
    dt = date_time - epoch  #time elapsed since unix epoch
    return dt.days*24*3600 + dt.seconds + dt.microseconds*1e-6 #converted to seconds

この関数を datetime オブジェクトで使用して、datetime オブジェクトから単純な (倍精度) float に変換できます。Gnuplot はありがたいことに、時間オブジェクトについてもこの形式を読み取ることができます:

gp = Gnuplot.Gnuplot()
gp('set data style linespoints')
gp('set xdata time')
gp('set timefmt "%s"')
xmin = secs_since_epoch(datetime.datetime(2012,12,20,0,0))
xmax = secs_since_epoch(datetime.datetime(2012,2,12,0,0))
gp('set xrange [%s:%s]' % (xmin,xmax) )
gp.plot(data)

次のスクリプトは私にとっては問題なく機能します。

import datetime
import Gnuplot

data = [[datetime.datetime(2013, 1, 15, 17, 45), 16.00],
        [datetime.datetime(2013, 1, 16, 17, 45), 15.98],
        [datetime.datetime(2013, 1, 17, 17, 45), 15.94]]

def secs_since_epoch(date_time,epoch=datetime.datetime(1970,1,1,0,0,0)):
    """
    compute seconds since a particular epoch.  The default epoch is the unix
    epoch -- e.g. Jan. 1 1970.
    """
    dt = date_time - epoch  #time elapsed since unix epoch
    return dt.days*24*3600 + dt.seconds + dt.microseconds*1e-6 #converted to seconds

dt,vals = zip(*data)
data = zip(map(secs_since_epoch,dt),vals)

gp = Gnuplot.Gnuplot(debug=True)
gp('set style data linespoints')
gp('set xdata time')
gp('set timefmt "%s"')
xmin = secs_since_epoch(datetime.datetime(2012,12,20,0,0))
xmax = secs_since_epoch(datetime.datetime(2012,2,12,0,0))
#gp('set xrange [%s:%s]' % (xmin,xmax) )
d = Gnuplot.Data(data)
d.set_option(using="1:2")
gp.plot(d)
raw_input()
于 2013-02-12T14:45:06.693 に答える