排除 ggplot 中每个方面未使用的因子水平
Exclude unused factor levels in each facet in ggplot
考虑这个数据框:
df <- data.frame(vars=c(rnorm(3),rnorm(3,2,1), rnorm(3,1,1)),
names=c("a","b","c","a","d","b","c","a","f"),
groups=c(rep("x",3),rep("y",3),rep("z",3)))
我正在用 ggplot 绘图:
ggplot(df, aes(reorder(names, vars), names)) + geom_bar(stat="identity") +
theme_bw() + facet_grid(groups~., scales="free_x") + coord_flip() + ylab(NULL) + xlab(NULL)
看起来像这样
我现在想要的是:
- 每个网格项目都应该删除未使用的项目,例如在 "x" 网格中不应有 "d" 和 "f"
- x 轴应该是 "vars" 列的值。每个网格中的比例应该相同,整体 x 比例应该下降。我只希望每个网格中的条形比例完好无损
- 每个网格中的条形应按降序排列(较长的条形在顶部)
更新:
使用 here 的建议进行编辑我收到此错误:
ggplot(df, aes(names,vars)) + geom_bar(stat="identity") + coord_flip() +
theme_bw() + facet_wrap(~groups,nrow = 3,scales = "free_x")
Error in facet_render.wrap(plot$facet, panel, plot$coordinates, theme, :
ggplot2 does not currently support free scales with a non-cartesian coord or coord_flip.
In addition: Warning message:
Stacking not well defined when ymin != 0
当我删除 coord_flip() 时,它起作用了,但我仍然收到警告,结果不是我想要的。
这是一种变通方法,但它提供的情节似乎符合您的基本目标。 geom_bar
被替换为 geom_seqment
,因为这似乎更接近您正在绘制的内容并避免了 coord_flip
的复杂性。条形的顺序由 vars
在每个 group
中的排名决定。 y 轴标签不能直接指定,但您可以使用 geom_text
在 y 轴旁边放置适当的 names
值,这样它们就可以作为标签。此外,我将小平面标签切换到左侧,这似乎改善了小平面和 y 轴标签的整体外观。
set.seed(177)
df <- data.frame(vars=c(rnorm(3),rnorm(3,2,1), rnorm(3,1,1)),
names=c("a","b","c","a","d","b","c","a","f"),
groups=c(rep("x",3),rep("y",3),rep("z",3)))
library(ggplot2)
sp1 <- ggplot(data=transform(df, ranked=ave(vars, groups, FUN=rank)),
aes( x=vars, y=ranked))
sp1 <- sp1 + geom_segment( aes( xend = 0, yend = ranked), size=10)
sp1 <- sp1 + geom_text( aes( x = min(vars), y= ranked, label = names), hjust= 4)
sp1 <- sp1 + scale_y_discrete(label=NULL)
sp1 <- sp1 + theme_bw()
sp1 <- sp1 + facet_grid( groups ~ ., scales="free", switch="y")
plot(sp1)
剧情好像
考虑这个数据框:
df <- data.frame(vars=c(rnorm(3),rnorm(3,2,1), rnorm(3,1,1)),
names=c("a","b","c","a","d","b","c","a","f"),
groups=c(rep("x",3),rep("y",3),rep("z",3)))
我正在用 ggplot 绘图:
ggplot(df, aes(reorder(names, vars), names)) + geom_bar(stat="identity") +
theme_bw() + facet_grid(groups~., scales="free_x") + coord_flip() + ylab(NULL) + xlab(NULL)
看起来像这样
我现在想要的是:
- 每个网格项目都应该删除未使用的项目,例如在 "x" 网格中不应有 "d" 和 "f"
- x 轴应该是 "vars" 列的值。每个网格中的比例应该相同,整体 x 比例应该下降。我只希望每个网格中的条形比例完好无损
- 每个网格中的条形应按降序排列(较长的条形在顶部)
更新:
使用 here 的建议进行编辑我收到此错误:
ggplot(df, aes(names,vars)) + geom_bar(stat="identity") + coord_flip() +
theme_bw() + facet_wrap(~groups,nrow = 3,scales = "free_x")
Error in facet_render.wrap(plot$facet, panel, plot$coordinates, theme, :
ggplot2 does not currently support free scales with a non-cartesian coord or coord_flip.
In addition: Warning message:
Stacking not well defined when ymin != 0
当我删除 coord_flip() 时,它起作用了,但我仍然收到警告,结果不是我想要的。
这是一种变通方法,但它提供的情节似乎符合您的基本目标。 geom_bar
被替换为 geom_seqment
,因为这似乎更接近您正在绘制的内容并避免了 coord_flip
的复杂性。条形的顺序由 vars
在每个 group
中的排名决定。 y 轴标签不能直接指定,但您可以使用 geom_text
在 y 轴旁边放置适当的 names
值,这样它们就可以作为标签。此外,我将小平面标签切换到左侧,这似乎改善了小平面和 y 轴标签的整体外观。
set.seed(177)
df <- data.frame(vars=c(rnorm(3),rnorm(3,2,1), rnorm(3,1,1)),
names=c("a","b","c","a","d","b","c","a","f"),
groups=c(rep("x",3),rep("y",3),rep("z",3)))
library(ggplot2)
sp1 <- ggplot(data=transform(df, ranked=ave(vars, groups, FUN=rank)),
aes( x=vars, y=ranked))
sp1 <- sp1 + geom_segment( aes( xend = 0, yend = ranked), size=10)
sp1 <- sp1 + geom_text( aes( x = min(vars), y= ranked, label = names), hjust= 4)
sp1 <- sp1 + scale_y_discrete(label=NULL)
sp1 <- sp1 + theme_bw()
sp1 <- sp1 + facet_grid( groups ~ ., scales="free", switch="y")
plot(sp1)
剧情好像