我的数据集包含> 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);
});
。
非常感谢任何帮助。
答案 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()
或者我们可以尝试使用"direction"参数的开发版本。
ggplot(df, aes(x = Time, y = Location, label = Symbol)) +
geom_text_repel(size = 4, direction = "x") +
theme_classic()