如何改变小标签?如何改变小标签?(How to change facet labels?)

2019-05-11 06:31发布

我已经使用了以下ggplot命令:

ggplot(survey, aes(x = age)) + stat_bin(aes(n = nrow(h3), y = ..count.. / n), binwidth = 10)
  + scale_y_continuous(formatter = "percent", breaks = c(0, 0.1, 0.2))
  + facet_grid(hospital ~ .)
  + theme(panel.background = theme_blank())

生产

我想不过来改变标签,以更短的东西(如Hosp 1Hosp 2 ...),因为它们太长现在看起来局促(增加图表的高度是不是一种选择,它会采取在文档中太多的空间)。 我看着facet_grid帮助页,但无法弄清楚如何。

Answer 1:

喜欢的东西改变基本因素级别名称:

# Using the Iris data
> i <- iris
> levels(i$Species)
[1] "setosa"     "versicolor" "virginica" 
> levels(i$Species) <- c("S", "Ve", "Vi")
> ggplot(i, aes(Petal.Length)) + stat_bin() + facet_grid(Species ~ .)


Answer 2:

下面是避免编辑数据的解决方案:

说你的情节是由刻面group的数据帧,其中有水平的部分control, test1, test2 ,然后创建一个由这些值命名的列表:

hospital_names <- list(
  'Hospital#1'="Some Hospital",
  'Hospital#2'="Another Hospital",
  'Hospital#3'="Hospital Number 3",
  'Hospital#4'="The Other Hospital"
)

然后创建一个“贴标机”的功能,并将其推入您的通话facet_grid:

hospital_labeller <- function(variable,value){
  return(hospital_names[value])
}

ggplot(survey,aes(x=age)) + stat_bin(aes(n=nrow(h3),y=..count../n), binwidth=10)
 + facet_grid(hospital ~ ., labeller=hospital_labeller)
 ...

这将使用数据帧的水平,指数hospital_names列表,返回列表值(正确的名称)。


请注意,如果你只有一个小面变量这仅适用。 如果你有两个方面,那么你的贴标机的功能需要返回一个不同的名称向量每个面。 你可以像这样做:

plot_labeller <- function(variable,value){
  if (variable=='facet1') {
    return(facet1_names[value])
  } else {
    return(facet2_names[value])
  }
}

其中facet1_namesfacet2_names是由小面索引名称索引名称的预定义列表(“Hostpital#1”等)。


编辑:如果你通过一个变量/值的组合,贴标签机不知道以上方法失效。 您可以添加一个故障安全的这样的未知变量:

plot_labeller <- function(variable,value){
  if (variable=='facet1') {
    return(facet1_names[value])
  } else if (variable=='facet2') {
    return(facet2_names[value])
  } else {
    return(as.character(value))
  }
}

答案改编自如何与小面和利润率= TRUE改变strip.text标签在ggplot


编辑: 警告 :如果您使用此方法方面通过字符列,你可能会得到不正确的标签。 见这个错误报告 。 最近版本的GGPLOT2。



Answer 3:

这里的另一个解决方案是由@ naught101给出的精神,但更简单,也不会扔在GGPLOT2的最新版本的警告。

基本上,你首先要创建一个命名字符矢量

hospital_names <- c(
                    `Hospital#1` = "Some Hospital",
                    `Hospital#2` = "Another Hospital",
                    `Hospital#3` = "Hospital Number 3",
                    `Hospital#4` = "The Other Hospital"
                    )

然后你使用它作为一个贴标机,只需通过修改给出的代码的最后一行@ naught101到

... + facet_grid(hospital ~ ., labeller = as_labeller(hospital_names))

希望这可以帮助。



Answer 4:

以下是我有做的facet_grid(yfacet~xfacet)使用GGPLOT2,版本2.2.1:

facet_grid(
    yfacet~xfacet,
    labeller = labeller(
        yfacet = c(`0` = "an y label", `1` = "another y label"),
        xfacet = c(`10` = "an x label", `20` = "another x label")
    )
)

请注意,这不包含呼叫as_labeller() -这是我用了一段挣扎。

这种方法是通过最后的榜样激励上的帮助页面强制到贴标机的功能 。



Answer 5:

如果你有两个方面hospitalroom ,但要重命名只有一个,你可以使用:

facet_grid( hospital ~ room, labeller = labeller(hospital = as_labeller(hospital_names)))

对于重命名使用基于矢量的方法两个方面(如naught101的答案),你可以这样做:

facet_grid( hospital ~ room, labeller = labeller(hospital = as_labeller(hospital_names),
                                                 room = as_labeller(room_names)))


Answer 6:

请注意,此解决方案将不会在情况下ggplot将显示较少的因素,而不是你的变量实际上包含了(这可能发生,如果你已经例如子集)很好地工作:

 library(ggplot2)
 labeli <- function(variable, value){
  names_li <- list("versicolor"="versi", "virginica"="virg")
  return(names_li[value])
 }

 dat <- subset(iris,Species!="setosa")
 ggplot(dat, aes(Petal.Length)) + stat_bin() + facet_grid(Species ~ ., labeller=labeli)

一个简单的解决(除了添加在names_li所有未使用的因素,这些因素可能是乏味)是放弃与droplevels()未使用的因素,无论是在原始数据集,或在labbeler功能,请参阅:

labeli2 <- function(variable, value){
  value <- droplevels(value)
  names_li <- list("versicolor"="versi", "virginica"="virg")
  return(names_li[value])
}

dat <- subset(iris,Species!="setosa")
ggplot(dat, aes(Petal.Length)) + stat_bin() + facet_grid(Species ~ ., labeller=labeli2)


Answer 7:

该解决方案是非常接近到什么@domi了,但旨在通过取前4个字母和最后一个数字,以缩短名称。

library(ggplot2)

# simulate some data
xy <- data.frame(hospital = rep(paste("Hospital #", 1:3, sep = ""), each = 30),
                 value = rnorm(90))

shortener <- function(string) {
  abb <- substr(string, start = 1, stop = 4) # fetch only first 4 strings
  num <- gsub("^.*(\\d{1})$", "\\1", string) # using regular expression, fetch last number
  out <- paste(abb, num) # put everything together
  out
}

ggplot(xy, aes(x = value)) +
  theme_bw() +
  geom_histogram() +
  facet_grid(hospital ~ ., labeller = labeller(hospital = shortener))



Answer 8:

无论facet_wrapfacet_grid也接受输入ifelse作为参数。 因此,如果用于小面的变量是合乎逻辑的,解决方法很简单:

facet_wrap(~ifelse(variable, "Label if true", "Label if false"))

如果变量有多个类别中, ifelse语句需要进行嵌套 。

作为一个副作用,这也使集团的创立到内刻面ggplot电话。



Answer 9:

我认为,所有其他的解决方案是真正的帮助做到这一点,但还有另一种方式。

我假设:

  • 你已经安装了dplyr包,里面有方便mutate命令,
  • 数据集被命名为survey

    调查%>%突变(Hosp1 = Hospital1,Hosp2 = Hospital2,........)

此命令可以帮助你重命名列,但所有其他列将被保留。

然后做同样的facet_wrap ,你现在都很好。



Answer 10:

与贴标机的功能确定指标variable, value作为参数不会为我工作。 此外,如果你想使用表达式,你需要lapply使用,并不能简单地使用arr[val]作为参数传递给函数是一个data.frame。

这段代码做了工作:

libary(latex2exp)
library(ggplot2)
arr <- list('virginica'=TeX("x_1"), "versicolor"=TeX("x_2"), "setosa"=TeX("x_3"))
mylabel <- function(val) { return(lapply(val, function(x) arr[x])) }
ggplot(iris, aes(x=Sepal.Length, y=Sepal.Width)) + geom_line() + facet_wrap(~Species, labeller=mylabel)


Answer 11:

由于我还没有允许对帖子进行评论,我分别作为附录发布此文斯的回答和son520804的答案 。 幸得他们。

Son520804:

使用虹膜数据:

我假设:
您已经安装了dplyr包,里面有方便发生变异命令,数据集被命名为调查。 survey %>% mutate(Hosp1 = Hospital1, Hosp2 = Hospital2,........)这个命令可以帮助你重命名列,但所有其他列将被保留。 然后做同样的facet_wrap,你现在都很好。

使用文斯的虹膜示例和son520804的部分代码,我没有这与发生变异的功能和不接触的原始数据集实现一个简单的解决方案。 关键是要建立一个独立的名称向量和使用发生变异()管道内暂时纠正面的名称:

i <- iris

levels(i$Species)
[1] "setosa"     "versicolor" "virginica"

new_names <- c(
  rep("Bristle-pointed iris", 50), 
  rep("Poison flag iris",50), 
  rep("Virginia iris", 50))

i %>% mutate(Species=new_names) %>% 
ggplot(aes(Petal.Length))+
    stat_bin()+
    facet_grid(Species ~ .)

在这个例子中,你可以看到我的$种暂时变更为与包含在new_names向量共名的水平。 包含行

mutate(Species=new_names) %>%

可以很容易地被去除,露出原来的命名。

谨慎的字:这可能很容易地在名称中引入错误如果new_name的载体没有正确设置。 或许,这将是更清洁的使用单独的功能,以取代变量的字符串。 请记住,new_name的载体可能需要以不同的方式,使其与原始数据集的顺序重复。 请仔细 - 和 - 三重检查,这是正确的实现。



Answer 12:

只是延长naught101的答案 - 归功于他

plot_labeller <- function(variable,value, facetVar1='<name-of-1st-facetting-var>', var1NamesMapping=<pass-list-of-name-mappings-here>, facetVar2='', var2NamesMapping=list() )
{
  #print (variable)
  #print (value)
  if (variable==facetVar1) 
    {
      value <- as.character(value)
      return(var1NamesMapping[value])
    } 
  else if (variable==facetVar2) 
    {
      value <- as.character(value)
      return(var2NamesMapping[value])
    } 
  else 
    {
      return(as.character(value))
    }
}

你所要做的是名至名称映射创建一个列表

clusteringDistance_names <- list(
  '100'="100",
  '200'="200",
  '300'="300",
  '400'="400",
  '600'="500"
)

并重新定义plot_labeller()与新的默认参数:

plot_labeller <- function(variable,value, facetVar1='clusteringDistance', var1NamesMapping=clusteringDistance_names, facetVar2='', var1NamesMapping=list() )

然后:

ggplot() + 
  facet_grid(clusteringDistance ~ . , labeller=plot_labeller) 

或者每个标签的变化,你想拥有你可以创建一个专门的功能。



Answer 13:

我有另一种方式来达到同样的目的,而不改变基本的数据:

ggplot(transform(survey, survey = factor(survey,
        labels = c("Hosp 1", "Hosp 2", "Hosp 3", "Hosp 4"))), aes(x = age)) +
  stat_bin(aes(n = nrow(h3),y=..count../n), binwidth = 10) +
  scale_y_continuous(formatter = "percent", breaks = c(0, 0.1, 0.2)) +
  facet_grid(hospital ~ .) +
  opts(panel.background = theme_blank())

我上面所做的是改变因素的标签,在原始数据帧,并与您的原代码相比,唯一的区别。



Answer 14:

改变,而无需修改基本数据的最简单的方法是:

1)使用创建的对象as_labeller功能附加背面刻度标记用于每个默认值的

hum.names <- as_labeller(c(`50` = "RH% 50", `60` = "RH% 60",`70` = "RH% 70", `80` = "RH% 80",`90` = "RH% 90", `100` = "RH% 100")) #Necesarry to put RH% into the facet labels

2)我们加入到GGplot:

ggplot(dataframe, aes(x=Temperature.C,y=fit))+geom_line()+ facet_wrap(~Humidity.RH., nrow=2,labeller=hum.names)


Answer 15:

添加类似于@ DOMI与解析数学符号,上标,下标,括号/支架,.etc另一种解决方案。

library(tidyverse)
theme_set(theme_bw(base_size = 18))

### create separate name vectors
# run `demo(plotmath)` for more examples of mathematical annotation in R
am_names <- c(
  `0` = "delta^{15}*N-NO[3]^-{}",
  `1` = "sqrt(x,y)"
)

# use `scriptstyle` to reduce the size of the parentheses &
# `bgroup` to make adding `)` possible 
cyl_names <- c(
  `4` = 'scriptstyle(bgroup("", a, ")"))~T~-~5*"%"',
  `6` = 'scriptstyle(bgroup("", b, ")"))~T~+~10~degree*C',
  `8` = 'scriptstyle(bgroup("", c, ")"))~T~+~30*"%"'
)

ggplot(mtcars, aes(wt, mpg)) + 
  geom_jitter() +
  facet_grid(am ~ cyl,
             labeller = labeller(am  = as_labeller(am_names,  label_parsed),
                                 cyl = as_labeller(cyl_names, label_parsed))
             ) +
  geom_text(x = 4, y = 25, size = 4, nudge_y = 1,
            parse = TRUE, check_overlap = TRUE,
            label = as.character(expression(paste("Log"["10"], bgroup("(", frac("x", "y"), ")")))))

### OR create new variables then assign labels directly
# reverse facet orders just for fun
mtcars <- mtcars %>% 
  mutate(am2  = factor(am,  labels = am_names),
         cyl2 = factor(cyl, labels = rev(cyl_names), levels = rev(attr(cyl_names, "names")))
  )

ggplot(mtcars, aes(wt, mpg)) + 
  geom_jitter() +
  facet_grid(am2 ~ cyl2,
             labeller = label_parsed) +
  annotate("text", x = 4, y = 30, size = 5,
           parse = TRUE, 
           label = as.character(expression(paste("speed [", m * s^{-1}, "]"))))

由创建于2019年3月30日reprex包 (v0.2.1.9000)



Answer 16:

您是否尝试过改变你的特定级别Hospital载体?

levels(survey$hospital)[levels(survey$hospital) == "Hospital #1"] <- "Hosp 1"
levels(survey$hospital)[levels(survey$hospital) == "Hospital #2"] <- "Hosp 2"
levels(survey$hospital)[levels(survey$hospital) == "Hospital #3"] <- "Hosp 3"


Answer 17:

这是为我工作。

定义一个因素:

hospitals.factor<- factor( c("H0","H1","H2") )

和使用,在ggplot()

facet_grid( hospitals.factor[hospital] ~ . )


文章来源: How to change facet labels?