我使用了以下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帮助页面,但不知道如何操作。
由于我还不被允许评论帖子,所以我单独发布了这篇文章,作为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向量可能需要以不同的方式重复,以匹配原始数据集的顺序。请再三检查这是否正确实现。
只是延续了"淘气101 "的答案,功劳归他
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)
或者,您可以为您想要的每个标签更改创建一个专用函数。
我觉得我应该加上我的答案,因为我花了很长时间才做到这一点:
这个答案是为你准备的:
您不想编辑原始数据
如果你需要表达式(bquote)在标签和
如果您想要单独的标签名称-向量的灵活性
我基本上把标签放在一个命名向量中,这样标签就不会混淆或切换。标签器表达式可能更简单,但这至少是可行的(非常欢迎改进)。注意'(后引号)以保护facet-factor。
n <- 10
x <- seq(0, 300, length.out = n)
# I have my data in a "long" format
my_data <- data.frame(
Type = as.factor(c(rep('dl/l', n), rep('alpha', n))),
T = c(x, x),
Value = c(x*0.1, sqrt(x))
)
# the label names as a named vector
type_names <- c(
`nonsense` = "this is just here because it looks good",
`dl/l` = Linear~Expansion~~Delta*L/L[Ref]~"="~"[%]", # bquote expression
`alpha` = Linear~Expansion~Coefficient~~alpha~"="~"[1/K]"
)
ggplot() +
geom_point(data = my_data, mapping = aes(T, Value)) +
facet_wrap(. ~ Type, scales="free_y",
labeller = label_bquote(.(as.expression(
eval(parse(text = paste0('type_names', '$`', Type, '`')))
)))) +
labs(x="Temperature [K]", y="", colour = "") +
theme(legend.position = 'none')