我有一个数据集,其中每个数据点具有受约束的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)
Run Code Online (Sandbox Code Playgroud)
我可以使用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)
Run Code Online (Sandbox Code Playgroud)
作为一个注释,我不能允许文本的x值改变的原因是因为我只绘制文本(而不是点).然而,似乎ggrepel中的大多数示例保持点的位置(使得它们的值保持为真),并且仅排斥标签的x和y值.然后,点和连接到带有段的标签(你可以在我的第二个绘图示例中看到).
为了演示目的,我在上面两个例子中保留了要点.但是,我只保留文本(因此将删除点和段),留下我这样的东西:
repelPlot2 <- ggplot(data) + geom_text_repel(aes(x, y, label = label), segment.size = 0) + theme_classic(base_size = 16)
Run Code Online (Sandbox Code Playgroud)
我的问题有两个:
1)我是否可以仅在y方向排斥文本标签?
2)我是否有可能获得包含文本的新(排斥)y值的结构?
谢谢你的建议!
小智 6
ggrepel 版本 0.6.8(使用 devtools::github_install 从 GitHub 安装)现在支持“方向”参数,该参数仅允许在“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”。
我不认为只能在一个方向上排斥文本标签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)
Run Code Online (Sandbox Code Playgroud)