我使用了以下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帮助页面,但不知道如何操作。
下面是另一个解决方案,它遵循@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))
我现在解决这个问题的方法是使用dplyr::case_when在facet_grid或facet_wrap函数中生成一个标签器。这是@lillemets提出的解决方案的扩展
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(case_when(hospital == "Hospital #1" ~ "Hosp1",
hospital == "Hospital #2" ~ "Hosp2") ~ .)
+ theme(panel.background = theme_blank())
如果您有第二个facet标签要更改,那么只需在facet_grid中的~的另一侧使用相同的方法即可
我有另一种方法可以在不改变底层数据的情况下实现相同的目标:
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())
我上面所做的是改变原始数据帧中因子的标签,这是与原始代码相比的唯一不同之处。
下面是我如何使用2.2.1版本的ggplot2使用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()的调用——这一点我曾纠结过一段时间。
这种方法的灵感来自帮助页面上的最后一个示例强制到标签器函数。