Отображение подчеркивания, а не индекса в заголовках gnuplot

Короткий вопрос: Как отобразить символ _ (подчеркивание) в заголовке в gnuplot, который назначен из имени переменной в gnuplot?

Подробнее: У меня есть что-то вроде следующего кода:

items = "foo_abc foo_bcd bar_def"
do for [item in items] {
  set title item
  set output item.eps
  plot item."-input.txt" using 1:2 title item with linespoints
}

Это отлично работает с gnuplot, за исключением того, что заголовок изменен с foo_abc на foo a bc. Я не знаю, хочу ли я использовать escape-символ, потому что я не хочу, чтобы это было в имени файла. Я пробовал пару различных вариантов с одиночными или двойными кавычками, но я еще не нашел того, что мне нужно.

Ответы

Ответ 1

Если вы используете расширенный терминал eps, это причина, по которой вам необходимо избежать подчеркивания в первую очередь. Сегодня был другой связанный вопрос, который немного объясняет проблему. Когда вы устанавливаете терминал, попробуйте:

set terminal postscript noenhanced <whatever else here...>

Это работает для меня (Arch linux, gnuplot 4.7.0). Если расширенный терминал имеет важное значение, ниже приведено частичное решение. Предполагается, что подчеркивание всегда появляется в одном и том же месте в строке.

set terminal postscript enhanced
items = 'foo\_abc foo\_bcd bar\_def'
do for [item in items] {
  set output item[1:3].item[5:*].'.eps'
  set title item
  plot sin(x)
}

Таким образом вы можете избежать подчеркивания и не указывать\в имени файла. Обратите внимание на использование одинарных кавычек для строки "items"; см. ранее связанный вопрос для деталей.

Ответ 2

Большинство команд gnuplot, которые генерируют метки, принимают ключевое слово noenhanced, которое предотвратит использование gnuplot расширенного текста только для этой строки. В этом случае должно быть достаточно просто:

set title item noenhanced

Альтернативой является создание функции, которая удаляет ненужный текст из строки при передаче ее в set output:

remove(x,s)=(i0=strstrt(s,x),i0 ? remove(x,s[:i0-1].s[i0+strlen(x):]):s)
# Makes me wish gnuplot syntax was more pythonic :-p
#TODO:  Write a `replace` function :-).  These just might go into my ".gnuplot" file...

Я использую встроенную функцию, чтобы найти индекс первого вхождения x в строке s. Затем я удаляю это событие через конкатенацию строк и нарезку и рекурсивно вызываю функцию снова, чтобы удалить следующее возникновение. Если индекс не найден (strstrt возвращает 0), мы просто возвращаем строку, в которую была введена. Теперь вы можете сделать:

set output remove('\',item)
set title item

Ответ 3

Вместо foo_abc напишите foo\\\_abc.

Ответ 4

Подчеркивание происходит от обработки названий как "расширенный текст". Отключите это, используя

установить ключ noenhanced

Ответ 5

У меня была такая же проблема с подчеркиванием в заголовке: например, мне нужно было написать 4_3 подкадр, и мне нужен расширенный постскрипт. Путь SIMPLEST оказался из соседнего сообщения: "Если вы используете расширенный терминал eps, это причина, по которой вам необходимо избегать подчеркивания в первую очередь. Сегодня был еще один связанный с этим вопрос, который немного объясняет проблему. - Как создается @gnuplot? Итак, я последовал их советам, и это сработало:

plot 'LC.stats' u 3: 4 ti "{/= 15 1350 звезд в C18 4\_3 подкадра}" - Двойной escape-символ перед подчеркиванием.