我可以使用ggplot2在R中使用“成对的圆”创建散点图吗

时间:2019-07-24 00:08:30

标签: r ggplot2

首先,要澄清标题。我正在尝试创建一个散点图。我的数据的性质是每个观察值都有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中的第二和第三张图是即时通讯的更好示例。

enter image description here

1 个答案:

答案 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()

结果:

enter image description here

使用tidyr::pivot_longer()可以更整齐地进行重塑, 但这仍然仅在开发版本中可用,因此我使用了gatherspread

相关问题