(Re)在ggplot2方面调用中命名因子级别(或包括变量名称)

(Re)在ggplot2方面调用中命名因子级别(或包括变量名称),r,ggplot2,dplyr,plyr,R,Ggplot2,Dplyr,Plyr,我经常使用的一种模式是在数值的切面上刻面绘图。ggplot2中的facet_wrap不允许从内部调用函数,因此必须创建一个临时因子变量。使用dplyr中的mutate就可以了。这样做的好处是,您可以进行EDA,改变分位数的数量,或更改以设置切点等,并在一行中查看更改。缺点是,面仅由因子级别标记;你必须知道,例如,它是一个温度。这对你自己来说并不是太糟糕,但是如果我在两个这样的变量上做一个facet_网格,并且必须记住哪个是哪个,即使是我也会感到困惑。因此,能够通过包含一个有意义的名称来重新标记f

我经常使用的一种模式是在数值的切面上刻面绘图。ggplot2中的facet_wrap不允许从内部调用函数,因此必须创建一个临时因子变量。使用dplyr中的mutate就可以了。这样做的好处是,您可以进行EDA,改变分位数的数量,或更改以设置切点等,并在一行中查看更改。缺点是,面仅由因子级别标记;你必须知道,例如,它是一个温度。这对你自己来说并不是太糟糕,但是如果我在两个这样的变量上做一个facet_网格,并且必须记住哪个是哪个,即使是我也会感到困惑。因此,能够通过包含一个有意义的名称来重新标记facet真的很好

这个问题的关键点是,随着分位数等数量的改变,电平也会发生变化。;你事先不知道它们是什么。可以使用base levels()函数,但这意味着使用cut变量扩充数据帧,然后调用levels(),然后将此扩充数据帧传递给ggplot()

因此,使用plyr::mapvalues,我们可以将所有这些都封装到一个dplyr::mutate中,但是mapvalues()所需的参数使它非常笨拙。必须多次重新键入“Temp.f”不是很“dplyr”

有没有一种更简洁的方式将这些因素水平更名为“动态”?我希望这个描述足够清晰,下面的代码示例会有所帮助

library(ggplot2)
library(plyr)
library(dplyr)
library(Hmisc)
df <- data.frame(Temp = seq(-100, 100, length.out = 1000), y = rnorm(1000))

# facet_wrap doesn't allow functions so have to create new, temporary factor
# variable Temp.f
ggplot(df %>% mutate(Temp.f = cut2(Temp, g = 4))) + geom_histogram(aes(x = y)) + facet_wrap(~Temp.f)
# fine, but facet headers aren't very clear,
# we want to highlight that they are temperature
ggplot(df %>% mutate(Temp.f = paste0("Temp: ", cut2(Temp, g = 4)))) + geom_histogram(aes(x = y)) + facet_wrap(~Temp.f)
# use of paste0 is undesirable because it creates a character vector and
# facet_wrap then recodes the levels in the wrong numerical order

# This has the desired effect, but is very long!
ggplot(df %>% mutate(Temp.f = cut2(Temp, g = 4), Temp.f = mapvalues(Temp.f, levels(Temp.f), paste0("Temp: ", levels(Temp.f))))) + geom_histogram(aes(x = y)) + facet_wrap(~Temp.f)
库(ggplot2)
图书馆(plyr)
图书馆(dplyr)
图书馆(Hmisc)
df%变异(温度f=paste0(“温度:”,cut2(温度,g=4)))+geom_直方图(aes(x=y))+facet_包裹(~Temp.f)
#使用paste0是不可取的,因为它会创建字符向量和
#然后按错误的数字顺序重新编码级别
#这有预期的效果,但很长!
ggplot(df%>%突变(温度f=cut2(温度,g=4),温度f=mapvalues(温度f,级别(温度f)),paste0(“温度:”,级别(温度f‘‘‘‘‘‘‘))+geom_直方图(aes(x=y))+镶嵌面包裹(~Temp.f)

我认为您可以在
facet\u wrap
中使用自定义标签功能来完成此操作,如下所示:

myLabeller <- function(x){
  lapply(x,function(y){
    paste("Temp:", y)
  })
}

ggplot(df %>% mutate(Temp.f = cut2(Temp, g = 4))) +
  geom_histogram(aes(x = y)) +
  facet_wrap(~Temp.f
             , labeller = myLabeller)

我认为您可以在
facet\u wrap
中使用自定义标签功能来完成此操作,如下所示:

myLabeller <- function(x){
  lapply(x,function(y){
    paste("Temp:", y)
  })
}

ggplot(df %>% mutate(Temp.f = cut2(Temp, g = 4))) +
  geom_histogram(aes(x = y)) +
  facet_wrap(~Temp.f
             , labeller = myLabeller)

好的,感谢马克·彼得森为我指出了labeller参数/函数,我满意的确切答案是:

ggplot(df %>% mutate(Temp.f = cut2(Temp, g = 4))) + geom_histogram(aes(x = y)) + facet_wrap(~Temp.f, labeller = labeller(Temp.f = label_both))

我是lazy的粉丝,“label_both”意味着我可以简单地创建一个有意义的临时(或覆盖原始)变量列,并给出名称和值。滚动您自己的labeller函数更强大,但同时使用label_是一个好的、简单的选择。

好的,感谢Mark Peterson为我指出labeller参数/函数,我满意的确切答案是:

ggplot(df %>% mutate(Temp.f = cut2(Temp, g = 4))) + geom_histogram(aes(x = y)) + facet_wrap(~Temp.f, labeller = labeller(Temp.f = label_both))

我是lazy的粉丝,“label_both”意味着我可以简单地创建一个有意义的临时(或覆盖原始)变量列,并给出名称和值。滚动您自己的labeller功能更强大,但同时使用label_是一个好方法,简单选项。

使用
df$newFactor作为
cut2
的替代方案,在打印前重命名因子。您还可以使用
labels
参数从基R开始使用
cut
函数。使用
df$newFactor作为
cut2
的替代方案,在打印前重命名因子,您还可以使用
使用
标签
参数从基R切下
函数。