我有一个数据集,其中每个数据点都有一个被约束的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,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,color = 'red') + geom_text_repel(aes(x,label = label)) + theme_classic(base_size = 16)
作为一个说明,我不能允许文本的x值改变的原因是因为我只绘制文本(而不是点).然而,ggrepel中的大多数示例似乎保持了点的位置(使得它们的值保持为真),并且仅排斥了标签的x和y值.然后,点和连接到标签的段(你可以看到在我的第二个情节例子).
为了演示,我在上面的两个例子中保留了分数.但是,我只保留文本(因此将删除分数和分数),让我有这样的一些东西:
repelPlot2 <- ggplot(data) + geom_text_repel(aes(x,label = label),segment.size = 0) + theme_classic(base_size = 16)
我的问题是双重的:
2)我可以获得一个包含文本的新(排斥)y值的结构吗?
谢谢任何建议!
解决方法@H_403_34@
ggrepel版本0.6.8(使用devtools :: github_install从GitHub安装)现在支持一个“direction”参数,它只能以“x”或“y”方向排斥标签.
repelPlot2< - ggplot(data)geom_text_repel(aes(x,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”.
repelPlot2< - ggplot(data)geom_text_repel(aes(x,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”.