Вот еще один пример, который охватывает некоторые из предыдущих ответов. Это решение требует Gnuplot 5.1, потому что он использует блоки данных. Для получения дополнительной информации о блоках данных выполните help datablocks
в gnuplot. Проблема с некоторыми из предыдущих подходов заключается в том, что plot '-'
мгновенно потребляет данные, которые сразу же следует за графиком. Невозможно повторно использовать одни и те же данные в следующей команде plot. Блоки данных могут использоваться для устранения этой проблемы. Используя блоки данных, мы можем имитировать несколько файлов данных. Например, вы можете построить график, используя данные из двух файлов данных, например. plot "myData.dat" using 1:2 with linespoints, '' using 1:3 with linespoints, "myData2.dat" using 1:2 with linespoints
. Мы могли бы передавать эти данные непосредственно в gnuplot без необходимости создавать фактические файлы данных.
import sys, subprocess
from os import linesep as nl
from subprocess import Popen, PIPE
def gnuplot(commands, data):
""" drive gnuplot, expects lists, returns stdout as string """
script= nl.join(data)+nl.join(commands)+nl
print script
args = ["gnuplot", "-p"]
p = Popen(args, shell=False, stdin=PIPE)
return p.communicate(script)[0]
def buildGraph():
commands = [\
"set datafile separator ','",\
"plot '$data1' using 1:2 with linespoints, '' using 1:3 with linespoints, '$data2' using 1:2 with linespoints",\
]
data = [\
"$data1 << EOD",\
"1,30,12",\
"2,40,15",\
"3,35,20",\
"4,60,21",\
"5,50,30",\
"EOD",\
"$data2 << EOD",\
"1,20",\
"2,40",\
"3,40",\
"4,50",\
"5,60",\
"EOD",\
]
return (commands, data)
def main(args):
(commands, data) = buildGraph()
print gnuplot(commands, data)
if __name__ == "__main__":
main(sys.argv[1:])
Этот метод является немного более универсален, чем plot '-'
, как это облегчает повторное использование несколько раз же данные, в том числе и на одной и той же команды участка: https://stackoverflow.com/a/33064402/895245 Обратите внимание, что этот подход требует, чтобы данные подаются в gnuplot перед сюжетными командами!
Кроме того, я не использовал IOString, как @ppetraki сделал, так как, по-видимому, это медленнее, чем простой список столяра: https://waymoot.org/home/python_string/
Вы хотите позвонить Gnuplot с помощью API (который находится в C, поэтому вы должны написать некоторый код клея, подобный тому, который находится в gnuplot-py) или просто выполнить «gnuplot» в оболочке? –
Просто выполните gnuplot в оболочке. –