R ggplot2:如何在geom_文本标签中将字符变量(例如x<;-";.35";)解析为字符,而不是数字

R ggplot2:如何在geom_文本标签中将字符变量(例如x<;-";.35";)解析为字符,而不是数字,r,ggplot2,R,Ggplot2,我正在制作一个用于出版的图形,并希望用一些beta和p值对其进行注释;我所在区域的样式指南规定,这些数字的格式应不带前导零(例如,“0.003”,而不是“0.003”)。我遇到了似乎是第二十二条军规;我已经从我的模型中提取了beta和p值,并进行了一些预处理,以正确设置它们的格式,使它们现在是字符而不是数字: fake.beta.vals <- c(".53", ".29", ".14") fake.p.vals <- c(".034", ".001", ".050") 我已经为这

我正在制作一个用于出版的图形,并希望用一些beta和p值对其进行注释;我所在区域的样式指南规定,这些数字的格式应不带前导零(例如,“0.003”,而不是“0.003”)。我遇到了似乎是第二十二条军规;我已经从我的模型中提取了beta和p值,并进行了一些预处理,以正确设置它们的格式,使它们现在是字符而不是数字:

fake.beta.vals <- c(".53", ".29", ".14")
fake.p.vals <- c(".034", ".001", ".050")
我已经为这个问题绞尽脑汁一段时间了,但是添加了
as.character()

显然也被
parse=TRUE

并添加我以前用于设置值格式的函数:

statformat <- function(val,z){
  sub("^(-?)0.", "\\1.", sprintf(paste("%.",z,"f", sep = ""), val))
}
结果就是一团糟


帮助?

回到我的电脑,重新阅读你的问题后,我发现我误解了这个问题。尝试
I
函数时,我发现它似乎无法与
parse
一起工作

我找到了一种让它工作的方法,这是通过在调用解析时使用'character or the'字符来封装
false.beta.vals
false.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)

p使用
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
#使用bquotw创建标签列表

实验室+1为可复制示例。顺便说一下,对于出版物图形,您可以将pdf导入(例如)Inkscape并删除0。过去,我使用Inkscape编辑我的图形;然而,从历史上看,当评审员要求查看模型上的变体等,然后我不得不手工重新编辑我的所有数据时,我发现这是一种痛苦。我想让我的数字完全照本宣科,这样修改就不那么乏味了。但是我同意Inkscape是一个优秀的程序(开源!耶!)尝试使用
I
函数封装它<代码>?我
告诉我它禁止对象的解释/转换。它应该告诉
ggplot2
按字面意思输入。e、 g.
ggplot(…,label=I(fake.beta.vals),…
。我现在无法测试它,但我非常确定它应该可以工作,所以我只留下这个注释。为什么未命名的函数参数在
映射的参数中位于第三个位置?(感谢您解释为什么我使用
bquote
的努力由于缺少
deparse
步骤而失败。)@Dwin——懒惰。函数参数现在被恰当地命名为
f
。我不是想给它命名,而是想弄清楚它为什么会成功。我原以为它会失败,但也许前两个参数不是
f
的名称,这让它成功了?太棒了!我一直在想属于
deparse
,但不知道如何与
parse=TRUE
适当结合。谢谢!
        label = paste("list(beta ==",
                      statformat(fake.beta.vals, 2),
                      ", italic(p) ==",
                      statformat(fake.p.vals, 3),
                      ")"),
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)
# 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