Я рисую данные, используя такие круги:
$DATA<<EOD
1.0000,"CAN",80.6600,1.6700,0.2879,
2.0000,"DEU",79.8400,1.3600,0.4134,
3.0000,"DNK",78.6000,1.8400,0.2144,
4.0000,"EGY",72.7300,2.7800,0.4077,
5.0000,"GBR",80.0500,2.0000,0.3610,
6.0000,"IRN",72.4900,1.7000,0.3906,
7.0000,"IRQ",68.0900,4.7700,0.2810,
8.0000,"ISR",81.5500,2.9600,0.2195,
9.0000,"RUS",68.6000,1.5400,0.5696,
10.0000,"USA",78.0000,2.0000,1.0000,
EOD
set datafile separator comma
set style data circles
set term windows
unset xtics; unset ytics; unset x2tics; unset y2tics
set grid xtics layerdefault
set grid ytics layerdefault
set xtics nomirror
set ytics nomirror
set border 3.00000
set colorsequence classic
set title "This is My Title"
set xlabel "Cities"
set ylabel "Population (in Millions)"
set key default
set style fill solid 4.00 transparent
plot $DATA every ::0::0 using ($3):($4):($5) title "CAN",\
$DATA every ::1::1 using ($3):($4):($5) title "DEU",\
$DATA every ::2::2 using ($3):($4):($5) title "DNK",\
$DATA every ::3::3 using ($3):($4):($5) title "EGY",\
$DATA every ::4::4 using ($3):($4):($5) title "GBR",\
$DATA every ::5::5 using ($3):($4):($5) title "IRN",\
$DATA every ::6::6 using ($3):($4):($5) title "IRQ",\
$DATA every ::7::7 using ($3):($4):($5) title "ISR",\
$DATA every ::8::8 using ($3):($4):($5) title "RUS",\
$DATA every ::9::9 using ($3):($4):($5) title "USA",\
$DATA every ::9::9 using ($3):($4)+($5):($2) with labels center notitle,\
$DATA every ::9::9 using ($3)-($5):($4):($2) with labels center notitle,\
$DATA every ::9::9 using ($3):($4)-($5)/2+0.1:($2) with labels center notitle
С моими последними тремя строками я пытаюсь расположить метку выше, слева и ниже круга.
Размещение метки слева (или справа) от круга не проблема, так как радиус круга совпадает с масштабом для плоскости x. Хорошо.
Позиционирование метки в верхней части круга не работает так же, потому что масштаб y не совпадает с плоскостью x.
Поместить метку внизу круга можно, но это требует некоторых расчетов, добавленная логика для деления на 2 и добавления 0,1 работает для записи в США, но не работает для меньших точек данных.
Мой вопрос: есть ли способ получить отношение\масштаб между плоскостями X и Y, чтобы я мог рассчитать смещение для меток сверху\снизу? (Помимо выдачи команд show x\yrange и считывания вывода)
Я попробовал команду «установить вид, равный xy», но это ничего не изменило, а команда «показать размер» показывает 1,1 для текущего масштаба.
Спасибо Роберто
@theozh - я думаю, ОП не хочет использовать все 3 ярлыка, просто хочет выяснить, как они будут выглядеть, а затем выбирает между ними. Я обновил свой код, используя циклы, как вы рекомендовали.
Вы можете получить доступ к переменным с именем GPVAL_X_MIN
и другими. Итак, вы можете использовать:
charsize=1.5
LEN=3
ratio=1
plot '012_d.dat' every ::9::9 using 3:4:5 w circles title "USA",\
'' every ::9::9 using 3:($4+ratio*$5):2 with labels center offset 0,charsize notitle,\
'' every ::9::9 using ($3-$5):4:2 with labels center offset -LEN,0 notitle,\
'' every ::9::9 using 3:($4-ratio*$5):2 with labels center offset 0,-charsize notitle
ratio=(GPVAL_Y_MAX-GPVAL_Y_MIN)/(GPVAL_X_MAX-GPVAL_X_MIN)
replot
Ключевым моментом (и обратным) решения является то, что GPVAL_X_MIN
(и другие) имеет правильное значение после графика, поэтому вы должны использовать replot
.
ПРИМЕЧАНИЯ
Если вы не преобразуете значение столбца, вам не нужно использовать «$», например. using ($3):($4):($5)
равно using 3:4:5
Если вы снова используете данные (файл) в команде plot
, вам не нужно снова писать имя (файла): ''
.
РЕДАКТИРОВАТЬ
Как вы сказали, вы можете (должны) точно настроить решение: в using 3:($4+ratio*$5):2
вы можете использовать постоянный множитель; и вы можете изменить (уменьшить) charsize. В этом случае смещение меток будет больше зависеть от данных.
Как сказал @theozh, вы можете использовать цикл для сжатия кода. Однако, это более сложно, как я думал сначала:
Сначала подумайте, вы должны использовать что-то вроде:
plot for[i=0:9] '012_d.dat' every ::i::i using 3:4:5 title $2
Однако это не делает никакого ключа. Мой второй, хотя был:
plot for[i=0:9] '012_d.dat' every ::i::i using 3:4:5 title sprintf("%s",$2)
f_sprintf: attempt to print numeric value with string format
Как видите, не лучше. После поиска help plot title
Синтаксис: заголовок <текст> | notitle [< игнорируемый текст>] заголовок столбца | заголовок столбца заголовка (N) {в {начале|конце}} {{нет}улучшенного}
где <текст> — это строка в кавычках или выражение, результатом которого является нить. Кавычки не будут отображаться в ключе. Примечание: начиная с gnuplot версии 5.4, если <текст> является выражением или функцией, это оценивается после построения соответствующей функции или потока данных. Это позволяет заголовку ссылаться на рассчитанные или введенные количества. во время печати, что было невозможно в более ранних версиях gnuplot.
Я обнаружил поддельное задание в части using
:
plot for[i=0:9] '012_d.dat' every ::i::i using ((x=stringcolumn(2)) eq "XXX"?1/0:$3):4:5 title sprintf("%s",x)
что сработало :) С другими частями plot
:
plot for[i=0:9] '012_d.dat' every ::i::i using ((x=stringcolumn(2)) eq "XXX"?1/0:$3):4:5 title sprintf("%s",x),\
for[i=0:9] '' every ::i::i using 3:($4+ratio*$5):2 with labels center offset 0,charsize notitle,\
for[i=0:9] '' every ::i::i using ($3-$5):4:2 with labels center offset -LEN,0 notitle,\
for[i=0:9] '' every ::i::i using 3:($4-ratio*$5):2 with labels center offset 0,-charsize notitle
Спасибо!. Это очень хорошо, и это сработало как шарм Роберто
Есть еще тонкая настройка, которую мне нужно сделать. Я применил измененную логику ко всем другим точкам данных, и метка CAN оказалась ниже, чем USA, и я также должен учитывать возможность увеличения размера шрифта. В любом случае, это отличный подход.
По какой причине вам нужна одна и та же этикетка с 3 сторон? Не было бы достаточно либо сверху, либо слева, либо справа, либо снизу? Кстати, в gnuplot есть циклы for, чтобы сократить вашу длинную команду построения графика.