Как получить связь между диапазонами X и Y в gnuplot

Я рисую данные, используя такие круги:

$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 для текущего масштаба.

Спасибо Роберто

По какой причине вам нужна одна и та же этикетка с 3 сторон? Не было бы достаточно либо сверху, либо слева, либо справа, либо снизу? Кстати, в gnuplot есть циклы for, чтобы сократить вашу длинную команду построения графика.

theozh 04.08.2023 21:39

@theozh - я думаю, ОП не хочет использовать все 3 ярлыка, просто хочет выяснить, как они будут выглядеть, а затем выбирает между ними. Я обновил свой код, используя циклы, как вы рекомендовали.

Tom Solid 07.08.2023 09:21
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
2
51
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете получить доступ к переменным с именем 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.

ПРИМЕЧАНИЯ

  1. Если вы не преобразуете значение столбца, вам не нужно использовать «$», например. using ($3):($4):($5) равно using 3:4:5

  2. Если вы снова используете данные (файл) в команде plot, вам не нужно снова писать имя (файла): ''.

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

  1. Как вы сказали, вы можете (должны) точно настроить решение: в using 3:($4+ratio*$5):2 вы можете использовать постоянный множитель; и вы можете изменить (уменьшить) charsize. В этом случае смещение меток будет больше зависеть от данных.

  2. Как сказал @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

Спасибо!. Это очень хорошо, и это сработало как шарм Роберто

Marionette_66 04.08.2023 18:23

Есть еще тонкая настройка, которую мне нужно сделать. Я применил измененную логику ко всем другим точкам данных, и метка CAN оказалась ниже, чем USA, и я также должен учитывать возможность увеличения размера шрифта. В любом случае, это отличный подход.

Marionette_66 04.08.2023 19:36

Другие вопросы по теме