首页 > 解决方案 > 避免使用 ggplot2::coord_polar 重叠文本标签

问题描述

我有一个极坐标系上的点图。每个点都有一个相关的标签,应该以给定的角度显示在绘图周围。这可以使用axis.text或geom_text来实现;我在这里使用了 geom_text。不幸的是,文本标签重叠。使用 position = position_jitter() 显然只允许按高度抖动,但不能按宽度抖动(即,不能解决问题)。MWE:

df <- data.frame("angle" = runif(50, 0, 359),
                 "projection" = runif(50, 0, 1),
                 "labels" = paste0("label_", 1:50))

ggplot(data = df, aes(x = angle, y = projection, label = labels)) +
  geom_point() +
  coord_polar() + 
  theme_minimal() +
  geom_text(aes(x=angle, y=1.1,
                label=labels),
            size = 3)

在此处输入图像描述

我想抖动标签,使它们不重叠,但留在绘图区域之外。我还尝试使用角度参数有条件地调整标签以腾出更多空间,但无法找出正确的公式来使角度起作用。


编辑:这是创建绘图的另一种方法,使用 scale_x_continuous 将标签创建为axis.text.x。然而,这确实会再次导致标签重叠。

ggplot(data = df, aes(x = angle, y = projection, label = labels)) +
  geom_point() +
  coord_polar() +
  scale_x_continuous(limits = c(0, 360), expand = c(0, 0), breaks = df$angle, labels=df$labels) +
  theme_minimal() + 
  theme(panel.grid = element_blank())

标签: rggplot2polar-coordinatesgeom-text

解决方案


ggrepel在这种情况下会很好地工作。

library(ggplot2)
library(ggrepel)
df <- data.frame("angle" = runif(50, 0, 359),
                 "projection" = runif(50, 0, 1),
                 "labels" = paste0("label_", 1:50))


ggplot(data = df, aes(x = angle, y = projection, label = labels)) +
    geom_point() +
    coord_polar() + 
    theme_minimal() +
    geom_text_repel(size = 3)

在此处输入图像描述


推荐阅读