假设我有以下虚拟数据框:
df <- data.frame(let = LETTERS[1:13], value = sample(13),
group = rep(c("foo", "bar"), times = c(5,8)))
df
let value group
1 A 2 foo
2 B 1 foo
3 C 12 foo
4 D 8 foo
5 E 4 foo
6 F 13 bar
7 G 11 bar
8 H 3 bar
9 I 7 bar
10 J 5 bar
11 K 10 bar
12 L 9 bar
13 M 6 bar
使用ggplot和facet_wrap可以为每个组制作一个面板......
library(ggplot2)
ggplot(df, aes(x= let, y = value)) +
geom_point() +
coord_flip() +
facet_wrap(~group, scales = "free")
..但是垂直轴不是等间隔的,即左图包含比右图更多的垂直刻度。我想用(未标记的)刻度填充右侧垂直轴(没有绘制值)。在这种情况下,它会添加3个空标记,但它应该可以扩展到任何df大小。
实现这一目标的最佳方法是什么?我应该更改数据框,还是有办法使用ggplot?
答案 0 :(得分:2)
需要magrittr
的cludgy解决方案(对于复合赋值管道%<>%
):
df %<>%
rbind(data.frame(let = c(" ", " ", " "),
value = NA,
group = "foo"))
我只为foo
添加三个不同长度的空字符串(即空格)。但是,必须有一个更优雅的解决方案。
答案 1 :(得分:2)
我不确定为什么你要在图表上排列分类变量,而不是美学(它看起来似乎更好)。无论如何,似乎处理一般情况的简单解决方法是注意ggplot
使用数字刻度来绘制分类变量。然后,对于每个x值,您的图表的变通方法是在y值处绘制一个等于分类变量数的透明点。针对所有x值绘制点,作为针对每个组的x值的非重叠范围的情况的简单解决方案。我已经在您的数据框中添加了另一个组,以使示例更加通用。
library(ggplot2)
set.seed(123)
df <- data.frame(let = LETTERS[1:19], value = c(sample(13),20+sample(6)),
group = rep(c("foo", "bar", "bar2"), times = c(5,8,6)))
num_rows <- xtabs(~ group, df)
max_rows <- max(num_rows)
sp <- ggplot(df, aes(y= let, x = value)) +
geom_point() +
geom_point(aes(y = max_rows +.5), alpha=0 ) +
facet_wrap(~group, scales = "free", nrow=1 )
plot(sp)
答案 2 :(得分:0)
使用free_x
代替free
,如下所示:
ggplot(df, aes(x= let, y = value)) +
geom_point() +
coord_flip() +
facet_wrap(~group, scales = "free_x")+
theme(axis.text.y=element_blank(),
axis.ticks.y=element_blank())