ggrepel:仅在一个方向排斥文本,并返回被排斥文本的值
ggrepel: Repelling text in only one direction, and returning values of repelled text
我有一个数据集,其中每个数据点都有一个受约束的 x 值(代表一个定量变量的实际实例),一个任意的 y 值(存在只是为了提供一个维度来展开文本), 和一个标签。我的数据集可能非常大,并且经常有文本重叠,即使我尝试尽可能将数据分布在 y 轴上也是如此。
因此,我正在尝试使用新的 ggrepel。但是,我试图将文本标签限制在它们的 x 值位置,同时只允许它们在 y 方向上相互排斥。
例如,下面的代码生成了一个包含 32 个数据点的图,其中 x 值表示汽车的汽缸数,y 值是随机确定的(没有任何意义,只是为了提供一个用于文本绘图目的的第二维)。不使用ggrepel,文中有明显重叠:
library(ggrepel)
library(ggplot2)
set.seed(1)
data = data.frame(x=runif(100, 1, 10),y=runif(100, 1, 10),label=paste0("label",seq(1:100)))
origPlot <- ggplot(data) +
geom_point(aes(x, y), color = 'red') +
geom_text(aes(x, y, label = label)) +
theme_classic(base_size = 16)
我可以使用 ggrepel 修复文本重叠,如下所示。但是,这不仅会更改 y 值,还会更改 x 值。我试图避免更改 x 值,因为它们代表实际的物理意义(气缸数):
repelPlot <- ggplot(data) +
geom_point(aes(x, y), color = 'red') +
geom_text_repel(aes(x, y, label = label)) +
theme_classic(base_size = 16)
请注意,我不允许更改文本的 x 值的原因是因为我只绘制文本(而不是点)。然而,似乎 ggrepel 中的大多数示例都保留了点的位置(以便它们的值保持为真),并且仅排斥标签的 x 和 y 值。然后,点和连接到带有线段的标签(您可以在我的第二个绘图示例中看到)。
为了演示,我保留了上面两个例子中的要点。但是,我只保留文本(因此将删除点和段),留下这样的东西:
repelPlot2 <- ggplot(data) + geom_text_repel(aes(x, y, label = label), segment.size = 0) + theme_classic(base_size = 16)
我的问题有两个:
1)是否可以只在y方向排斥文本标签?
2) 我有可能获得一个包含文本的新(排斥)y 值的结构吗?
感谢您的任何建议!
我认为 ggrepel
无法仅在一个方向上排斥文本标签。
我会以不同的方式解决这个问题,而是手动生成任意 y 轴位置。例如,对于您示例中的数据集,您可以使用以下代码执行此操作。
我使用 dplyr
包按 x
的值对数据集进行分组,然后创建一个新的数据列 y
,其中包含每组中的行号.然后将行号用作 y 轴的值。
library(ggplot2)
library(dplyr)
data <- data.frame(x = mtcars$cyl, label = paste0("label", seq(1:32)))
data <- data %>%
group_by(x) %>%
mutate(y = row_number())
ggplot(data, aes(x = x, y = y, label = label)) +
geom_text(size = 2) +
xlim(3.5, 8.5) +
theme_classic(base_size = 8)
ggsave("filename.png", width = 4, height = 2)
ggrepel 版本 0.6.8(使用 devtools::github_install 从 GitHub 安装)现在支持 "direction" 参数,它仅在 "x" 或 "y"方向。
repelPlot2 <- ggplot(data) + geom_text_repel(aes(x, y, label = label), segment.size = 0, direction = "y") + theme_classic(base_size = 16)
获取 y 值更难——一种方法是首先使用 ggrepel 中的 "repel_boxes" 函数获取被排斥的值,然后使用 geom_text 将这些值输入到 ggplot 中。有关该方法的讨论和示例代码,请参阅 https://github.com/slowkow/ggrepel/issues/24。请注意,如果使用最新版本,repel_boxes 函数现在还有一个 "direction" 参数,它接受 "both"、"x" 或 "y".
我有一个数据集,其中每个数据点都有一个受约束的 x 值(代表一个定量变量的实际实例),一个任意的 y 值(存在只是为了提供一个维度来展开文本), 和一个标签。我的数据集可能非常大,并且经常有文本重叠,即使我尝试尽可能将数据分布在 y 轴上也是如此。
因此,我正在尝试使用新的 ggrepel。但是,我试图将文本标签限制在它们的 x 值位置,同时只允许它们在 y 方向上相互排斥。
例如,下面的代码生成了一个包含 32 个数据点的图,其中 x 值表示汽车的汽缸数,y 值是随机确定的(没有任何意义,只是为了提供一个用于文本绘图目的的第二维)。不使用ggrepel,文中有明显重叠:
library(ggrepel)
library(ggplot2)
set.seed(1)
data = data.frame(x=runif(100, 1, 10),y=runif(100, 1, 10),label=paste0("label",seq(1:100)))
origPlot <- ggplot(data) +
geom_point(aes(x, y), color = 'red') +
geom_text(aes(x, y, label = label)) +
theme_classic(base_size = 16)
我可以使用 ggrepel 修复文本重叠,如下所示。但是,这不仅会更改 y 值,还会更改 x 值。我试图避免更改 x 值,因为它们代表实际的物理意义(气缸数):
repelPlot <- ggplot(data) +
geom_point(aes(x, y), color = 'red') +
geom_text_repel(aes(x, y, label = label)) +
theme_classic(base_size = 16)
请注意,我不允许更改文本的 x 值的原因是因为我只绘制文本(而不是点)。然而,似乎 ggrepel 中的大多数示例都保留了点的位置(以便它们的值保持为真),并且仅排斥标签的 x 和 y 值。然后,点和连接到带有线段的标签(您可以在我的第二个绘图示例中看到)。
为了演示,我保留了上面两个例子中的要点。但是,我只保留文本(因此将删除点和段),留下这样的东西:
repelPlot2 <- ggplot(data) + geom_text_repel(aes(x, y, label = label), segment.size = 0) + theme_classic(base_size = 16)
我的问题有两个:
1)是否可以只在y方向排斥文本标签?
2) 我有可能获得一个包含文本的新(排斥)y 值的结构吗?
感谢您的任何建议!
我认为 ggrepel
无法仅在一个方向上排斥文本标签。
我会以不同的方式解决这个问题,而是手动生成任意 y 轴位置。例如,对于您示例中的数据集,您可以使用以下代码执行此操作。
我使用 dplyr
包按 x
的值对数据集进行分组,然后创建一个新的数据列 y
,其中包含每组中的行号.然后将行号用作 y 轴的值。
library(ggplot2)
library(dplyr)
data <- data.frame(x = mtcars$cyl, label = paste0("label", seq(1:32)))
data <- data %>%
group_by(x) %>%
mutate(y = row_number())
ggplot(data, aes(x = x, y = y, label = label)) +
geom_text(size = 2) +
xlim(3.5, 8.5) +
theme_classic(base_size = 8)
ggsave("filename.png", width = 4, height = 2)
ggrepel 版本 0.6.8(使用 devtools::github_install 从 GitHub 安装)现在支持 "direction" 参数,它仅在 "x" 或 "y"方向。
repelPlot2 <- ggplot(data) + geom_text_repel(aes(x, y, label = label), segment.size = 0, direction = "y") + theme_classic(base_size = 16)
获取 y 值更难——一种方法是首先使用 ggrepel 中的 "repel_boxes" 函数获取被排斥的值,然后使用 geom_text 将这些值输入到 ggplot 中。有关该方法的讨论和示例代码,请参阅 https://github.com/slowkow/ggrepel/issues/24。请注意,如果使用最新版本,repel_boxes 函数现在还有一个 "direction" 参数,它接受 "both"、"x" 或 "y".