修复轴标签中的排版

时间:2013-02-08 20:31:59

标签: r plot typography

序言:我想从R创建出版级图形而不进行后期处理。我所在研究所的其他研究人员总是在图形软件(如Adobe Illustrator)中进行后处理。我希望避免这种情况。

我的抱怨是R不对正数使用正确的减号(特别是在情节轴上):

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

plot with negative numbers

(我已经将犯罪者围了起来考虑。)

有点像排版书呆子(这是真的!检查我的职业生涯简历!)这是不可接受的。我需要在这里使用正确的Unicode字符ᴍɪɴᴜꜱꜱɪɢɴ(U + 2212,“ - ”)。我的一个朋友在发布之前通过替换Adobe Illustrator中的所有减号来实现这一点,但我不禁认为必须有更好的方法 - 从R内部 - 来实现这一目标;和强制我手动替换所有轴标签的那个。

(我目前没有使用ggplot2,但如果有一个只适用于ggplot2的解决方案,我很乐意接受它。)

5 个答案:

答案 0 :(得分:7)

也许手动绘制轴和标签,而不是接受默认值?

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

答案 1 :(得分:5)

另一种方式几乎与Joshua Ulrich提供的方式相同,只是你可以让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

答案 2 :(得分:4)

以下是使用ggplot的方法。 pdf设备不会呈现unicode符号,因此请改用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)

答案 3 :(得分: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=参数(and see here for several ways to do that)的正确值)就是运行它:

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 :(得分:1)

新软件包signs可以完全满足OP的要求。这是网站上的示例:

library(dplyr)
library(ggplot2)
library(ggrepel)

theme_set(theme_gray())
theme_update(panel.grid.minor = element_blank())

p <- 
  ggplot(sleep) +
  aes(group, extra) +
  geom_point() +
  xlab("Drug") +
  ylab("Extra Sleep (hours)")

label_hours <- function(mapping) {
  geom_text_repel(
    mapping,
    nudge_x       = -.1,
    direction     = "y",
    segment.size  = .4,
    segment.color = "grey75",
    hjust         = "right"
  )
}

p +
  label_hours(
    mapping = aes(
      label = case_when(
        group == 1 ~ signs(extra, accuracy = .1), # Unicode minuses
        group == 2 ~ number(extra, accuracy = .1) # ASCII minuses
      )
    )
  ) +
  scale_y_continuous(
    limits = c(-4, 6),
    breaks = seq(-4, 6),
    labels = signs_format(accuracy = .1) # Unicode, analogous to number_format() 
  )

Here is the plot on the website.