贴标机功能定义 variable, value 因为论据对我不起作用。此外,如果你想使用表达式,你需要使用lapply而不能简单地使用 arr[val] ,因为函数的参数是data.frame。
variable, value
arr[val]
这段代码确实有效:
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)
请注意,如果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)
我有另一种方法来实现相同的目标,而无需更改基础数据:
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())
我上面所做的是更改原始数据框中因子的标签,这是与原始代码相比的唯一区别。
我认为所有其他解决方案对此非常有帮助,但还有另一种方法。
我假设:
dplyr
mutate
您的数据集已命名 survey 。
survey
调查%&gt;% 变异(Hosp1 = Hospital1,Hosp2 = Hospital2,........)
此命令可帮助您重命名列,但保留所有其他列。
然后做同样的事情 facet_wrap 你现在好了
facet_wrap
这个解决方案非常接近@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))
都 facet_wrap 和 facet_grid 也接受来自的输入 ifelse 作为一个论点。因此,如果用于分面的变量是合乎逻辑的,那么解决方案非常简单:
facet_grid
ifelse
facet_wrap(~ifelse(variable, "Label if true", "Label if false"))
如果变量有更多类别,那么 ifelse 声明需要 嵌套 。
作为一个副作用,这也允许创建在其中面对的组 ggplot 呼叫。
ggplot
如果你有两个方面 hospital 和 room 但是想重命名只有一个,你可以使用:
hospital
room
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)))
这对我有用。
定义一个因素:
hospitals.factor<- factor( c("H0","H1","H2") )
和使用,在 ggplot() :
ggplot()
facet_grid( hospitals.factor[hospital] ~ . )
只是扩大了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()
plot_labeller <- function(variable,value, facetVar1='clusteringDistance', var1NamesMapping=clusteringDistance_names, facetVar2='', var1NamesMapping=list() )
然后:
ggplot() + facet_grid(clusteringDistance ~ . , labeller=plot_labeller)
或者,您可以为要拥有的每个标签更改创建专用功能。
你有没有尝试改变你的具体水平 Hospital 向量?
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"
这是一个避免编辑数据的解决方案:
说你的情节是由 group 数据框的一部分,具有级别 control, test1, test2 ,然后创建一个由这些值命名的列表:
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_names 和 facet2_names 是由facet索引名称('Hostpital#1'等)索引的预定义名称列表。
facet1_names
facet2_names
的 编辑: 强> 如果传递标签程序不知道的变量/值组合,则上述方法将失败。您可以为未知变量添加故障保护,如下所示:
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)) } }
答案改编自 如何使用facet和margin = TRUE更改ggplot中的strip.text标签
<德尔> 编辑: 的 警告 强> :如果你使用这种方法来分辨 字符 列,您可能会收到不正确的标签。看到 这个错误报告 。 德尔> 修复了最新版本的ggplot2。
在不修改基础数据的情况下更改的EASIEST方法是:
1)使用。创建一个对象 as_labeller 功能 的 为每个默认值添加后退刻度标记 强> :
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)
使用以下内容更改基础因子级别名称:
# 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 ~ .)
由于我还没有被允许对帖子发表评论,所以我将其作为附录单独发布 文斯的回答 和 son520804的回答 。信用归他们所有。
Son520804: 使用Iris数据: 我假设: 您已经安装了dplyr软件包,它具有方便的mutate命令,以及 您的数据集名为survey。 survey %>% mutate(Hosp1 = Hospital1, Hosp2 = Hospital2,........) 此命令可帮助您重命名列,但保留所有其他列。 然后做同样的facet_wrap,你现在很好。
Son520804:
使用Iris数据:
我假设: 您已经安装了dplyr软件包,它具有方便的mutate命令,以及 您的数据集名为survey。 survey %>% mutate(Hosp1 = Hospital1, Hosp2 = Hospital2,........) 此命令可帮助您重命名列,但保留所有其他列。 然后做同样的facet_wrap,你现在很好。
survey %>% mutate(Hosp1 = Hospital1, Hosp2 = Hospital2,........)
使用Vince的虹膜示例和son520804的部分代码,我使用mutate函数执行此操作,并在不触及原始数据集的情况下实现了简单的解决方案。 诀窍是创建一个替代名称向量并在管道内使用mutate()来临时更正构面名称:
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向量可能需要以不同的方式重复以匹配原始数据集的顺序。请双重检查这是否正确实现。
这是我如何做到的 facet_grid(yfacet~xfacet) 使用ggplot2,版本2.2.1:
facet_grid(yfacet~xfacet)
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() - 我挣扎了一段时间的东西。
as_labeller()
这种方法的灵感来自帮助页面上的最后一个示例 强制使用贴标机功能 。