20

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

我的抱怨是 R 没有对负数使用正确的减号(尤其是在绘图轴中):

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

用负数绘制

(我已经圈出违规者供您考虑。)

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

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

4

5 回答 5

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=""))

在此处输入图像描述

于 2013-02-08T20:55:30.447 回答
5

这是使用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)
于 2014-01-23T16:30:02.857 回答
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)

在此处输入图像描述

于 2013-02-08T21:34:28.257 回答
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)
于 2013-02-09T03:44:33.287 回答
3

新包装标志完全符合 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() 
  )

这是网站上的情节。

于 2020-04-03T13:21:15.963 回答