如何让geom_sina生成的点位置与geom_label_repel标注正确对齐
问题原因
geom_sina生成的水平偏移是图层渲染阶段内部计算的结果,不会写入原始数据集,你直接给geom_label_repel传入原始数据时,分类变量映射的x轴坐标默认就是分类的中线位置,所以引导线都会指向中线。
解决方法
提前提取geom_sina计算后的偏移坐标,匹配到需要标注的样本上,再用偏移后的坐标绘制标注即可,具体实现代码如下:
library(dplyr) library(ggforce) library(ggplot2) library(ggrepel) # 先给原数据加唯一id,避免同group同y的样本匹配错误 midwest <- midwest %>% mutate(id = row_number()) # 第一步:构建包含sina层的基础图 base_plot <- ggplot(midwest, aes(state, area)) + geom_violin() + geom_sina(aes(tmp_id = id)) # 把id加到aes里,后续可精准匹配样本 # 第二步:提取sina层计算后的偏移坐标数据 sina_data <- layer_data(base_plot, 2) %>% select(x, y, tmp_id) %>% rename(sina_x = x, area = y, id = tmp_id) # 第三步:匹配待标注样本的sina偏移坐标 label_data <- midwest %>% filter(poptotal > 1000000) %>% left_join(sina_data, by = c("id", "area")) # 第四步:绘制最终图,标注使用sina偏移后的x坐标 base_plot + geom_label_repel( aes(x = sina_x, label = county), data = label_data, box.padding = 0.5, min.segment.length = 0.5, size = 3 )
处理后geom_label_repel的定位坐标就是散点经过sina偏移后的实际位置,引导线会精准指向对应散点,不会再指向分类中线。
内容的提问来源于stack exchange,提问作者jsirgo
相关产品推荐
相关产品推荐

