我试图安装" 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)
答案 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'))
请注意,图表的样式取决于我gnuplotrc
文件中的设置。