安装错误信息" Gnuplot-py"使用" python setup.py install" Mac OS Sierra中的命令

时间:2017-02-24 22:39:10

标签: python macos gnuplot

我试图安装" Gnuplot-py"使用此命令在我的Mac上打包" python setup.py install"在gnuplot-py-1.8目录中但我收到此错误:

追踪(最近一次呼叫最后一次):

  

File" /Users/sebydc77/Downloads/gnuplot-py-1.8/PlotItems.py" ;, line   20,在       来自cStringIO import StringIO ModuleNotFoundError:没有名为' cStringIO的模块'

在处理上述异常期间,发生了另一个异常:

追踪(最近一次呼叫最后一次):

  

文件" setup.py",第15行,in       来自 init 导入版本文件" /Users/sebydc77/Downloads/gnuplot-py-1.8/ init .py",第166行,在          来自PlotItems导入PlotItem,Func,File,Data,GridData文件" /Users/sebydc77/Downloads/gnuplot-py-1.8/PlotItems.py" ;,第22行,in          来自StringIO import StringIO ModuleNotFoundError:没有名为' StringIO'

的模块

我花了至少3个小时试图解决这个问题。我还尝试了不同的替代方案,例如" pip install Gnuplot-py"," pip install download link ..."等...

(注意:我的机器上已经安装了gnuplot)

1 个答案:

答案 0 :(得分:0)

如上所述,该模块不适用于Python 3.

但是在Python中使用gnuplot编写自定义绘图函数并不困难。下面是我写的一个例子,用于绘制碳纤维层压板与环氧树脂的注入图。在输液过程中,将树脂桶放在秤上,这样我每隔几分钟就能记下剩余的重量。

plot函数的主要输入是numpy数组,其中我记录了仍在桶中的树脂的时间和数量。这个数量会随着时间的推移而下降,所以我用这个数据来计算每个点注入树脂的总量和树脂流动的速度。 numpy就派上用场了!

这个函数基本上会创建一个包含gnuplot命令和内联数据的行列表,然后将它们连接成一个字符串,并作为gnuplot运行到subprocess

import subprocess
import numpy as np


def plot(rawdata, filename, maxy=None, labels=False, n=2):
    """Plot injection data with gnuplot.

    Arguments:
        data: numpy array of shape (N,2)
            (Time, weight) pairs as written down during the injection. The time
            in minutes increases and the weight in grams decreases.
        filename: string
            Name to write the output figure to.
        maxy: Maximum y coordinate for the left axis (injected weight).
            The right axis (injection speed) is 1/10th of the left axis.
            When set to None, automatic scaling is used.
        labels: Label every n-th data point when true.
        n: Print every n-th value as a label.
    """
    gtype = 'lines'
    if labels:
        gtype = 'linespoints'
    delta = rawdata[1:] - rawdata[:-1]
    totals = np.array([[0, 0]] + [[dt, -dm] for dt, dm in delta])
    som = np.cumsum(totals, axis=0)
    print('harshoeveelheid "{}": {} g'.format(filename, som[-1, 1]))
    if maxy is None:
        maxy = round(som[-1, 1], -2)
    dm = np.array([[0]] + [[-dm/dt] for dt, dm in delta])
    newdata = np.hstack((som, dm))
    newdata[0, 2] = newdata[1, 2]
    l1 = 'set label "{:.0f} g" at {},{} center offset 0,0.5'
    l2 = 'set label "{:.0f} g/min" at {},second {} center offset 0,0.5'
    p1 = 'plot "-" with {gt} ls 1 title "harshoeveelheid", ' \
        '"-" with {gt} axes x1y2 ls 2 title "injectiesnelheid"'
    lp1 = ', "-" using 1:2:2 with labels right offset character 0.4,0.7' \
        'font "Alegreya, 8" tc ls 1 notitle'
    lp2 = ', "-" using 1:2:2 axis x1y2 with labels left offset character ' \
        '0.5,0.7 font "Alegreya, 8" tc ls 2 notitle'
    text = ['set terminal pdfcairo enhanced color dashed font "Alegreya, 11" '
            'rounded size 12.8 cm, 7.0 cm',
            'set xlabel "tijd [min]"',
            'set ylabel "harshoeveelheid [g]"',
            'set y2label "injectiesnelheid [g/min]"',
            'set y2tics',
            'set yrange [0:{:.0f}]'.format(maxy),
            'set y2range [0:{:.0f}]'.format(maxy/10),
            'set key left bottom',
            'set grid']
    if not labels:
        text.append(l1.format(newdata[-1, 1], newdata[-1, 0], newdata[-1, 1]))
        text.append(l2.format(newdata[-1, 2], newdata[-1, 0], newdata[-1, 2]))
    text.append('set output "{}"'.format(filename + '.pdf'))
    text.append(p1.format(gt=gtype))
    if labels:
        text[-1] += lp1 + lp2
    data1 = ['{:2.0f} {:4.0f}'.format(a, b) for a, b, _ in newdata]
    data2 = ['{:2.0f} {:4.0f}'.format(a, b) for a, _, b in newdata]
    text += data1
    text.append('e')
    text += data2
    text.append('e')
    if labels:
        data1 = ['{:2.0f} {:4.0f}'.format(a, b) for a, b, _ in newdata[n-1::n]]
        data2 = ['{:2.0f} {:4.0f}'.format(a, b) for a, _, b in newdata[n-1::n]]
        text += data1
        text.append('e')
        text += data2
        text.append('e')
    p = subprocess.Popen(['gnuplot'], stdin=subprocess.PIPE)
    _, _ = p.communicate(input='\n'.join(text).encode('utf-8'))

输出看起来像这样: example infusion picture

请注意,图表的样式取决于我gnuplotrc文件中的设置。