如何减少geom_text重叠

时间:2017-03-22 11:07:04

标签: r ggplot2

我的数据集包含> 500名个人运动员在不同地点进行的比赛活动观察,并在足球比赛期间进行记录。我的数据集的示例如下,其中每个符号指的是匹配活动。例如,KE是Kick Effective,在Defense中记录为1分钟。

# Example data
df <- data.frame(Symbol = c('KE', 'TE', 'TE', 'TI',
                              'KE', 'KE', 'H', 'H',
                              'GS', 'KE', 'TE', 'H',
                              'KE', 'H', 'H', 'GS'),
                Location = c('Defense', 'Defense', 'Midfield', 'Forward',
                             'Forward', 'Midfield', 'Midfield', 'Defense',
                             'Defense', 'Defense', 'Forward', 'Midfield',
                             'Midfield', 'Defense', 'Defense', 'Midfield'),
                 Time = c(1, 2, 3, 6,
                            15, 16, 16, 20,
                            22, 23, 26, 26,
                            27, 28, 28, 30))

我希望通过在ggplot2中的每个位置绘制一段时间内的匹配活动来可视化此数据。

# Load required package
require(ggplot2)
# Order factors for plotting
df$Location <- factor(df$Location, levels = c("Defense", "Midfield", "Forward"))

    # Plot
    ggplot(df, x = Time, y = Location) +
      geom_text(data=df, 
                aes(x = Time, y = Location, 
                    label = Symbol), size = 4) +
      theme_classic() 

但是,某些geom_text标签相互重叠。我试过了jitter,但后来我失去了足球场上活动发生的意义。不幸的是,check_overlap=TRUE删除了任何重叠的符号。我希望将符号保持在相同的文本方向。

尽管符号是在它们出现时绘制的,但我很乐意略微调整时间(意识到它们将不再完美地对齐图表)以确保geom_text符号可见。我可以通过向前或向后移动每个重叠事件的Time来手动执行此操作,但是使用这么大的数据集需要很长时间。

建议是使用ggrepel我在下面这样做,虽然它改变了y轴上的geom_text,这不是我所追求的。

library(ggrepel)
ggplot(df, x = Time, y = Location) +
  geom_text_repel(aes(Time, Location, label = Symbol)) 

有没有办法可以检查重叠并自动调整符号,以确保它们可见并仍保留在y轴上的含义?也许一个解决方案可能是找到每个Location,如果Symbol在同一个Location的另一个分钟内,Time,则调整$(window).scroll(function(){ $(".textblock").css("opacity", 1 - $(window).scrollTop() / 700); var offsetTop = $(".extratext").offset().top; $(".extratext").css("opacity", 1 - ($(window).scrollTop() - offsetTop) / 700); });

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:3)

我们可以添加点,然后使用最小行长度的ggrepel来指向文本标签中的点。

library(ggrepel) # ggrepel_0.6.5 ggplot2_2.2.1

ggplot(df, aes(x = Time, y = Location, label = Symbol)) +
  geom_point() +
  geom_text_repel(size = 4, min.segment.length = unit(0.1, "lines")) +
  theme_classic() 

enter image description here 或者我们可以尝试使用"direction"参数的开发版本。

ggplot(df, aes(x = Time, y = Location, label = Symbol)) +
  geom_text_repel(size = 4, direction = "x") +
  theme_classic()