использование «дингбатоподобных» символов Unicode в R-графике на разных устройствах и платформах, особенно в PDF - PullRequest
20 голосов
/ 04 мая 2011

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

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) 

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

  • в 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.

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

Ответы [ 4 ]

13 голосов
/ 04 мая 2011

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

Примечания Пола можно найти здесь , в которых он предлагаетпара решений с использованием PDF-устройств на основе Cairo, использование cairo_pdf() в системах Linux и Mac OS с соответствующими возможностями или через пакет Cairo под MS Windows.

6 голосов
/ 26 октября 2013

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

Однако есть довольнопростой обходной путь на OS X: используйте «обычное» устройство quartz и установите его type на pdf:

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

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

Существует по крайней мере две другие ошибки:

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

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

3 голосов
/ 10 мая 2011

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

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

В первый раз это займет ДОЛГОЕ время.

0 голосов
/ 04 мая 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...