我有一个函数来操作ggplot对象,通过将其转换为grob然后修改图层.我希望函数返回一个ggplot对象而不是grob.有没有一种简单的方法将grob转换回gg?
该文档上ggplotGrob是非常稀疏.
简单的例子:
P <- ggplot(iris) + geom_bar(aes(x=Species, y=Petal.Width), stat="identity")
G <- ggplotGrob(P)
... some manipulation to G ...
## DESIRED:
P2 <- inverse_of_ggplotGrob(G)
such that, we can continue to use basic ggplot syntax, ie
`P2 + ylab ("The Width of the Petal")`
Run Code Online (Sandbox Code Playgroud)
更新:
要回答评论中的问题,这里的动机是根据每个方面中标签名称的值,以编程方式修改构面标签的颜色.以下功能很好地工作(基于前一个问题中的baptise输入).
我希望返回值colorByGroup是一个ggplot对象,而不仅仅是一个grob.
这是代码,对于那些感兴趣的人
get_grob_strips <- function(G, strips=grep(pattern="strip.*", G$layout$name)) {
if (inherits(G, "gg"))
G <- ggplotGrob(G)
if (!inherits(G, "gtable"))
stop ("G must be a gtable object or a gg object")
strip.type <- …Run Code Online (Sandbox Code Playgroud) 我希望在每个刻面之间添加一个厚厚的深灰色条。我不想在每个方面周围都有边框,而是在图之间有一个深灰色条。
library(ggplot2)
ggplot(mpg, aes(cty, hwy, color = factor(year))) +
geom_point() +
facet_wrap(~ cyl, nrow = 1)
Run Code Online (Sandbox Code Playgroud)
尽管我的数据与上面的示例相同,但我发现了这个问题,只有一行而不是facet_grid.
我正在 ggplot 中制作一个 tilemap,如下所示。2个问题:
1) 如何扩展 x 轴限制以在 x = 4 处标记我的组?2) 如何自动在组之间放置水平线(即 1 和 2、2 和 3 之间的线,等等),而不是手动指定 y 值?
require(tidyverse)
set.seed(1)
df <- data.frame(ID = as.character(c(1:50)),
Group = sample(1:8, 50, replace = T),
var1 = sample(c('Y', 'N'), 50, replace = T),
var2 = sample(c('Y', 'N'), 50, replace = T),
var3 = sample(c('Y', 'N'), 50, replace = T)) %>%
gather('var', 'y_n', var1:var3) %>%
arrange(-Group) %>%
mutate(ID = factor(ID, levels = unique(ID, ordered = T)))
ggplot(df, aes(var, ID, label = …Run Code Online (Sandbox Code Playgroud)