我使用了以下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 ~ .)
+ opts(panel.background = theme_blank())
生产环境
我想将facet标签更改为更短的标签(如Hosp 1,Hosp 2 ......),因为它们现在太长并且看起来很狭窄(增加图形的高度不是一个选项,它需要文档中的空间太大) . 我查看了facet_grid帮助页面,但无法弄清楚如何 .
14 回答
我认为所有其他解决方案对此非常有帮助,但还有另一种方法 .
我假设:
你已经安装了
dplyr
包,它有方便的mutate
命令,和您的数据集名为
survey
.调查%>%mutate(Hosp1 = Hospital1,Hosp2 = Hospital2,........)
此命令可帮助您重命名列,但保留所有其他列 .
然后做同样的
facet_wrap
,你现在很好 .如果你有两个方面
hospital
和room
但想要只重命名一个,你可以使用:要使用基于矢量的方法重命名两个方面(如naught101的答案),您可以:
使用
variable, value
作为参数的贴标机功能定义对我不起作用 . 另外,如果你想使用表达式,你需要使用lapply而不能简单地使用arr[val]
,因为函数的参数是data.frame .这段代码确实有效:
使用以下内容更改基础因子级别名称:
这是我用
facet_grid(yfacet~xfacet)
使用ggplot2,版本2.2.1的方法:请注意,这不包含对
as_labeller()
的调用 - 这是我努力了一段时间的事情 .这种方法的灵感来自帮助页面Coerce to labeller function上的最后一个示例 .
只是扩大了naught101的答案 - 信用归他所有
您要做的是创建一个具有名称到名称映射的列表
并使用新的默认参数重新定义
plot_labeller()
:然后:
或者,您可以为要拥有的每个标签更改创建专用功能 .
您是否尝试更改
Hospital
向量的特定级别?这个解决方案非常接近@domi所拥有的,但旨在通过获取前4个字母和最后一个数字来缩短名称 .
因为我'm not yet allowed to comment on posts, I' m单独发布这个作为Vince's answer和son520804's answer的附录 . 信用归他们所有 .
使用Vince的虹膜示例和son520804的部分代码,我使用mutate函数执行此操作,并在不触及原始数据集的情况下实现了简单的解决方案 . 诀窍是创建一个替代名称向量并在管道内使用mutate()来临时更正构面名称:
在此示例中,您可以看到i $ Species的级别暂时更改为new_names向量中包含的相应公用名 . 该行包含
可以轻松删除以显示原始命名 .
Word of caution: 如果未正确设置new_name向量,则可能很容易在名称中引入错误 . 使用单独的函数替换变量字符串可能会更清晰 . 请记住,new_name向量可能需要以不同的方式重复以匹配原始数据集的顺序 . 请双重检查这是否正确实现 .
这是一个避免编辑数据的解决方案:
假设您的绘图由数据框的
group
部分构成,该部分具有级别control, test1, test2
,然后创建由这些值命名的列表:然后创建一个'贴标机'功能,并将其推入facet_grid调用:
这使用数据框的级别来索引hospital_names列表,返回列表值(正确的名称) .
请注意,这仅适用于只有一个分面变量的情况 . 如果您有两个方面,那么您的贴标机功能需要为每个方面返回不同的名称向量 . 您可以使用以下内容执行此操作:
其中
facet1_names
和facet2_names
是由构面索引名称('Hostpital#1'等)索引的预定义名称列表 .Edit: 如果传递标签程序不知道的变量/值组合,则上述方法将失败 . 您可以为未知变量添加故障保护,如下所示:
答案改编自how to change strip.text labels in ggplot with facet and margin=TRUE
编辑:警告:如果您使用此方法按字符列进行构面,则可能是标签不正确 . 请参阅此错误报告 . 修复了最新版本的ggplot2 .
请注意,如果ggplot显示的因子少于变量实际包含的因素,则此解决方案将无法正常工作(可能如果您曾进行过子集化,则会发生这种情况):
一个简单的解决方案(除了在names_li中添加所有未使用的因子,这可能是单调乏味的)是使用droplevels()删除未使用的因子,无论是在原始数据集中还是在labbeler函数中,请参阅:
这是另一个解决方案,它符合@ naught101给出的一个解决方案,但更简单,也不会对最新版本的ggplot2发出警告 .
基本上,您首先要创建一个命名的字符向量
然后你将它用作贴标机,只需修改@ naught101给出的代码的最后一行即可
希望这可以帮助 .
facet_wrap
和facet_grid
都接受来自ifelse
的输入作为参数 . 因此,如果用于分面的变量是合乎逻辑的,那么解决方案非常简单:如果变量有更多类别,则
ifelse
语句必须为nested .作为副作用,这还允许在
ggplot
调用中创建要刻面的组 .我有另一种方法来实现相同的目标,而无需更改基础数据:
我上面所做的是更改原始数据框中因子的标签,这是与原始代码相比的唯一区别 .