首先,要澄清标题。我正在尝试创建一个散点图。我的数据的性质是每个观察值都有2个,我希望通过散点图中两点之间的线或箭头将每对观察值“连接”起来。
为解决这个问题,下面是一个简短的数据集:
structure(list(evToRevJun15 = c(4.56, 1.35, 1.26, 5.99, 2.79,
6.97, 4.9, 2.28, 1.26, 4.83, 2, 2.36, 4.91, 2.31, 2.47), evToGiJun15 = c(21.71,
5, 4.85, 23.04, 21.46, 34.85, 44.53, 12.67, 9.69, 21.96, 11.76,
19.67, 11.69, 6.42, 5.74), evToRevDec18 = c(1.99, 5.92, 2.13,
6.6, 5.84, 4.32, 6.38, 6.77, 4.92, 2.67, 4.48, 6.69, 1.36, 3.79,
2.41), evToGiDec18 = c(7.37, 24.67, 7.89, 34.74, 19.47, 15.43,
33.58, 39.84, 28.94, 11.61, 17.23, 44.6, 7.56, 8.24, 5.74)), class = c("tbl_df",
"tbl", "data.frame"), row.names = c(NA, -15L))
> head(zed)
# A tibble: 6 x 4
evToRevJun15 evToGiJun15 evToRevDec18 evToGiDec18
<dbl> <dbl> <dbl> <dbl>
1 4.56 21.7 1.99 7.37
2 1.35 5 5.92 24.7
3 1.26 4.85 2.13 7.89
4 5.99 23.0 6.6 34.7
5 2.79 21.5 5.84 19.5
6 6.97 34.8 4.32 15.4
两个evToRev
列用于X轴,两个evToGi
列用于Y轴,因此,数据框中的每一行都构成图中的两个点。>
Here是一个示例,其中有点突出了我要去的东西,但不完全是我想要的。想象一下这张图,但是梅西将得到2分,梅西将得到2分,安吉尔·迪玛利亚得到2分,内马尔得到2分,等等。
任何想法或帮助都会很棒!请让我知道是否可以添加其他说明。
编辑:this article中的第二和第三张图是即时通讯的更好示例。
答案 0 :(得分:1)
实现此目标的第一步是将数据重塑为与ggplot更好地兼容的格式-完成后,实际的绘图代码非常简单:
library(tidyverse)
df_long = df %>%
# Need an id that will keep observations together
# once they've been split into separate rows
mutate(id = 1:n()) %>%
gather(key = "key", value = "value", -id) %>%
mutate(Time = str_sub(key, nchar(key) - 4),
Type = str_remove(key, Time)) %>%
select(-key) %>%
# In this case we don't want the data entirely
# 'long' since evToRev and evToGi will be
# mapped separately to x and y
spread(Type, value)
df_long %>%
ggplot(aes(x=evToRev, y=evToGi, colour=Time)) +
# group aesthetic controls which points are connected
geom_line(aes(group = id), colour = "grey40") +
geom_point(size = 3) +
theme_bw()
结果:
使用tidyr::pivot_longer()
可以更整齐地进行重塑,
但这仍然仅在开发版本中可用,因此我使用了gather
和spread
。