Gnuplot: данные по категориям - сопоставьте цвета с данными, добавьте линии диапазона - PullRequest
0 голосов
/ 23 февраля 2019

Учитывая набор значений, вписывающихся в категорию, я бы хотел

a) отобразить значения данных в виде точек (ось y) в соответствии с категорией (ось x) b) сопоставить цвет точки с категориейc) добавить строку в диапазоне от минимума до максимума каждого набора

То, что я сделал, использовало этот код:

set terminal png 
set output 'animals.png'
set ytics nomirror
unset key
set xrange [-0.5:5.5]

plot for [i=2:5] 'cat.dat' using i:xtic(1)
show xrange

, который успешно помечает по категориям на оси X, но цветаустанавливаются в соответствии со столбцом (не строкой), и я бы не знал, как добавить полосы диапазона (примечание: не панели ошибок или процентили, а полный диапазон min-> max) - тем более что данные вызываются по столбцам, но тогда потребуетсябыть проанализированы по строкам.AFAIK gnuplot делает только столбцы.

Есть идеи?


Вывод с кодом выше:

example plot

Пример данных (с разделителями табуляции):

cat 0.26    0.4 0.23    0.16
dog 0.317   0.264   0.25    0.26
bat 0.33    0.42    0.32    0.48
rat 0.59    0.62    0.57    0.56
foo 0.59    0.67    0.71    0.70
bar 0.664   0.75    0.68    0.6

Ответы [ 2 ]

0 голосов
/ 24 февраля 2019

Как вы заметили, gnuplot не любит строки и, к сожалению, (пока?) Не предлагает функцию транспонирования.В своем решении вы используете системные вызовы / инструменты Unix и sed, которые не обязательно зависят от платформы.Кроме того, вы строите точки и разделяете стрелки для соединения, я думаю, вы можете упростить это на linespoints, если не будете настаивать на горизонтальной полосе при минимальных и максимальных значениях.

Позвольте мне показать некоторые "упрощенный "независимый от платформы gnuplot- только код.

Общая процедура:

  1. загрузка файла в блок данных
  2. транспонирование блока данных
  3. построение столбцов с точками линий

TAB-файл данных без заголовка: Animals.dat

cat 0.26    0.4 0.23    0.16
dog 0.317   0.264   0.25    0.26
bat 0.33    0.42    0.32    0.48
rat 0.59    0.62    0.57    0.56
foo 0.59    0.67    0.71    0.70
bar 0.664   0.75    0.68    0.6

Для приведенного ниже кода требуется процедура FileToDatablock и процедура DatablockTranspose.

Процедура загрузки файла в блок данных: FileToDatablock.gpp

### Load datafile "as is" into datablock for different platforms
# ARG1 = input filename
# ARG2 = output datablock

if (GPVAL_SYSNAME[:7] eq "Windows") {          # "Windows_NT-6.1" is shown on a Win7 system
    load '< echo '.ARG2.' ^<^<EOD & type "'.ARG1.'"'
}
if (GPVAL_SYSNAME eq "Linux") {                # that's shown on a Raspberry
    load '< echo "\$Data << EOD" & cat "'.ARG1.'"'
}
if (GPVAL_SYSNAME eq "Darwin") {               # this was shown on a MacOS Sierra 10.12.6
    load '< echo "\$Data << EOD" & cat "'.ARG1.'"'  # identical to Linux
}
### end of code

Процедура gnuplot для транспонирования блока данных: DatablockTranspose.gpp

### transpose datablock (requires whitespace as separator)
# ARG1 = Input datablock
# ARG2 = Output datablock

set print @ARG2
do for [DBT_i=1:words(@ARG1[1])] { 
    DBT_Line = ""
    do for [DBT_j=1:|@ARG1|] {
       DBT_Line = DBT_Line.word(@ARG1[DBT_j],DBT_i).\
       (DBT_j < |@ARG1| ? "\t" : "")
    }
    print DBT_Line
}
set print
undefine DBT_*
### end of code

Фактический код:

### plotting rows
reset session

# load file to datablock
call "FileToDatablock" "Animals.dat" "$Data"

# transpose datablock by gnuplot procedure
call "DatablockTranspose.gpp" "$Data" "$DataTransposed"

set palette defined ( 0 'purple', 1 'blue', 2 'green', \
    3 'yellow', 4 'orange', 5 'red' , 6 'black' )
unset colorbox

set xrange[0.5:|$Data|+0.5]
plot for [i=1:|$Data|] $DataTransposed u (i):i:(i):xtic(columnhead(i)) w lp pt 7 ps 1.5 lc palette not
### end of code

Результат:

enter image description here

0 голосов
/ 23 февраля 2019

Это занимает еще несколько шагов, прежде всего, каждой категории присваивается уникальный порядковый номер, и данные транспонируются:

(здесь я буду ссылаться на команды оболочки GNU unix)

$cat -n data_orig.dat | datamash transpose > data_trans.dat
$cat data_trans.dat  #added spaces for readability

     1       2       3       4       5       6
cat     dog     bat     rat     foo     bar
0.26    0.317   0.33    0.59    0.59    0.664
0.4     0.264   0.42    0.62    0.67    0.75
0.23    0.25    0.32    0.57    0.71    0.68
0.16    0.26    0.48    0.56    0.70    0.6

Теперь данные могут быть правильно проанализированы в столбцах, а цвета определены в соответствии с порядковым номером.Столбцы сделаны со стрелками, где минимум и максимум взяты из статистического анализа каждого столбца.xticlabels считывается в массив 1D word (это внутренняя функция gnuplot) с помощью системного вызова, и индексы массива создаются для соответствия уникальным индексам столбцов данных.

скрипт с очень подробными объяснениями для лучшей поддержки новых пользователей gnuplot:

#output and style settings: make png-file, name it 'animals.png',
#   yaxis tics on both sides, no legend
set terminal png 
set output 'animals.png'
set ytics mirror
unset key

#data indices are integers from 1 to 6, a bit of space for the looks
set xrange [0.5:6.5] 

#define color scheme for each data series
set palette defined ( 0 'purple', 1 'blue', 2 'green', \
    3 'yellow', 4 'orange', 5 'red' , 6 'black' )

#hide color gradient bar of palette
unset colorbox

#define array names using word function:
#  read in 2nd line of data by system call and run through words
#  each space-delimited word is now an array element of names
names(n) = word( system("sed -n '2p' cat.dat_t" ) , n )

#create min->max bars
#loop over all data sets to create bars
do for [i=1:6] {

    #among others this gives minimum and maximum values of the data set
    #using i -> only handle column i in statistics
    #every ::3 start with row 3 for statistical analysis
    stats 'data_trans.dat' using i every ::3

    #use min/max values for arrow y positions, index i for x positions
    #heads = arrow head on both sides
    #size 0.1,90 = 0.1 line lengths for arrow head
    #          and 90° arrow head line angles = T bar style
    #lc palette cb i = use line color (lc) from palette value matching
    #   color bar (cb) value of index i
    set arrow from i,STATS_min to i,STATS_max heads size 0.1,90 lc palette cb i

}

#plotting:
#   for [i=1:6] loop over all 6 columns, use i as loop variable
#   every ::3 start with row 3 for data plotting
#   using (i):i:(i):xtic(names(i))
#         syntax of using
#         x-value:y-value:z-value:label_x_axis [:label_y_axis:label_z_axis]
#         (i) -> literal value of i for x and z, z is used as color definition
#         i -> y-values from column i
#         xtic(names(i)) get element i of array names for xtic label
#   lc palette -> coloring according to defined palette
#   pt 7 ps 1.5 -> point style and size definition
plot for [i=1:6] 'data_trans.dat' every ::3 using (i):i:(i):xtic(names(i)) lc palette pt 7 ps 1.5

Ссылки:

раскраска на основе значений x

массив из word функция

Результат:

enter image description here


РЕДАКТИРОВАТЬ:

Как показано в ответе @theozh, linespoints гораздо более практично для отображения диапазона.Это позволяет пропустить весь блок создания бара / стрелки, просто добавив w lp в командной строке построения.

...