Одним из возможных решений было бы использование стиля построения 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 ''
Это дает:
РЕДАКТИРОВАТЬ:
Из вашего комментария кажется, что я неправильно понял ваш вопрос.Чтобы сгруппировать блоки «по каждой строке», вы можете сделать, например:
$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)
.Это позволяет добиться того, что элемент в легенде получит правильный цвет (синий вместо красного).
Результат:
Наконец, оператор $DATA
обозначает блок данных.Более старые версии Gnuplot (я полагаю, старше 5) не поддерживают эту функцию, поэтому вы можете заменить $DATA
на переменную, содержащую имя файла, содержащего данные.
EDIT2:
Чтобы быть более конкретным, например, выражение (4*$0 + 1):6:($0+1):xtic(5)
запрашивает генерацию блоков по координатам x, рассчитанным как 4-кратный номер строки (на основе 0) плюс 1.высота блоков берется из столбца 6, индекс цвета ($0+1)
рассчитывается как единица плюс номер строки, и, наконец, метки xtic загружаются из столбца 5.