2014-10-03 3 views
1

Это вопрос о моем более раннем вопросе здесь: "gnuplot bashshell to plot several curves in one window", который Christoph любезно помог с ним. Тем не менее, я упростил свой вопрос, предполагая, что смогу заранее продвигаться оттуда самостоятельно. Не нужно говорить, я не мог! :(то, что я действительно хочу построить в одной рамке с изображением, представляет собой набор файлов данных, и для каждого из файлов данных на него установлена ​​кривая (экспоненциальная функция). К сожалению, я застрял в gnuplot 4.2, что не позволяет мне использовать цикл и итераций. Я бы очень признателен за любые советы. следующие Баш cript печатает девять кривых и их подогнанные линии на отдельные файлы.gnuplot bashshell несколько кривых и встроенные кривые на одном рисунке

#!/bin/bash 

for Counter in {1..9}; do 
FILE="dataFile"$Counter".data" 
gnuplot <<EOF 
set xlabel "k" 
set ylabel "p(k)" 
set term png 
set output "${FILE}.png" 
title_fexp(a,b) = sprintf('exp(x) = %.2f * e(%.2f)', a, b) 
expon(x) = c * exp(-x*d) 
fit [10:100] expon(x) '${FILE}' via c,d 
plot [1:50] expon(x)t title_fexp(c,d), '${FILE}' 
EOF 
done 
+0

У вас уже есть все параметры подгонки? Тогда это вопрос чтения их в gnuplot. Если они находятся во внешнем файле, вы можете прочитать их с помощью внешней команды. Например. у вас есть файл temp с текстом '12345', вы можете прочитать его в gnuplot, используя' a = system ("awk 'NR == 1 {print $ 1}' temp") '. – Miguel

+0

В чем проблема? Как должен выглядеть последний сюжет? –

+0

@Miguel Нет У меня нет параметров фитинга в отдельном файле. Вы предлагаете мне сначала запустить код выше, оценить параметры подгонки, записать их в файл, а затем прочитать их из этого файла в сюжет? – PyPhys

ответ

3

Перед тем, как написать Баш скрипт для создания GNUPLOT сценария , вы должны подумать о том, как должен выглядеть ваш скрипт gnuplot. После этого вы можете написать сценарий bash/whatever для генерации одного и того же кода gnuplot.

Итак, что вы хотите, это:

set xlabel "k" 
set ylabel "p(k)" 
set term png 
set output "MySingleFile.png" 


# Note that I've added c and d to the declaration 
expon(x, c, d) = c * exp(-x*d) 

# This allows to store the fit parameters for each datafile separately 
fit expon(x, c1, d1) "dataFile1.data" via c1, d1 
fit expon(x, c2, d2) "dataFile2.data" via c2, d2 
fit expon(x, c3, d3) "dataFile3.data" via c3, d3 

# now plot it. Note: The backslash allows multi line commands 
plot \ 
    "dataFile1.data" notitle pt 1, \ 
    expon(x, c1, d1) title sprintf('exp(x) = %.2f * e(%.2f)', c1, d1) lt 1,\ 
    "dataFile2.data" notitle pt 2, \ 
    expon(x, c2, d2) title sprintf('exp(x) = %.2f * e(%.2f)', c2, d2) lt 2,\ 
    "dataFile3.data" notitle pt 3, \ 
    expon(x, c3, d3) title sprintf('exp(x) = %.2f * e(%.2f)', c3, d3) lt 3 


unset output 

Теперь вы можете написать Баш скрипт, основанный на вашем, который генерирует код, как у меня. Однако подумайте о том, чтобы передать команды gnuplot в отдельный файл, а затем вызвать gnuplot с этим файлом в качестве параметра. Это позволяет отлаживать вывод сценария bash.

Обратите внимание, что в конце последней строки командного заклада нет запятой. В зависимости от того, что вам нужно, ваш скрипт bash должен заботиться, или вы просто редактируете файл gnuplot и удаляете последнюю запятую.

+0

Большое спасибо @sweber, это работает. :) – PyPhys

1

К сожалению, у меня нет много времени, но я хотел бы дать вам руку ...

Если вы хотите, чтобы сделать петлю из кода @ sweber, вы можете сделать somethimg так:

#!/bin/bash  
{ 
cat<<EOF 
set xlabel "k" 
set ylabel "p(k)" 
set term png 
set output "MySingleFile.png" 
EOF 

for i in {1..3} 
do 
    cat<<EOF 
    fit ... something with $i ... 
EOF 
done 

for i in {1..3} 
do 
    cat<<EOF 
    plot ... something with $i ... 
EOF 
done } | gnuplot 

Просто удалите | gnuplot в конце, чтобы отладить или просмотреть сгенерированный код. Это так:

set xlabel "k" 
set ylabel "p(k)" 
set term png 
set output "MySingleFile.png" 
fit ... something with 1 ... 
fit ... something with 2 ... 
fit ... something with 3 ... 
plot ... something with 1 ... 
plot ... something with 2 ... 
plot ... something with 3 ... 
+0

Спасибо @MarkStechell очень полезно. – PyPhys