Ответ 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=""))
Преамбула: Я хочу создать графику класса публикации из R без постобработки. Другие исследователи моего института всегда выполняют постобработку в графическом программном обеспечении (например, Adobe Illustrator). Я надеюсь избежать этого.
Моя проблема в том, что R не использует правильный знак минуса для отрицательных чисел (особенно в осях графика):
plot(-20:-1, rnorm(20) + 1 : 20)
(Ive кружил нарушителей для вашего рассмотрения.)
Как некий типографский ботаник (его правда! Check my Careers CV!), это неприемлемо. Мне нужно использовать правильный символ Юникода ᴍɪɴᴜꜱ ꜱɪɢɴ (U + 2212, "-" ) здесь. Мой друг достигает этого, заменив все минусовые знаки в Adobe Illustrator до публикации, но я не могу помочь, но думаю, что должен быть лучший способ - изнутри R - выполнить это; и тот, который не заставляет меня вручную заменять все метки осей.
(Im в настоящее время не использует ggplot2, но если это решение, которое работает только с ggplot2, я с радостью возьму его.)
Возможно ли рисовать ось и метки вручную, а не принимать значения по умолчанию?
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=""))
Другой способ, который почти такой же, как тот, который был представлен Джошуа Ульрихом, за исключением того, что вы можете позволить 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)
Вот хак, который фиксирует метки осей в строках решетки. Идея состоит в том, чтобы вставить код в низкоуровневую функцию 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)
Вот как это сделать с помощью 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)