Можно ли комбинировать xticlabels со splot?

У меня есть такие данные:

0 FRANCK -0.46
0 JUSSE -1.41
1 JUSSE -0.13
1 FRANCK -2.10

и я хочу сделать 3D-график, но мне нужно показать категории (или метки):

splot "map.gnu" using 1:2:3:yticlabels(2) with points palette pointsize 3 pointtype 7

Это дает мне ошибку:

 syntax error near unexpected token `('

person ManInMoon    schedule 03.06.2014    source источник
comment
Насколько я понимаю, с splot вам нужно будет предоставить 4 столбца: три столбца декартовых данных и четвертый для текстовых меток.   -  person Zahaib Akhtar    schedule 03.06.2014


Ответы (2)


Вы также должны указать столбец для значений y. Gnuplot не может автоматически генерировать координаты для одних и тех же строк. Но с 4.6.4 я не получаю сообщение об ошибке, если тестирую ваш код, он говорит мне только warning: No usable data in this plot to auto-scale axis range. All points x value undefined. Если вы предоставите файл в формате

0 0 FRANCK -0.46
0 1 JUSSE -1.41
1 1 JUSSE -0.13
1 0 FRANCK -2.10

и сюжет с

splot "map.gnu" u 1:2:4:yticlabels(3) w p palette ps 3 pt 7

если нормально работает с 4.6.4.

… я сказал, что это не работает с вашим исходным файлом? Это не совсем так ;)

list = ''
index(w) = words(substr(list, 0, strstrt(list, w)-1))
add_label(d) = (strstrt(list, d) == 0 ? list=list.' '.d : '')

splot 'map.gnu' using (d='|'.strcol(2).'|', add_label(d), $1):(index(d)):3:ytic(2) w p palette ps 3 pt 7

Для объяснения см. мой ответ на Gnuplot, построение графика с текстом по оси Y. Результат с 4.6.4:

введите здесь описание изображения

Я видел, что выравнивание ytics нельзя контролировать с помощью left или right. Вы должны использовать offset, чтобы исправить положение метки деления после того, как вы определили свои углы обзора.

person Christoph    schedule 03.06.2014
comment
Ваша версия index(w) отлично работает для меня - большое спасибо - person ManInMoon; 04.06.2014

На мой взгляд, самый простой способ сделать это без изменения вашего файла данных — сопоставить FRANCK, JUSSE и т. д. с числовым массивом, который позволяет gnuplot интерпретировать эти имена как числа. В идеале вы должны определить функцию map(x), которая принимает имя в качестве аргумента и возвращает число, например map("FRANCK") = 0, map("JUSSE") = 1 и т. д.:

map(x) = x eq "FRANCK" ? 0 \
: x eq "JUSSE" ? 1 : 1/0 # You can add more names
splot "map.gnu" u 1:(var = strcol(2), map(var)):3:yticlabels(2) \
with points palette pointsize 3 pointtype 7

введите здесь описание изображения

Конечно, ответ Кристофа более удобен, если вы заранее не знаете, сколько и какие имена присутствуют в файле.

person Miguel    schedule 03.06.2014