Исправить типографию в осях

Преамбула: Я хочу создать графику класса публикации из R без постобработки. Другие исследователи моего института всегда выполняют постобработку в графическом программном обеспечении (например, Adobe Illustrator). Я надеюсь избежать этого.

Моя проблема в том, что R не использует правильный знак минуса для отрицательных чисел (особенно в осях графика):

plot(-20:-1, rnorm(20) + 1 : 20)

plot with negative numbers

(Ive кружил нарушителей для вашего рассмотрения.)

Как некий типографский ботаник (его правда! Check my Careers CV!), это неприемлемо. Мне нужно использовать правильный символ Юникода ᴍɪɴᴜꜱ ꜱɪɢɴ (U + 2212, "-" ) здесь. Мой друг достигает этого, заменив все минусовые знаки в Adobe Illustrator до публикации, но я не могу помочь, но думаю, что должен быть лучший способ - изнутри R - выполнить это; и тот, который не заставляет меня вручную заменять все метки осей.

(Im в настоящее время не использует ggplot2, но если это решение, которое работает только с ggplot2, я с радостью возьму его.)

Ответ 1

Возможно ли рисовать ось и метки вручную, а не принимать значения по умолчанию?

plot(-20:-1, rnorm(20) + 1 : 20, xaxt="n")
Axis(-20:-1, at=seq(-20,-5,5), side=1,
  labels=paste("\U2212",seq(20,5,-5),sep=""))

enter image description here

Ответ 2

Другой способ, который почти такой же, как тот, который был представлен Джошуа Ульрихом, за исключением того, что вы можете позволить R вычислить галочки оси:

plot(-20:-1, rnorm(20) + 1 : 20, xaxt="n")
at <- axTicks(1, usr=par("usr")[1:2])
labs <- gsub("-", "\U2212", print.default(at))
axis(1, at=at, labels=labs)

enter image description here

Ответ 3

Вот хак, который фиксирует метки осей в строках решетки. Идея состоит в том, чтобы вставить код в низкоуровневую функцию panel.axis(), которая вызывается большинством/всеми функциями построения верхнего уровня.

Здесь (с несколькими строками контекста выше и ниже) находится код, который вы вставляете "вручную" после вызова library(lattice); trace("panel.axis", edit=TRUE):

if (draw.labels && !is.null(labels)) {
    {
        labels <- gsub("-", "\U2212", labels)  ## <- My addition
        Encoding(labels) <- "UTF-8"            ## <- My addition
        just <- if (outside) 
            switch(side, bottom = if (rot[1] == 0) c("centre", 

Лучшая опция (после того, как вы указали правильное значение аргумента at= (и посмотрите здесь несколько способов сделать это)) для запуска это:

library(lattice)

trace(what = "panel.axis",
      tracer = quote({labels <- gsub("-", "\U2212", labels)
                      Encoding(labels) <- "UTF-8"}),
      at = list(c(30,3,2,2)))

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

Чтобы сравнить на вашем собственном экранном устройстве, запустите блок кода непосредственно выше, а затем:

xyplot(1:10 ~ -1:-10)
untrace("panel.axis")
windows()
xyplot(1:10 ~ -1:-10)

Ответ 4

Вот как это сделать с помощью ggplot. Устройство pdf не отображает символы юникода, поэтому используйте cairo_pdf.

unicode_minus <- function(x) sub('^-', '\U2212', format(x))

# change the default scales
scale_x_continuous <- function(..., labels=unicode_minus)
                        ggplot2::scale_x_continuous(..., labels=labels)
scale_y_continuous <- function(..., labels=unicode_minus)
                        ggplot2::scale_y_continuous(..., labels=labels)

qplot(-20:-1, rnorm(20) + 1:20)