Используя глифоры Unicode "dingbat-like" в графике R, через устройства и платформы, особенно PDF

Некоторые из вас, возможно, видели мой сообщение в блоге по этой теме, где я написал следующий код после того, как захотел помогите другу создать полузаполненные круги как точки на графике:

TestUnicode <- function(start="25a0", end="25ff", ...)
  {
    nstart <- as.hexmode(start)
    nend <- as.hexmode(end)
    r <- nstart:nend
    s <- ceiling(sqrt(length(r)))
    par(pty="s")
    plot(c(-1,(s)), c(-1,(s)), type="n", xlab="", ylab="",
         xaxs="i", yaxs="i")
    grid(s+1, s+1, lty=1)
    for(i in seq(r)) {
      try(points(i%%s, i%/%s, pch=-1*r[i],...))
    }
  }

TestUnicode(9500,9900) 

Это работает (т.е. создает почти полную сетку символов холодного dingbatty):

  • на Ubuntu 10.04, на устройстве X11 или PNG
  • в дистрибутиве Mandriva Linux, в том же устройстве, с локально построенным R, после установки pango-devel

Он не имеет разной степени (т.е. создает сетку, частично или полностью заполненную точками или пустыми прямоугольниками) либо молча, либо с предупреждениями:

  • на том же компьютере Ubuntu 10.04 в формате PDF или PostScript (попробовавший настройку font = "NimbusSan" использовать шрифты URW, не помогает)
  • на MacOS X.6 (кварц, X11, Каир, PDF)

Например, попробуйте все доступные семейства шрифтов PDF:

flist <- c("AvantGarde", "Bookman","Courier", "Helvetica", "Helvetica-Narrow",
        "NewCenturySchoolbook", "Palatino", "Times","URWGothic",
        "URWBookman", "NimbusMon", "NimbusSan", "NimbusSanCond",
        "CenturySch", "URWPalladio","NimbusRom")

for (f in flist) {
  fn <- paste("utest_",f,".pdf",sep="")
  pdf(fn,family=f)
  TestUnicode()
  title(main=f)
  dev.off()
  embedFonts(fn)
}

в Ubuntu, ни один из этих файлов не содержит символов.

Было бы неплохо заставить его работать как можно больше комбинаций, но особенно в каком-то векторном формате и дважды, особенно в PDF.

Любые предложения по настройке шрифтовых/графических устройств, которые могли бы сделать эту работу, были бы приветствованы.

Ответ 1

Я думаю, вам не повезло с Бен, так как, согласно некоторым заметкам Пола Мурелла, pdf() может обрабатывать только однобайтовые кодировки. Многобайтовые кодировки необходимо преобразовать в однобайтовый эквивалент, и в этом заключается руб; по определению, однобайтовые кодировки не могут содержать все глифы, которые могут быть представлены в многобайтовой кодировке, например, UTF-8.

Заметки Paul можно найти здесь, где он предлагает пару решений с использованием цифровых устройств на базе Каира, используя cairo_pdf() на подходящих Linux и Mac OS или через пакет Cairo под MS Windows.

Ответ 2

Я обнаружил, что устройство cairo_pdf будет полностью недостаточным: вывод заметно отличается от вывода pdf и на экране, а его поддержка plotmath является отрывочной.

Однако, это довольно простой способ обхода OS X: используйте "нормальное" устройство quartz и установите его type на pdf:

quartz(type = 'pdf', file = 'output.pdf')

К сожалению, на моем компьютере это игнорирует семейство шрифтов и всегда использует Helvetica (хотя в документации утверждается, что по умолчанию Arial).

Есть как минимум две другие ошибки:

  • pdf преобразует дефисы в минусы. Возможно, это даже не всегда то, что вы хотите, но достаточно полезно для правильного набора отрицательных чисел. Связанный поток описывает обходные пути для этого.
  • Это, конечно же, специфичная для платформы и работает только на OS X.

(Я понимаю, что OP кратко упоминает кварцевое устройство, но этот поток часто просматривается, и я думаю, что это решение нуждается в большей известности.)

Ответ 3

Другим решением может быть использование tikzDevice, который теперь может использовать XeLaTeX с символами Unicode. Затем полученный файл tex можно скомпилировать для создания pdf файла. Проблема в том, что у вас должен быть шрифт в вашей системе, содержащий символы.

library(tikzDevice)
options(tikzXelatexPackages=c(getOption('tikzXelatexPackages'),
    '\\setromanfont{Courier New}'))
tikz(engine='xetex',standAlone=T)
TestUnicode(9500,9900)
dev.off()

В первый раз это займет время LONG.

Ответ 4

Пробовали ли вы встраивать шрифт в PDF файл или в том числе для пользователей Mac, которые будут работать?