#bash #awk #gnuplot #paste
#bash #awk #gnuplot #вставить
Вопрос:
У меня есть CSV-файл с 12 числами, которые соответствуют 12 месяцам. Пример файла выглядит следующим образом:
$ cat data.csv
"3","5","6","5","4","6","7","6","4","4","3","3",
Я хотел бы отобразить их с помощью месяцев по оси x, используя «январь, февраль, март и так далее».
Я нашел этот скрипт, но я не знаю, как вводить месяцы:
for FILE in data.csv; do
gnuplot -p << EOF
set datafile separator ","
set xlabel "xlabel"
set ylabel "ylabel"
set title "graphTitle"
plot "$FILE" using $xcolumn:$ycolumn
EOF
done
Ожидаемым результатом должен быть график, где ось x — месяц, а ось y — данные из файла csv.
Обратите внимание, что в файле CSV нет месяцев, только цифры. Вот почему я спрашиваю, каков наилучший способ добиться этого без необходимости вводить их вручную в CSV или перебирать массив. Есть ли какая-либо функция gnuplot, которая добавляет дату и может быть отформатирована?
Спасибо
Комментарии:
1. можете ли вы предоставить образец
data.csv
? что касается названий месяцев… как бы выглядел файл данных, если бы в нем были названия месяцев и числовые данные (т. Е. Какой формат можноgnuplot
было бы читать как координаты x / y)? … Мне интересно, какие параметры (кодирования) могут быть доступны для автоматической генерации названий месяцев, но для этого необходимо знать допустимый формат, которыйgnuplot
может считываться2. Привет @markp-fuso, образец data.csv уже находится в вопросе. Я скопировал точное содержимое файла data.csv. Это
"3","5","6","5","4","6","7","6","4","4","3","3",
3. хорошо, итак, вы знаете, что
for FILE in data.csv
цикл выполняется один раз сFILE=data.csv
, верно?4. Да, я знаю это, и мне это нужно для переменной $ x. Однако я не знаю, как вывести месяцы, следуя этой логике.
5. предполагая, что вы не работаете под какой-то «странной» локализацией, вы можете автоматически генерировать месяцы с помощью
locale mon
… включено в мой ответ (ниже)
Ответ №1:
Если вы не возражаете вводить названия месяцев, я думаю, что самым простым является это. Данные отображаются в строке для наглядности, а не считываются из файла.
$DATA << EOD
"3","5","6","5","4","6","7","6","4","4","3","3",
EOD
set datafile sep comma
set xrange [0:13]
unset key
array Month[12] = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]
plot for [N=1:12] $DATA using (N):(column(N)):xticlabel(Month[N]) with impulse lw 5
Если вы не хотите вводить названия месяцев, следующее должно генерировать эквивалент. "%b"
сгенерирует сокращенные названия месяцев, как указано выше. "%B"
сгенерирует полное название месяца.
Month(i) = strftime("%b", i * 3600.*24.*28.)
plot for [N=1:12] $DATA using (N):(column(N)):xticlabel(Month(N)) with impulse lw 5
Ответ №2:
Если вы не хотите использовать синтаксис цикла, есть способ прочитать ваш CSV-файл как матрицу 1×12. Кроме того, для длинных названий месяцев вы можете использовать функцию gnuplot strftime, присвоив ей спецификатор формата «%B».
Сценарий gnuplot находится здесь.
set key noautotitle
set datafile separator comma
set yrange [0:10]
set xrange [-1:12]
set xtics rotate by -45
set grid xtics
# This function generates the names "January", "February", ...
# from the integer value 0, 1, ...
#
monthname(i) = strftime("%B",strptime("%m",sprintf("%i",i 1)))
# `matrix every ...` specifier tells to read the data as a 1x12 matrix.
#
plot "data.csv" matrix every :::0:11:0 using 1:3:xtic(monthname($1)) with linespoints pt 7
Ответ №3:
ОБНОВЛЕНИЕ: после просмотра OPs post и кода еще немного, я предполагаю, что желаемый формат выглядит следующим образом:
January:"3",February:"5",March:"6",April:"5",May:"4",June:"6",July:"7",August:"6",September:"4",October:"4",November:"3",December:"3",
Если это так, мы можем использовать то же решение (ниже) и передать конечные результаты, tr
чтобы перенести данные обратно в однострочный / многоколоночный набор данных, например:
$ paste -d" " <(locale mon | tr ';' 'n') <(tr ',' 'n' < data.csv) | grep -v '^
И обновление операционного кода:
datfile=$(mktemp)
for FILE in data.csv
do
paste -d" " <(locale mon | tr ';' 'n') <(tr ',' 'n' < data.csv) | grep -v '^
Похоже gnuplot
, может принимать данные в различных форматах, включая следующие:
January "3"
February "5"
March "6"
April "5"
May "4"
June "6"
July "7"
August "6"
September "4"
October "4"
November "3"
December "3"
ПРИМЕЧАНИЕ: Если OP определит, что это неприемлемый формат файла, я уверен, что мы сможем придумать что-то еще... просто нужно было бы обновить вопрос образцом допустимого формата файла с указанием месяцев и цифр.
Итак, если мы сможем сгенерировать этот набор данных "на лету", мы могли бы затем передать его gnuplot
...
Сначала мы позволим locale
сгенерировать месяцы для нас:
$ locale mon
January;February;March;April;May;June;July;August;September;October;November;December
Затем мы можем перенести наши однострочные / многоколоночные наборы данных в многострочные / одностолбцовые наборы данных:
$ locale mon | tr ';' 'n'
January
February
March
April
May
June
July
August
September
October
November
December
$ tr ',' 'n' < data.csv
"3"
"5"
"6"
"5"
"4"
"6"
"7"
"6"
"4"
"4"
"3"
"3"
Отсюда мы можем paste
объединить эти 2 набора данных, используя пробел в качестве разделителя столбцов:
$ paste -d" " <(locale mon | tr ';' 'n') <(tr ',' 'n' < data.csv)
January "3"
February "5"
March "6"
April "5"
May "4"
June "6"
July "7"
August "6"
September "4"
October "4"
November "3"
December "3"
Последним шагом было бы записать это в файл (tmp), например:
$ datfile=$(mktemp)
$ paste -d" " <(locale mon | tr ';' 'n') <(tr ',' 'n' < data.csv) | grep -v '^
ПРИМЕЧАНИЕ: grep -v '^ $'
необходимо избавиться от лишней строки в конце, связанной с последней запятой ( ,
) в data.csv
Отсюда "${datfile}"
можно подавать по gnuplot
мере необходимости и, когда больше не нужно, удалять, например:
$ gnuplot ... "${datfile}" ...
$ 'rm' -rf "${datfile}" > /dev/null 2>amp;1
Комментарии:
1. Привет @markp-fuso большое спасибо за ваш подробный ответ. Для меня это имеет смысл, однако при его запуске я получил следующую ошибку:
gnuplot> plot "/tmp/tmp.CSHtJEV8sR" using : line 0: constant expression required
и я не могу ее запустить. Я даже вывел результат $ d {datfile} и выглядит нормально для меня. Есть идеи, почему?2. Я не
gnuplot
пользователь ... мой ответ был сосредоточен исключительно на попытке создать допустимый файл ввода / данных, который, в свою очередь, был основан на предположениях о том, какие форматы будут допустимыми; чистый результат... без дополнительной информации (например, точное содержимое вашего${datfile}
файла, значения$xcolumn
переменных$ycolumn
и и всяgnuplot
выполняемая команда)... Я не собираюсь сильно помогать
Ответ №4:
Еще одно решение. Поскольку у вас есть конечная запятая, а gnuplot ожидает число после нее, вы получите предупреждение warning: matrix contains missing or undefined values
, которое вы можете игнорировать. Поэтому вы должны ограничить x-maximum меньшим 12. В вашем случае замените $Data
на ваше имя 'data.csv'
файла . Возможно, вы захотите установить другую локаль (проверить help locale
), чтобы получить другие языки для названий месяцев.
Код:
### plot monthly data
reset session
$Data <<EOD
"3","5","6","5","4","6","7","6","4","4","3","3",
EOD
set datafile separator comma
set boxwidth 0.8
set style fill solid 0.5
set yrange[0:10]
set xrange[-0.9:11.9]
myMonth(i) = strftime("%b",i*3600*24*31) # get month name as abbreviation, use %B for full name
plot $Data matrix u 1:0:xtic(myMonth($1)) w boxes title "my data"
### end of code
Результат:
Ответ №5:
Одно awk
решение, построенное по той же логике, paste
что и ответ, но которое устраняет несколько подпроцессов (например, grep
, несколько tr's
)...
awk -F'[;,]' ' # input field delimiters are ";" and ","
BEGIN { OFS=":" ; ORS="," } # set output field delimiter as ":" and output record delimiter as ","
FNR==NR { for (i=1 ; i<=NF ; i ) # loop through fields from first file ...
month[i]=$(i) # store in our month[] array
next # skip to next input line
}
{ for (i=1 ; i< NF ; i ) # loop through fields from second file ...
print month[i],$(i) # print month and current field
}
' <(locale mon) data.csv
Это генерирует:
January:"3",February:"5",March:"6",April:"5",May:"4",June:"6",July:"7",August:"6",September:"4",October:"4",November:"3",December:"3",
Перенесение этого в код OP:
datfile=$(mktemp)
for FILE in data.csv
do
awk -F'[;,]' 'BEGIN{OFS=":";ORS=","} FNR==NR {for (i=1;i<=NF;i ) mon[i]=$(i); next} {for (i=1;i<NF;i ) print mon[i],$(i)}' <(locale mon) data.csv > "${datfile}"
gnuplot -p <<-EOF
set datafile separator ","
set xlabel "xlabel"
set ylabel "ylabel"
set title "graphTitle"
plot "${datfile}" using $xcolumn:$ycolumn
EOF
done
'rm' -rf "${datfile}" > /dev/null 2>amp;1
| tr ' n' ':,'
January:"3",February:"5",March:"6",April:"5",May:"4",June:"6",July:"7",August:"6",September:"4",October:"4",November:"3",December:"3",
И обновление операционного кода:
Похоже gnuplot
, может принимать данные в различных форматах, включая следующие:
ПРИМЕЧАНИЕ: Если OP определит, что это неприемлемый формат файла, я уверен, что мы сможем придумать что-то еще... просто нужно было бы обновить вопрос образцом допустимого формата файла с указанием месяцев и цифр.
Итак, если мы сможем сгенерировать этот набор данных "на лету", мы могли бы затем передать его gnuplot
...
Сначала мы позволим locale
сгенерировать месяцы для нас:
Затем мы можем перенести наши однострочные / многоколоночные наборы данных в многострочные / одностолбцовые наборы данных:
Отсюда мы можем paste
объединить эти 2 набора данных, используя пробел в качестве разделителя столбцов:
Последним шагом было бы записать это в файл (tmp), например:
ПРИМЕЧАНИЕ: grep -v '^ $'
необходимо избавиться от лишней строки в конце, связанной с последней запятой ( ,
) в data.csv
Отсюда "${datfile}"
можно подавать по gnuplot
мере необходимости и, когда больше не нужно, удалять, например:
Комментарии:
1. Привет @markp-fuso большое спасибо за ваш подробный ответ. Для меня это имеет смысл, однако при его запуске я получил следующую ошибку:
gnuplot> plot "/tmp/tmp.CSHtJEV8sR" using : line 0: constant expression required
и я не могу ее запустить. Я даже вывел результат $ d {datfile} и выглядит нормально для меня. Есть идеи, почему?2. Я не
gnuplot
пользователь ... мой ответ был сосредоточен исключительно на попытке создать допустимый файл ввода / данных, который, в свою очередь, был основан на предположениях о том, какие форматы будут допустимыми; чистый результат... без дополнительной информации (например, точное содержимое вашего${datfile}
файла, значения$xcolumn
переменных$ycolumn
и и всяgnuplot
выполняемая команда)... Я не собираюсь сильно помогать
Ответ №4:
Еще одно решение. Поскольку у вас есть конечная запятая, а gnuplot ожидает число после нее, вы получите предупреждение warning: matrix contains missing or undefined values
, которое вы можете игнорировать. Поэтому вы должны ограничить x-maximum меньшим 12. В вашем случае замените $Data
на ваше имя 'data.csv'
файла . Возможно, вы захотите установить другую локаль (проверить help locale
), чтобы получить другие языки для названий месяцев.
Код:
Результат:
Ответ №5:
Одно awk
решение, построенное по той же логике, paste
что и ответ, но которое устраняет несколько подпроцессов (например, grep
, несколько tr's
)...
Это генерирует:
Перенесение этого в код OP:
| tr ' n' ':,' > "${datfile}"
gnuplot -p <<-EOF
set datafile separator ","
set xlabel "xlabel"
set ylabel "ylabel"
set title "graphTitle"
plot "${datfile}" using $xcolumn:$ycolumn
EOF
done
'rm' -rf "${datfile}" > /dev/null 2>amp;1
Похоже gnuplot
, может принимать данные в различных форматах, включая следующие:
ПРИМЕЧАНИЕ: Если OP определит, что это неприемлемый формат файла, я уверен, что мы сможем придумать что-то еще… просто нужно было бы обновить вопрос образцом допустимого формата файла с указанием месяцев и цифр.
Итак, если мы сможем сгенерировать этот набор данных «на лету», мы могли бы затем передать его gnuplot
…
Сначала мы позволим locale
сгенерировать месяцы для нас:
Затем мы можем перенести наши однострочные / многоколоночные наборы данных в многострочные / одностолбцовые наборы данных:
Отсюда мы можем paste
объединить эти 2 набора данных, используя пробел в качестве разделителя столбцов:
Последним шагом было бы записать это в файл (tmp), например:
ПРИМЕЧАНИЕ: grep -v '^ $'
необходимо избавиться от лишней строки в конце, связанной с последней запятой ( ,
) в data.csv
Отсюда "${datfile}"
можно подавать по gnuplot
мере необходимости и, когда больше не нужно, удалять, например:
Комментарии:
1. Привет @markp-fuso большое спасибо за ваш подробный ответ. Для меня это имеет смысл, однако при его запуске я получил следующую ошибку:
gnuplot> plot "/tmp/tmp.CSHtJEV8sR" using : line 0: constant expression required
и я не могу ее запустить. Я даже вывел результат $ d {datfile} и выглядит нормально для меня. Есть идеи, почему?2. Я не
gnuplot
пользователь … мой ответ был сосредоточен исключительно на попытке создать допустимый файл ввода / данных, который, в свою очередь, был основан на предположениях о том, какие форматы будут допустимыми; чистый результат… без дополнительной информации (например, точное содержимое вашего${datfile}
файла, значения$xcolumn
переменных$ycolumn
и и всяgnuplot
выполняемая команда)… Я не собираюсь сильно помогать
Ответ №4:
Еще одно решение. Поскольку у вас есть конечная запятая, а gnuplot ожидает число после нее, вы получите предупреждение warning: matrix contains missing or undefined values
, которое вы можете игнорировать. Поэтому вы должны ограничить x-maximum меньшим 12. В вашем случае замените $Data
на ваше имя 'data.csv'
файла . Возможно, вы захотите установить другую локаль (проверить help locale
), чтобы получить другие языки для названий месяцев.
Код:
Результат:
Ответ №5:
Одно awk
решение, построенное по той же логике, paste
что и ответ, но которое устраняет несколько подпроцессов (например, grep
, несколько tr's
)…
Это генерирует:
Перенесение этого в код OP:
| tr ‘ n’ ‘:,’
January:«3»,February:«5»,March:«6»,April:«5»,May:«4»,June:«6»,July:«7»,August:«6»,September:«4»,October:«4»,November:«3»,December:«3»,
И обновление операционного кода:
Похоже gnuplot
, может принимать данные в различных форматах, включая следующие:
ПРИМЕЧАНИЕ: Если OP определит, что это неприемлемый формат файла, я уверен, что мы сможем придумать что-то еще… просто нужно было бы обновить вопрос образцом допустимого формата файла с указанием месяцев и цифр.
Итак, если мы сможем сгенерировать этот набор данных «на лету», мы могли бы затем передать его gnuplot
…
Сначала мы позволим locale
сгенерировать месяцы для нас:
Затем мы можем перенести наши однострочные / многоколоночные наборы данных в многострочные / одностолбцовые наборы данных:
Отсюда мы можем paste
объединить эти 2 набора данных, используя пробел в качестве разделителя столбцов:
Последним шагом было бы записать это в файл (tmp), например:
ПРИМЕЧАНИЕ: grep -v '^ $'
необходимо избавиться от лишней строки в конце, связанной с последней запятой ( ,
) в data.csv
Отсюда "${datfile}"
можно подавать по gnuplot
мере необходимости и, когда больше не нужно, удалять, например:
Комментарии:
1. Привет @markp-fuso большое спасибо за ваш подробный ответ. Для меня это имеет смысл, однако при его запуске я получил следующую ошибку:
gnuplot> plot "/tmp/tmp.CSHtJEV8sR" using : line 0: constant expression required
и я не могу ее запустить. Я даже вывел результат $ d {datfile} и выглядит нормально для меня. Есть идеи, почему?2. Я не
gnuplot
пользователь … мой ответ был сосредоточен исключительно на попытке создать допустимый файл ввода / данных, который, в свою очередь, был основан на предположениях о том, какие форматы будут допустимыми; чистый результат… без дополнительной информации (например, точное содержимое вашего${datfile}
файла, значения$xcolumn
переменных$ycolumn
и и всяgnuplot
выполняемая команда)… Я не собираюсь сильно помогать
Ответ №4:
Еще одно решение. Поскольку у вас есть конечная запятая, а gnuplot ожидает число после нее, вы получите предупреждение warning: matrix contains missing or undefined values
, которое вы можете игнорировать. Поэтому вы должны ограничить x-maximum меньшим 12. В вашем случае замените $Data
на ваше имя 'data.csv'
файла . Возможно, вы захотите установить другую локаль (проверить help locale
), чтобы получить другие языки для названий месяцев.
Код:
Результат:
Ответ №5:
Одно awk
решение, построенное по той же логике, paste
что и ответ, но которое устраняет несколько подпроцессов (например, grep
, несколько tr's
)…
Это генерирует:
Перенесение этого в код OP:
> «${datfile}«
$ cat «${datfile}«
January «3»
February «5»
March «6»
April «5»
May «4»
June «6»
July «7»
August «6»
September «4»
October «4»
November «3»
December «3»ПРИМЕЧАНИЕ: grep -v '^ $'
необходимо избавиться от лишней строки в конце, связанной с последней запятой ( ,
) в data.csv
Отсюда "${datfile}"
можно подавать по gnuplot
мере необходимости и, когда больше не нужно, удалять, например:
Комментарии:
1. Привет @markp-fuso большое спасибо за ваш подробный ответ. Для меня это имеет смысл, однако при его запуске я получил следующую ошибку:
gnuplot> plot "/tmp/tmp.CSHtJEV8sR" using : line 0: constant expression required
и я не могу ее запустить. Я даже вывел результат $ d {datfile} и выглядит нормально для меня. Есть идеи, почему?2. Я не
gnuplot
пользователь … мой ответ был сосредоточен исключительно на попытке создать допустимый файл ввода / данных, который, в свою очередь, был основан на предположениях о том, какие форматы будут допустимыми; чистый результат… без дополнительной информации (например, точное содержимое вашего${datfile}
файла, значения$xcolumn
переменных$ycolumn
и и всяgnuplot
выполняемая команда)… Я не собираюсь сильно помогать
Ответ №4:
Еще одно решение. Поскольку у вас есть конечная запятая, а gnuplot ожидает число после нее, вы получите предупреждение warning: matrix contains missing or undefined values
, которое вы можете игнорировать. Поэтому вы должны ограничить x-maximum меньшим 12. В вашем случае замените $Data
на ваше имя 'data.csv'
файла . Возможно, вы захотите установить другую локаль (проверить help locale
), чтобы получить другие языки для названий месяцев.
Код:
Результат:
Ответ №5:
Одно awk
решение, построенное по той же логике, paste
что и ответ, но которое устраняет несколько подпроцессов (например, grep
, несколько tr's
)…
Это генерирует:
Перенесение этого в код OP:
| tr ‘ n’ ‘:,’
January:«3»,February:«5»,March:«6»,April:«5»,May:«4»,June:«6»,July:«7»,August:«6»,September:«4»,October:«4»,November:«3»,December:«3»,
И обновление операционного кода:
Похоже gnuplot
, может принимать данные в различных форматах, включая следующие:
ПРИМЕЧАНИЕ: Если OP определит, что это неприемлемый формат файла, я уверен, что мы сможем придумать что-то еще… просто нужно было бы обновить вопрос образцом допустимого формата файла с указанием месяцев и цифр.
Итак, если мы сможем сгенерировать этот набор данных «на лету», мы могли бы затем передать его gnuplot
…
Сначала мы позволим locale
сгенерировать месяцы для нас:
Затем мы можем перенести наши однострочные / многоколоночные наборы данных в многострочные / одностолбцовые наборы данных:
Отсюда мы можем paste
объединить эти 2 набора данных, используя пробел в качестве разделителя столбцов:
Последним шагом было бы записать это в файл (tmp), например:
ПРИМЕЧАНИЕ: grep -v '^ $'
необходимо избавиться от лишней строки в конце, связанной с последней запятой ( ,
) в data.csv
Отсюда "${datfile}"
можно подавать по gnuplot
мере необходимости и, когда больше не нужно, удалять, например:
Комментарии:
1. Привет @markp-fuso большое спасибо за ваш подробный ответ. Для меня это имеет смысл, однако при его запуске я получил следующую ошибку:
gnuplot> plot "/tmp/tmp.CSHtJEV8sR" using : line 0: constant expression required
и я не могу ее запустить. Я даже вывел результат $ d {datfile} и выглядит нормально для меня. Есть идеи, почему?2. Я не
gnuplot
пользователь … мой ответ был сосредоточен исключительно на попытке создать допустимый файл ввода / данных, который, в свою очередь, был основан на предположениях о том, какие форматы будут допустимыми; чистый результат… без дополнительной информации (например, точное содержимое вашего${datfile}
файла, значения$xcolumn
переменных$ycolumn
и и всяgnuplot
выполняемая команда)… Я не собираюсь сильно помогать
Ответ №4:
Еще одно решение. Поскольку у вас есть конечная запятая, а gnuplot ожидает число после нее, вы получите предупреждение warning: matrix contains missing or undefined values
, которое вы можете игнорировать. Поэтому вы должны ограничить x-maximum меньшим 12. В вашем случае замените $Data
на ваше имя 'data.csv'
файла . Возможно, вы захотите установить другую локаль (проверить help locale
), чтобы получить другие языки для названий месяцев.
Код:
Результат:
Ответ №5:
Одно awk
решение, построенное по той же логике, paste
что и ответ, но которое устраняет несколько подпроцессов (например, grep
, несколько tr's
)…
Это генерирует:
Перенесение этого в код OP:
| tr ‘ n’ ‘:,’ > «${datfile}«
gnuplot -p <<-EOF
set datafile separator «,»
set xlabel «xlabel»
set ylabel «ylabel»
set title «graphTitle»
plot «${datfile}» using $xcolumn:$ycolumn
EOF
done
‘rm’ -rf «${datfile}« > /dev/null 2>amp;1
Похоже gnuplot
, может принимать данные в различных форматах, включая следующие:
ПРИМЕЧАНИЕ: Если OP определит, что это неприемлемый формат файла, я уверен, что мы сможем придумать что-то еще… просто нужно было бы обновить вопрос образцом допустимого формата файла с указанием месяцев и цифр.
Итак, если мы сможем сгенерировать этот набор данных «на лету», мы могли бы затем передать его gnuplot
…
Сначала мы позволим locale
сгенерировать месяцы для нас:
Затем мы можем перенести наши однострочные / многоколоночные наборы данных в многострочные / одностолбцовые наборы данных:
Отсюда мы можем paste
объединить эти 2 набора данных, используя пробел в качестве разделителя столбцов:
Последним шагом было бы записать это в файл (tmp), например:
ПРИМЕЧАНИЕ: grep -v '^ $'
необходимо избавиться от лишней строки в конце, связанной с последней запятой ( ,
) в data.csv
Отсюда "${datfile}"
можно подавать по gnuplot
мере необходимости и, когда больше не нужно, удалять, например:
Комментарии:
1. Привет @markp-fuso большое спасибо за ваш подробный ответ. Для меня это имеет смысл, однако при его запуске я получил следующую ошибку:
gnuplot> plot "/tmp/tmp.CSHtJEV8sR" using : line 0: constant expression required
и я не могу ее запустить. Я даже вывел результат $ d {datfile} и выглядит нормально для меня. Есть идеи, почему?2. Я не
gnuplot
пользователь … мой ответ был сосредоточен исключительно на попытке создать допустимый файл ввода / данных, который, в свою очередь, был основан на предположениях о том, какие форматы будут допустимыми; чистый результат… без дополнительной информации (например, точное содержимое вашего${datfile}
файла, значения$xcolumn
переменных$ycolumn
и и всяgnuplot
выполняемая команда)… Я не собираюсь сильно помогать
Ответ №4:
Еще одно решение. Поскольку у вас есть конечная запятая, а gnuplot ожидает число после нее, вы получите предупреждение warning: matrix contains missing or undefined values
, которое вы можете игнорировать. Поэтому вы должны ограничить x-maximum меньшим 12. В вашем случае замените $Data
на ваше имя 'data.csv'
файла . Возможно, вы захотите установить другую локаль (проверить help locale
), чтобы получить другие языки для названий месяцев.
Код:
Результат:
Ответ №5:
Одно awk
решение, построенное по той же логике, paste
что и ответ, но которое устраняет несколько подпроцессов (например, grep
, несколько tr's
)…
Это генерирует:
Перенесение этого в код OP:
| tr ‘ n’ ‘:,’
January:«3»,February:«5»,March:«6»,April:«5»,May:«4»,June:«6»,July:«7»,August:«6»,September:«4»,October:«4»,November:«3»,December:«3»,И обновление операционного кода:
Похоже gnuplot
, может принимать данные в различных форматах, включая следующие:
ПРИМЕЧАНИЕ: Если OP определит, что это неприемлемый формат файла, я уверен, что мы сможем придумать что-то еще… просто нужно было бы обновить вопрос образцом допустимого формата файла с указанием месяцев и цифр.
Итак, если мы сможем сгенерировать этот набор данных «на лету», мы могли бы затем передать его gnuplot
…
Сначала мы позволим locale
сгенерировать месяцы для нас:
Затем мы можем перенести наши однострочные / многоколоночные наборы данных в многострочные / одностолбцовые наборы данных:
Отсюда мы можем paste
объединить эти 2 набора данных, используя пробел в качестве разделителя столбцов:
Последним шагом было бы записать это в файл (tmp), например:
ПРИМЕЧАНИЕ: grep -v '^ $'
необходимо избавиться от лишней строки в конце, связанной с последней запятой ( ,
) в data.csv
Отсюда "${datfile}"
можно подавать по gnuplot
мере необходимости и, когда больше не нужно, удалять, например:
Комментарии:
1. Привет @markp-fuso большое спасибо за ваш подробный ответ. Для меня это имеет смысл, однако при его запуске я получил следующую ошибку:
gnuplot> plot "/tmp/tmp.CSHtJEV8sR" using : line 0: constant expression required
и я не могу ее запустить. Я даже вывел результат $ d {datfile} и выглядит нормально для меня. Есть идеи, почему?2. Я не
gnuplot
пользователь … мой ответ был сосредоточен исключительно на попытке создать допустимый файл ввода / данных, который, в свою очередь, был основан на предположениях о том, какие форматы будут допустимыми; чистый результат… без дополнительной информации (например, точное содержимое вашего${datfile}
файла, значения$xcolumn
переменных$ycolumn
и и всяgnuplot
выполняемая команда)… Я не собираюсь сильно помогать
Ответ №4:
Еще одно решение. Поскольку у вас есть конечная запятая, а gnuplot ожидает число после нее, вы получите предупреждение warning: matrix contains missing or undefined values
, которое вы можете игнорировать. Поэтому вы должны ограничить x-maximum меньшим 12. В вашем случае замените $Data
на ваше имя 'data.csv'
файла . Возможно, вы захотите установить другую локаль (проверить help locale
), чтобы получить другие языки для названий месяцев.
Код:
Результат:
Ответ №5:
Одно awk
решение, построенное по той же логике, paste
что и ответ, но которое устраняет несколько подпроцессов (например, grep
, несколько tr's
)…
Это генерирует:
Перенесение этого в код OP: