Вот еще один пример, который расширяет некоторые из предыдущих ответов. Это решение требует 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 перед командами plot!
Кроме того, я не использовал IOString, как @ppetraki, поскольку, по-видимому, это медленнее, чем простое присоединение к списку: https://waymoot.org/home/python_string/