多行使用数据中的多个组进行绘图

时间:2017-05-03 08:27:11

标签: r ggplot2 dplyr

根据某些条件,我想绘制如下数据:

WC     ASL  TS  LPD
7101    3   L   573.57
7101    3   L   323.33
7102    4   R   113.36
7102    4   R   3.05
7103    7   L   204.72
7103    7   L   123.65
7104    21  R   252.36
7104    21  R   225.74
7104    21  R   147.79
7104    21  R   151.47
7105    27  L   350.51
7105    27  L   41.61
7105    27  L   22.29
7105    27  L   2.00

情节的条件是:

  1. 所有行都应该在一个图上
  2. Plot(for line)按TS,ASL和WC
  3. 分组

    我正在尝试这样的事情:

      ggplot(df2, aes(LPD, ASL, TS, colour=WC)) + 
      geom_line() + 
      geom_point()
    

    它的所有混乱...可能你可以帮助我更好地了解情节。

    因为上面的内容可能让很多人感到困惑,所以我会更简单一点:

    grp LPD
    1   0.56744
    1   0.4200938
    2   0.070033616
    2   0.065484951
    3   0.327293
    3   0.4718639
    3   0.539516903
    3   0.672646939
    3   0.769603286
    3   0.560730825
    3   0.592725708
    4   0.27415791
    4   0.17706706
    4   0.084262982
    4   0.220420565
    5   1.066580889
    5   0.663611983
    5   0.005299676
    5   0.180121466
    5   0.055205502
    6   0.435355273
    6   0.544843791
    7   2.437439375
    7   0.631948813
    7   0.165961834
    7   0.092725372
    7   0.262442283
    9   0.268541902
    9   0.041798885
    11  0.348282689
    11  0.033044253
    11  0.046070074
    11  0.127173837
    11  0.030580852
    12  7.213290722
    12  2.738036844
    12  1.581291713
    12  1.234204974
    12  0.043930992
    12  0.089781343
    12  0.077482862
    12  0.056506104
    12  0.007676594
    

1 个答案:

答案 0 :(得分:4)

OP并不完全清楚所需的输出是什么。但是,从评论中得出结论可能是这样的:

enter image description here

要创建此图,需要将数据从宽格式转换为长格式。 ggplot2首选长格式。为此,使用melt()包中的data.table

读取数据

library(data.table)
df2 <- fread(
  "WC     ASL  TS  LPD
  7101    3   L   573.57
  7101    3   L   323.33
  7102    4   R   113.36
  7102    4   R   3.05
  7103    7   L   204.72
  7103    7   L   123.65
  7104    21  R   252.36
  7104    21  R   225.74
  7104    21  R   147.79
  7104    21  R   151.47
  7105    27  L   350.51
  7105    27  L   41.61
  7105    27  L   22.29
  7105    27  L   2.00"
)

准备数据

# reshape from wide to long format 
molten <- melt(setDT(df2), id = "LPD")
# ensure that factor levels are in order of appearance
molten[, value := forcats::fct_inorder(value)]

str(molten)
#Classes ‘data.table’ and 'data.frame': 42 obs. of  3 variables:
# $ LPD     : num  573.57 323.33 113.36 3.05 204.72 ...
# $ variable: Factor w/ 3 levels "WC","ASL","TS": 1 1 1 1 1 1 1 1 1 1 ...
# $ value   : Factor w/ 12 levels "7101","7102",..: 1 1 2 2 3 3 4 4 4 4 ...
# - attr(*, ".internal.selfref")=<externalptr> 

请注意,melt()已在一个WC列中收集(或收集)ASLTSvalue列的所有值之后是character课。

绘图时,ggplot2隐含地将字符转换为因子,从而使用字母的字母排序顺序。这意味着ASL的值按21,27,3,4,7的顺序绘制,而不是3,4,7,21,27。

为了保持数据中出现的值的顺序,使用fct_inorder()包中的方便forcats函数明确地表达了对因子的强制。

绘制数据

library(ggplot2)
ggplot(molten, aes(x = value, y = LPD)) + 
  geom_line() + 
  geom_point() + 
  facet_wrap(~ variable, scales = "free_x") +
  theme_bw()

编辑1

OP提供了额外的数据。这些可以使用geom_step()

进行绘制
ggplot(DT2, aes(x = grp, y = LPD)) + geom_point() + geom_step() + 
  theme_bw()

enter image description here

请注意,x轴显示grp为连续比例。

编辑2

根据comments,OP希望将行作为&#34;步骤行&#34; 。不幸的是,OP没有指定沿x轴准确显示的内容。所以这些是OP可能期望看到的另一种猜测:

DT2[, grp := factor(grp)]
ggplot(DT2, aes(x = seq_len(nrow(DT2)), y = LPD, group = grp, colour = grp)) + 
  geom_point() + geom_step() + 
  theme_bw()

enter image description here

请注意,这里的数据点是连续编号的。这些数字显示在x轴上。数据点通过分组步骤功能连接。此外,这些组是用颜色编码的。

如果数据点在每个组中编号,则会产生更紧凑的显示,以便每个组以1开头。

DT2[, rn := factor(rowid(grp))]
ggplot(DT2, aes(x = rn, y = LPD, group = grp, colour = grp)) + 
  geom_point() + geom_step() + 
  theme_bw()

enter image description here