我使用了以下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())

生产

然而,我想将facet标签更改为更短的内容(如Hosp 1, Hosp 2…),因为它们现在太长了,看起来很局促(增加图形的高度不是一个选项,它将占用文档中的太多空间)。我查看了facet_grid帮助页面,但不知道如何操作。


当前回答

从米沙巴利亚辛来的一条航线 :

facet_grid(。~vs, labeller = purrr::partial(label_both, sep = " #"))

看看它的实际应用

library(reprex)
library(tidyverse)

mtcars %>% 
  ggplot(aes(x="", y=gear,fill=factor(gear), group=am)) +
  geom_bar(stat="identity", width=1) +
  coord_polar("y", start=0) +
  facet_grid(.~vs, labeller = purrr::partial(label_both, sep = " #"))

由reprex包于2021-07-09创建(v2.0.0)

其他回答

facet_wrap和facet_grid都接受ifelse作为参数的输入。因此,如果用于刻面的变量是合乎逻辑的,解决方案非常简单:

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

如果变量有更多类别,则需要嵌套ifelse语句。

作为一个副作用,这也允许在ggplot调用中创建分面组。

这里有一个避免编辑数据的解决方案:

假设你的图是由你的数据帧的组部分组成的,它有级别控制,test1, test2,然后创建一个由这些值命名的列表:

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

然后创建一个'labeller'函数,并将其推到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列表,并返回列表值(正确的名称)。


请注意,这仅适用于只有一个facet变量的情况。如果您有两个facet,那么您的labeller函数需要为每个facet返回不同的name向量。你可以这样做:

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

其中facet1_names和facet2_names是由facet索引名('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))
  }
}

答自如何改条。ggplot中带有facet和margin=TRUE的文本标签


警告:如果您使用此方法对字符列进行facet,您可能会得到不正确的标签。请参阅此错误报告。在ggplot2的最新版本中修正。

从米沙巴利亚辛来的一条航线 :

facet_grid(。~vs, labeller = purrr::partial(label_both, sep = " #"))

看看它的实际应用

library(reprex)
library(tidyverse)

mtcars %>% 
  ggplot(aes(x="", y=gear,fill=factor(gear), group=am)) +
  geom_bar(stat="identity", width=1) +
  coord_polar("y", start=0) +
  facet_grid(.~vs, labeller = purrr::partial(label_both, sep = " #"))

由reprex包于2021-07-09创建(v2.0.0)

在挣扎了一段时间后,我发现我们可以使用fct_relevel()和fct_recode()从forcats结合来改变facet的顺序以及修复facet标签。我不确定它是否被设计支持,但它确实有效!看看下面的图表:

library(tidyverse)

before <- mpg %>%
  ggplot(aes(displ, hwy)) + 
  geom_point() +
  facet_wrap(~class)
before

after <- mpg %>%
  ggplot(aes(displ, hwy)) + 
  geom_point() + 
  facet_wrap(
    vars(
      # Change factor level name
      fct_recode(class, "motorbike" = "2seater") %>% 
        # Change factor level order
        fct_relevel("compact")
    )
  )
after

由reprex包于2020-02-16创建(v0.3.0)

由于我还不被允许评论帖子,所以我单独发布了这篇文章,作为Vince和son520804的答案的补充。功劳归于他们。

Son520804: 使用虹膜数据: 我认为: 您已经安装了dplyr包,其中有方便的mutate命令 您的数据集名为survey。 调查%>%突变(Hosp1 = Hospital1, Hosp2 = Hospital2,........) 此命令帮助您重命名列,但保留所有其他列。 然后执行同样的facet_wrap,现在就没问题了。

使用Vince的虹膜示例和son520804的部分代码,我使用mutate函数做到了这一点,并在不接触原始数据集的情况下实现了一个简单的解决方案。 诀窍是创建一个替代名称向量,并在管道中使用mutate()临时更正facet名称:

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 ~ .)

在这个例子中,你可以看到i$Species的级别被临时更改为包含在new_names向量中的对应的公共名称。包含

mutate(Species=new_names) %>%

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

警告:如果new_name向量没有正确设置,这可能很容易在名称中引入错误。使用一个单独的函数来替换变量字符串可能会更简洁。请记住,new_name向量可能需要以不同的方式重复,以匹配原始数据集的顺序。请再三检查这是否正确实现。