Месяцы в gnuplot

#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: