сгруппируйте определенные столбцы категории и предоставьте подкатегорию xtics в gnuplot - PullRequest
0 голосов
/ 23 мая 2018

Мне нужно построить данные трех категорий:

  • cat1 (с подкатегориями i1, i2, i3)
  • cat2 (с подкатегориями p1, p2, p3)
  • cat3 (с подкатегориями n1, n2, n3)

Каждая категория должна быть сгруппирована и окрашена по-разному.В каждой группе нам нужно назначить разные шаблоны для блоков и соответствующую подкатегорию в виде метки xtic, для которой необходимо обеспечить различение.

Вот пример данных и код.Пример данных: sample.dat

cat1 i1 95.2162 0.817947 i2 96.2065 0.710029 i3 98.4846 0.58444 
cat2 p1 96.899 0.502756 p2 97.9695 1.16202 p3 99.631 0.0911258 
cat3 n1 99.4709 0.318714 n2 99.5897 0.234542 n3 99.9535 0.0507579

Код:

set terminal png
set output 'bar.png'
set style data histograms
set style fill solid 1 border lt -1
set boxwidth 0.9
set style histogram errorbars lw 3
plot 'sample.dat' using 3:4:xtic(2) title "cat1", \
     ''             using 6:7:xtic(5) title "cat2", \
     ''             using 9:10:xtic(8) title "cat3"

пожалуйста, найдите выходные данные графика.Требуемый результат - иметь сгруппированные столбцы в одном цвете, а внутри необходимо иметь определенную подкатегорию в виде меток xtic.Но вывод здесь не удался и показал 3 цвета во всех категориях, и только последний xtic пришел для каждой группы.Не могли бы вы помочь мне понять, где я ошибся?enter image description here

Спасибо.

1 Ответ

0 голосов
/ 24 мая 2018

Одним из возможных решений было бы использование стиля построения with boxes для генерации отдельных групп и последующего наложения панелей ошибок.Сценарий ниже устанавливает ширину блока в 1, а затем смещает отдельные группы на фиксированную величину (4 и 8).Поскольку в каждой группе только 3 блока, это обеспечивает достаточный «разрыв» между группами (такой же ширины, как каждый блок).

$DATA <<EOD
cat1 i1 95.2162 0.817947 i2 96.2065 0.710029 i3 98.4846 0.58444 
cat2 p1 96.899 0.502756 p2 97.9695 1.16202 p3 99.631 0.0911258 
cat3 n1 99.4709 0.318714 n2 99.5897 0.234542 n3 99.9535 0.0507579
EOD

set terminal pngcairo enhanced rounded font ",16"
set output 'fig.png'

set style fill solid 1 border lt -1
set boxwidth 1.0

set linetype 42 lw 2 lc rgb 'black'
set yr [94:102]

set xtics out nomirror

plot \
  $DATA using (0 + $0):3:xtic(2) w boxes lc rgb 'red' t 'cat1', \
  $DATA using (0 + $0):3:4 w yerrorbars lt 42 t '', \
  $DATA using (4 + $0):6:xtic(5) w boxes lc rgb 'green' t 'cat2', \
  $DATA using (4 + $0):6:7 w yerrorbars lt 42 t '', \
  $DATA using (8 + $0):9:xtic(8) w boxes lc rgb 'blue' t 'cat3', \
  $DATA using (8 + $0):9:10 w yerrorbars lt 42 t ''

Это дает: enter image description here

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

Из вашего комментария кажется, что я неправильно понял ваш вопрос.Чтобы сгруппировать блоки «по каждой строке», вы можете сделать, например:

$DATA <<EOD
cat1 i1 95.2162 0.817947 i2 96.2065 0.710029 i3 98.4846 0.58444 
cat2 p1 96.899 0.502756 p2 97.9695 1.16202 p3 99.631 0.0911258 
cat3 n1 99.4709 0.318714 n2 99.5897 0.234542 n3 99.9535 0.0507579
EOD

set terminal pngcairo enhanced rounded font ",16"
set output 'fig.png'

set style fill solid 1 border lt -1
set boxwidth 1.0

set linetype 42 lw 2 lc rgb 'black'
set yr [94:102]

set xtics out nomirror

set lt 1 lc rgb 'red'
set lt 2 lc rgb 'blue'
set lt 3 lc rgb 'green'


plot \
  $DATA using (4*$0):3:($0+1):xtic(2) w boxes lc variable t 'cat1', \
  $DATA using (4*$0):3:4 w yerrorbars lt 42 t '', \
  $DATA using (4*$0 + 1):6:($0+1):xtic(5) w boxes lc variable t '', \
  $DATA using (4*$0 + 1):(1/0):($0+2) w boxes lc variable t 'cat2', \
  $DATA using (4*$0 + 1):6:7 w yerrorbars lt 42 t '', \
  $DATA using (4*$0 + 2):9:($0+1):xtic(8) w boxes lc variable t '', \
  $DATA using (4*$0 + 1):(1/0):($0+3) w boxes lc variable t 'cat3', \
  $DATA using (4*$0 + 2):9:10 w yerrorbars lt 42 t ''

Здесь идея состоит в том, что поля, соответствующие строкам первой партии столбцов, размещаются в позициях 0, 4, 8, прямоугольники, соответствующие строкам второй партии в позициях 1, 5, 9 и, наконец, третья партия в позиции 2, 6, 10.Это эффективно создает группировку i1,i2,i3, p1,p2,p3 и n1,n2,n3.Стиль lc variable гарантирует, что каждый ряд получает отдельный цвет.Однако без какой-либо корректировки все полосы в легенде будут иметь одинаковый цвет (поскольку первая строка всегда соответствует группе i1,i2,i3).Чтобы исправить это, скрипт использует:

$DATA using (4*$0 + 1):6:($0+1):xtic(5) w boxes lc variable t '', \
$DATA using (4*$0 + 1):(1/0):($0+2) w boxes lc variable t 'cat2'

Здесь первый оператор выполняет построение, а второй генерирует пустой график (из-за неопределенного значения 1/0), но использует индекс цветасмещено на 1, то есть ($0+2) вместо ($0+1).Это позволяет добиться того, что элемент в легенде получит правильный цвет (синий вместо красного).

Результат: enter image description here

Наконец, оператор $DATA обозначает блок данных.Более старые версии Gnuplot (я полагаю, старше 5) не поддерживают эту функцию, поэтому вы можете заменить $DATA на переменную, содержащую имя файла, содержащего данные.

EDIT2:

Чтобы быть более конкретным, например, выражение (4*$0 + 1):6:($0+1):xtic(5) запрашивает генерацию блоков по координатам x, рассчитанным как 4-кратный номер строки (на основе 0) плюс 1.высота блоков берется из столбца 6, индекс цвета ($0+1) рассчитывается как единица плюс номер строки, и, наконец, метки xtic загружаются из столбца 5.

...