【问题标题】:How to put label wrapper for ggplot2 plots inside function?如何将 ggplot2 绘图的标签包装器放在函数内?
【发布时间】:2016-01-17 06:40:39
【问题描述】:

我正在尝试编写一个函数来生成 ggplot 图。 Heroka 帮助我让我的功能正常工作。但是现在我有一个问题,关于如何在这个函数中构建一个自动标签包装器inside。我在此看到了类似且非常有用的question,但相同的代码在函数内部不起作用。

我正在重现我当前用于生成以下 ggplot 的函数:

myfunction = function (data, Variable1) {
  ggplot(data=data, aes_string(sprintf("factor(%s)",Variable1), "Variable2"))+
  geom_boxplot(fill="grey", colour="black")+
  labs(title = sprintf("%s and Variable2", Variable1)) +
  labs (x = Variable1, y = "Variable2")
}

当我尝试执行以下操作时(请注意,我正在尝试将标签包装在 ggplot 的调用中:

myfunction = function (data, Variable1) {
  ggplot(data=data, aes_string(sprintf("factor(%s)",Variable1), "Variable2"))+
  geom_boxplot(fill="grey", colour="black")+
  labs(title = sprintf("%s and Variable2", Variable1)) +
  labs (x = Variable1, y = "Variable2")+
# adding the line to wrap the labels
  scale_x_discrete(labels = function(x) str_wrap(x, width = 10))
}

它不起作用(绘图仍然生成,但好像我没有插入那条线) 我很困惑:

  1. 我想我需要将附加行中的 x 更改为我的实际变量?在这种情况下是Variable1,但是当我这样做时它仍然不起作用

  2. 既然我们还在 ggplot 调用中,这又是一个环境问题吗? (例如我们需要在函数中使用aes_string 而不是aes,因为我们在本地环境中)。但是,由于在此函数中增加了一个额外的函数,我不确定我们所处的环境以及如何实现标签换行。

【问题讨论】:

  • 您能否提供一个有助于重现问题的小数据样本?标签应该是什么样子(即您要包装的标签)?

标签: r ggplot2 label


【解决方案1】:

我会说它看起来一样,因为没有什么要包装的,01 太短而无法包装。我把因子加长了,所以 str_wrap 函数可以使用,在这里你可以看到它运行良好:

set.seed(123)
library(stringr)
library(ggplot2)

valstr <- c("This is value 0","This is value 1")

dat <- data.frame(Variable2=rnorm(100),
                  Variable1=valstr,
                  Variable3=sample(valstr,100,T))

myfunction_1 = function (data, Variable1) {
  ggplot(data=data, aes_string(sprintf("factor(%s)",Variable1), "Variable2"))+
    geom_boxplot(fill="grey", colour="black")+
    labs(title = sprintf("%s and Variable2", Variable1)) +
    labs (x = Variable1, y = "Variable2")
}

myfunction_2 = function (data, Variable1) {
  ggplot(data=data, aes_string(sprintf("factor(%s)",Variable1), "Variable2"))+
    geom_boxplot(fill="grey", colour="black")+
    labs(title = sprintf("%s and Variable2", Variable1)) +
    labs (x = Variable1, y = "Variable2")+
    # adding the line to wrap the labels
    scale_x_discrete(labels = function(x) str_wrap(x, width = 10))
}

p1 <- myfunction_1(dat,"Variable1")
p2 <- myfunction_2(dat,"Variable3")
grid.arrange(p1, p2, ncol=2)

屈服:

【讨论】:

  • 谢谢!抱歉,在我的实际数据中,我有更长的标签(不是 0、1)。但我实际上发现了问题,这是我的错,我意识到问题不在于该功能 not 工作,而是我的标签很长,但它们是单个单词。只是为了确认包装器只能包装它是由多个单词组成的标签,对吗? (即在可能发生换行的单词之间有自然的空格),并且包装器不会分解单个长单词(例如 ThisIsAVeryLongLongLongLongLabel)?非常感谢!
猜你喜欢
  • 2013-05-22
  • 2021-12-06
  • 1970-01-01
  • 2014-07-25
  • 1970-01-01
  • 1970-01-01
  • 2011-12-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多