ggplot2:如何在 geom_text 标签中将字符变量(例如 x <- “.35”)解析为字符,而不是数字

Posted

技术标签:

【中文标题】ggplot2:如何在 geom_text 标签中将字符变量(例如 x <- “.35”)解析为字符,而不是数字【英文标题】:ggplot2: How to parse a character variable (e.g. x <- ".35") as character, not number, in geom_text label 【发布时间】:2013-10-10 21:13:18 【问题描述】:

我正在制作一个要发布的图形,并希望用一些 beta 和 p 值对其进行注释;我所在地区的风格指南规定这些数字的格式不带前导零(例如,“.003”,而不是“0.003”)。我遇到了看起来像 Catch-22 的东西。我已经从我的模型中提取了 beta 和 p 值,并进行了一些预处理以正确格式化它们,以便它们现在是字符而不是数字:

fake.beta.vals <- c(".53", ".29", ".14")
fake.p.vals <- c(".034", ".001", ".050")

但是,当我尝试在我的图中使用这些值时,parse = TRUE 会将它们转换回数值,从而丢失了我需要的格式。

fake.beta.vals <- c(".53", ".29", ".14")
fake.p.vals <- c(".034", ".001", ".050")

p <- ggplot(iris, aes(x = Sepal.Length, y = Sepal.Width))
p <- p + 
  geom_smooth(method = "lm") +
  geom_point() +
  facet_wrap( ~ Species)
p

len <-length(levels(iris$Species))
vars <- data.frame(expand.grid(levels(iris$Species)))
colnames(vars) <- c("Species")
betalabs <- as.data.frame(fake.beta.vals)
plabs <- as.data.frame(fake.p.vals)
dat <- data.frame(
  x = rep(7, len),
  y = rep(4, len),
  vars,
  betalabs,
  plabs)
dat$fake.beta.vals <- as.factor(dat$fake.beta.vals)
dat$fake.p.vals <- as.factor(dat$fake.p.vals)

p <- p +
  geom_text(
    aes(x     = x,
        y     = y,
        label = paste("list(beta ==",
                      fake.beta.vals,
                      ", italic(p) ==",
                      fake.p.vals,
                      ")"),
        group = NULL),
    size  = 5,
    data  = dat,
    parse = TRUE)
p

我一直在努力解决这个问题,但添加了as.character()

        label = paste("list(beta ==",
                      as.character(fake.beta.vals),
                      ", italic(p) ==",
                      as.character(fake.p.vals),
                      ")"),

显然也被parse = TRUE抵消了

并添加我以前用来格式化我的值的函数:

statformat <- function(val,z)
  sub("^(-?)0.", "\\1.", sprintf(paste("%.",z,"f", sep = ""), val))

更糟糕的是:

        label = paste("list(beta ==",
                      statformat(fake.beta.vals, 2),
                      ", italic(p) ==",
                      statformat(fake.p.vals, 3),
                      ")"),

最后一团糟。

帮助?

【问题讨论】:

+1 用于可重现的示例。副手,对于出版数字,您可以将 pdf 导入(例如)Inkscape 并删除 0 过去,我使用 Inkscape 来编辑我的图形;但是,从历史上看,当审阅者要求查看模型的变体等时,我发现这很痛苦,然后我必须手动重新编辑所有图形。我希望我的数字完全按照脚本编写,这样修改就不会那么乏味了。但我同意 Inkscape 是一个优秀的程序(开源!耶!) 尝试使用I 函数将其封装起来。 ?I 告诉我它禁止对象的解释/转换。它应该告诉ggplot2 从字面上理解该输入。例如ggplot(..., label=I(fake.beta.vals), ...。我现在无法测试它,但我很确定它应该可以工作,所以我只是留下这个评论。 【参考方案1】:

使用bquote 创建标签,然后使用deparse 强制转换为字符表示

例如

# create a list of labels using bquotw
labs <- Map(.beta = fake.beta.vals, 
            .p = fake.p.vals, 
          f = function(.beta,.p) bquote(list(beta == .(.beta), italic(p) == .(.p))))
# coerce to a character representation for parse=TRUE to work within 
# geom_text
dat <- data.frame(
  x = rep(7, len),
  y = rep(4, len),
  vars,
  labels = sapply(labs,deparse))


p <- ggplot(iris, aes(x = Sepal.Length, y = Sepal.Width)) + 
  geom_smooth(method = "lm") +
  geom_point() +
  facet_wrap( ~ Species) +
  geom_text(data = dat, aes(x=x,y=y,label=labels), parse=TRUE)
p

【讨论】:

为什么未命名的函数参数在Map 的参数中的第三个位置? (感谢您解释为什么由于缺少deparse 步骤而导致我对bquote 的努力失败了。) @Dwin -- 懒惰。函数参数现在被适当地命名为f 我不是想给它命名,而是想弄清楚它为什么会成功。我认为它会失败,但也许前 2 个参数是 f 以外的名称这一事实允许它成功? 太棒了!我一直在想一些deparse,但不知道如何与parse = TRUE 适当结合。谢谢!【参考方案2】:

回到我的电脑并重新阅读你的问题后,我发现我误解了这个问题。试用I函数,发现好像和parse不兼容。

我找到了一种让它工作的方法,这是通过在你的解析调用中用 ` 字符或 ' 字符封装你的 fake.beta.valsfake.p.vals

p <- p +
  geom_text(
    aes(x     = x,
        y     = y,
        label = paste("list(beta ==",
                      "`", fake.beta.vals, "`",
                      ", italic(p) ==",
                      "`", fake.p.vals, "`",
                      ")", 
                      sep=""),
        group = NULL),
    size  = 5,
    data  = dat,
    parse = TRUE)

应该可以。

【讨论】:

以上是关于ggplot2:如何在 geom_text 标签中将字符变量(例如 x <- “.35”)解析为字符,而不是数字的主要内容,如果未能解决你的问题,请参考以下文章

R语言ggplot2可视化在图像中添加竖线并在竖线的两边添加文本标签并对齐实战:添加竖线添加竖线两边的对齐文本标签(Align geom_text with geom_vline )

在堆积条形图中反转 geom_text() (ggplot2)

如何在 R 中的 ggplot2 中更改 geom_text 中的字体颜色?

[R ggplot geom_text打掉背景 - 错误?

如何使用箭头指示的偏移 geom_text() 标签绘制 geom_tile()?

R语言与医学统计图形-16ggplot2几何对象之标签与文本