在 ggplot 中为 ggrepel 设置限制
Set limits within ggplot for ggrepel
我有一个 ggplot 图,其中的数据与此类似:
data <- data.frame(x = c(1:30),
y = rnorm(30, 0, 1),
z = rep(c("A", "B", "C"), 10))
ggplot(data = data, aes(x = x, y = y, group = z, color = z, label = z)) +
geom_point() +
geom_label_repel(aes(label = z), force = 1, segment.alpha = .5, box.padding = 1, xlim = c(-5, 35), ylim = c(-5, 5)) +
scale_x_continuous(limits = c(-5, 35)) +
scale_y_continuous(limits = c(-5, 5))
我正在尝试在图表中为标签设置限制,以便它们始终高于 2.5 或低于 -2.5,并且位于 30 的右侧或 0 的左侧。感谢您的帮助!
查看 ggrepel
的 documentation,您似乎无法指定 "label exclusion zone",而这正是您要查找的内容。最好的选择是使用 xlim
和 ylim
来定义部分,然后 "section off" 您的数据相应地创建 "label exclusion zone".
的错觉
为此,我将您的数据分成了几个象限:
ggplot(data = data, aes(x = x, y = y, group = z, color = z, label = z)) +
geom_point() +
geom_label_repel(data=subset(data, x<15 & y<0),
segment.alpha = .5, xlim = c(-5, 0), ylim = c(-5, -2.5)) +
geom_label_repel(data=subset(data, x<15 & y>0),
segment.alpha = .5, xlim = c(-5, 0), ylim = c(2.5, 5)) +
geom_label_repel(data=subset(data, x>15 & y>0),
segment.alpha = .5, xlim = c(30, 35), ylim = c(2.5, 5)) +
geom_label_repel(data=subset(data, x>15 & y<0),
segment.alpha = .5, xlim = c(30, 35), ylim = c(-5, -2.5)) +
scale_x_continuous(limits = c(-5, 35)) +
scale_y_continuous(limits = c(-5, 5))
这给了你这个:
有点像,在我看来。为了更好地获得您可能正在寻找的效果,我会将数据分成高于和低于平均值的 y 值,并让 ggrepel
适当地将它们分布在 x 轴上。我使用 force=
参数将它们 "push" 放在 x 轴上:
ggplot(data = data, aes(x = x, y = y, group = z, color = z, label = z)) +
+ geom_point() +
geom_label_repel(data=subset(data, y<0), force=25,
segment.alpha = .5, ylim = c(-5, -2.5)) +
geom_label_repel(data=subset(data, y>0), force=25,
segment.alpha = .5, ylim = c(2.5, 5)) +
scale_x_continuous(limits = c(-5, 35)) +
scale_y_continuous(limits = c(-5, 5))
你可以做同样的事情切换轴(根据 x 值拆分数据),但我认为它在这里会更好,因为数据分布在更大的 x 轴区域。
我有一个 ggplot 图,其中的数据与此类似:
data <- data.frame(x = c(1:30),
y = rnorm(30, 0, 1),
z = rep(c("A", "B", "C"), 10))
ggplot(data = data, aes(x = x, y = y, group = z, color = z, label = z)) +
geom_point() +
geom_label_repel(aes(label = z), force = 1, segment.alpha = .5, box.padding = 1, xlim = c(-5, 35), ylim = c(-5, 5)) +
scale_x_continuous(limits = c(-5, 35)) +
scale_y_continuous(limits = c(-5, 5))
我正在尝试在图表中为标签设置限制,以便它们始终高于 2.5 或低于 -2.5,并且位于 30 的右侧或 0 的左侧。感谢您的帮助!
查看 ggrepel
的 documentation,您似乎无法指定 "label exclusion zone",而这正是您要查找的内容。最好的选择是使用 xlim
和 ylim
来定义部分,然后 "section off" 您的数据相应地创建 "label exclusion zone".
为此,我将您的数据分成了几个象限:
ggplot(data = data, aes(x = x, y = y, group = z, color = z, label = z)) +
geom_point() +
geom_label_repel(data=subset(data, x<15 & y<0),
segment.alpha = .5, xlim = c(-5, 0), ylim = c(-5, -2.5)) +
geom_label_repel(data=subset(data, x<15 & y>0),
segment.alpha = .5, xlim = c(-5, 0), ylim = c(2.5, 5)) +
geom_label_repel(data=subset(data, x>15 & y>0),
segment.alpha = .5, xlim = c(30, 35), ylim = c(2.5, 5)) +
geom_label_repel(data=subset(data, x>15 & y<0),
segment.alpha = .5, xlim = c(30, 35), ylim = c(-5, -2.5)) +
scale_x_continuous(limits = c(-5, 35)) +
scale_y_continuous(limits = c(-5, 5))
这给了你这个:
有点像,在我看来。为了更好地获得您可能正在寻找的效果,我会将数据分成高于和低于平均值的 y 值,并让 ggrepel
适当地将它们分布在 x 轴上。我使用 force=
参数将它们 "push" 放在 x 轴上:
ggplot(data = data, aes(x = x, y = y, group = z, color = z, label = z)) +
+ geom_point() +
geom_label_repel(data=subset(data, y<0), force=25,
segment.alpha = .5, ylim = c(-5, -2.5)) +
geom_label_repel(data=subset(data, y>0), force=25,
segment.alpha = .5, ylim = c(2.5, 5)) +
scale_x_continuous(limits = c(-5, 35)) +
scale_y_continuous(limits = c(-5, 5))
你可以做同样的事情切换轴(根据 x 值拆分数据),但我认为它在这里会更好,因为数据分布在更大的 x 轴区域。