R语言 如何使用ggplot2向多个组的配对观测添加线?

67up9zun  于 2023-02-17  发布在  其他
关注(0)|答案(1)|浏览(222)

我对样本进行了不同的处理,然后在两个不同的温度下进行了测量。现在,我想使用ggplot2在属于一个样本的两个点之间添加直线,以可视化每个样本的成对观测结果。然而,当我尝试这样做时,直线没有连接两个点,而是在图中显示为垂直线。编辑:关于重复项,我认为与我的数据的主要区别在于变量“fishid”中有两个以上的类别。
这是我的数据:

  1. dput(s2n)
  2. structure(list(fishid = structure(c(1L, 1L, 2L, 2L, 3L, 3L, 4L,
  3. 4L, 5L, 5L, 6L, 6L, 7L, 7L, 8L, 8L, 80L, 80L, 81L, 81L, 82L,
  4. 82L, 83L, 83L, 84L, 84L, 85L, 85L, 86L, 86L), .Label = c("1",
  5. "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13",
  6. "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24",
  7. "25", "26", "27", "28", "29", "30", "31", "32", "33", "34", "35",
  8. "36", "37", "38", "39", "40", "41", "42", "43", "44", "45", "47",
  9. "48", "49", "50", "51", "52", "53", "54", "55", "56", "57", "58",
  10. "59", "60", "61", "62", "63", "64", "65", "66", "67", "68", "69",
  11. "70", "71", "72", "73", "74", "75", "76", "77", "78", "79", "80",
  12. "81", "82", "83", "84", "85", "86", "87", "88", "89", "90", "91",
  13. "92", "93", "94", "95", "96", "97", "98", "99", "100", "101",
  14. "102", "103", "104", "105", "107", "108", "109", "110", "111",
  15. "112", "113", "114"), class = "factor"), mtemp = c("23", "28",
  16. "23", "28", "23", "28", "23", "28", "23", "28", "23", "28", "23",
  17. "28", "23", "28", "23", "28", "23", "28", "23", "28", "23", "28",
  18. "23", "28", "23", "28", "23", "28"), treat = c("2n 28 28 n",
  19. "2n 28 28 n", "2n 28 28 n", "2n 28 28 n", "2n 28 28 n", "2n 28 28 n",
  20. "2n 28 28 n", "2n 28 28 n", "2n 28 28 n", "2n 28 28 n", "2n 28 28 n",
  21. "2n 28 28 n", "2n 28 28 n", "2n 28 28 n", "2n 28 28 n", "2n 28 28 n",
  22. "2n 23 23 n", "2n 23 23 n", "2n 23 23 n", "2n 23 23 n", "2n 23 23 n",
  23. "2n 23 23 n", "2n 23 23 n", "2n 23 23 n", "2n 23 23 n", "2n 23 23 n",
  24. "2n 23 23 n", "2n 23 23 n", "2n 23 23 n", "2n 23 23 n"), N = c(4,
  25. 3, 4, 4, 3, 3, 4, 4, 4, 3, 4, 4, 4, 4, 4, 4, 3, 1, 4, 4, 3, 4,
  26. 3, 4, 3, 4, 1, 2, 1, 4), mo2_ms = c(0.0305521553416736, 0.145682463746226,
  27. 0.0396710467863138, 0.0954773661923973, 0.0423458775047231, 0.074814122089128,
  28. 0.0340000306491368, 0.164506483241493, 0.0199183915444751, 0.0141578076646164,
  29. 0.0352100227426512, 0.140223575206394, 0.0867953316734817, 0.181380336846186,
  30. 0.0814477532477152, 0.245441716187935, 0.0753519288551872, 0.192765607492084,
  31. 0.112553420128519, 0.154874683462045, 0.096957746918988, 0.174162792054346,
  32. 0.0572348282730377, 0.198498172699998, 0.0969845912494747, 0.0883266097299638,
  33. 0.00529159243126301, 0.048338396851318, 0.0154151384427716, 0.165540613767348
  34. ), sd = c(0.0225825414793994, 0.040281910779122, 0.0353185196092258,
  35. 0.0524668087896432, 0.0229625978946772, 0.00715984733525644,
  36. 0.0213724448650181, 0.0416621727661058, 0.00851354415170029,
  37. 0.00409799422855184, 0.0147318782789288, 0.0800135890495444,
  38. 0.0207362723426385, 0.0171873141998392, 0.0526956334274908, 0.0569951399710065,
  39. 0.0352363626542992, NA, 0.0752014409258304, 0.018373804187377,
  40. 0.0294532805712796, 0.0188553911271472, 0.0414618539087027, 0.0294471142185835,
  41. 0.0120861972052966, 0.0268913613699161, NA, 0.0614419583639327,
  42. NA, 0.0919378871844233), se = c(0.0112912707396997, 0.0232567720317986,
  43. 0.0176592598046129, 0.0262334043948216, 0.013257462075785, 0.00413373978636693,
  44. 0.0106862224325091, 0.0208310863830529, 0.00425677207585014,
  45. 0.00236597807099194, 0.00736593913946441, 0.0400067945247722,
  46. 0.0103681361713193, 0.00859365709991959, 0.0263478167137454,
  47. 0.0284975699855032, 0.0203437234637229, NA, 0.0376007204629152,
  48. 0.00918690209368851, 0.0170048594663459, 0.00942769556357362,
  49. 0.0239380125152904, 0.0147235571092918, 0.00697796920995688,
  50. 0.0134456806849581, NA, 0.0434460254085183, NA, 0.0459689435922116
  51. ), ci = c(0.0359338628475153, 0.100065813667779, 0.0561996461192354,
  52. 0.0834864008913134, 0.0570422553899265, 0.0177860467758856, 0.0340083290977783,
  53. 0.0662938138947925, 0.0135469485652242, 0.0101799820056808, 0.0234417057993332,
  54. 0.127319475421606, 0.0329960366510934, 0.0273488522865142, 0.0838505119529514,
  55. 0.0906919863099286, 0.0875319772944557, NaN, 0.11966227391321,
  56. 0.0292368226250621, 0.073166005001879, 0.0300031349136345, 0.102996954893691,
  57. 0.0468569299230992, 0.0300237782693287, 0.0427901568178693, NaN,
  58. 0.552034093813681, NaN, 0.146293694692829)), row.names = c(1L,
  59. 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L, 11L, 12L, 13L, 14L, 15L,
  60. 16L, 150L, 151L, 152L, 153L, 154L, 155L, 156L, 157L, 158L, 159L,
  61. 160L, 161L, 162L, 163L), class = "data.frame")

以下是我创建的不带连接线的图的代码:

  1. p1 <- ggplot(data = s2n, aes(x = treat, y = mo2_ms, fill = mtemp)) +
  2. geom_boxplot() +
  3. geom_point(position=position_jitterdodge(jitter.width = 0, jitter.height = 0)) # I am using the position_jitterdodge to actually get the points to align to the middel of the boxplots
  4. p1

这将生成以下图:

我想创建一个这样的图,但在同一个图中使用两种处理:

我尝试使用此代码在同一个图中添加两个处理的连接线:

  1. p3 <- ggplot(data = s2n, aes(x = treat, y = mo2_ms, fill = mtemp)) +
  2. geom_boxplot() +
  3. geom_point(position=position_jitterdodge(jitter.width = 0, jitter.height = 0)) +
  4. geom_line(aes(group=fishid))
  5. p3

以下是结果图:

当我尝试在geom_line参数中使用相同的position_jitterdodge时,我得到以下结果:

  1. p4 <- ggplot(data = s2n, aes(x = treat, y = mo2_ms, fill = mtemp)) +
  2. geom_boxplot() +
  3. geom_point(position=position_jitterdodge(jitter.width = 0, jitter.height = 0)) +
  4. geom_line(position=position_jitterdodge(jitter.width = 0, jitter.height = 0), aes(group=fishid))
  5. p4

导致此图:

有人对如何用直线连接plot4中的点有什么建议吗?

bq3bfh9z

bq3bfh9z1#

这是一个有点狡猾...:)
首先,如果指定width和height = 0,我就不会使用jitter。
图1:但是我想,主要的问题是线条减淡效果不好。我会根据你的变量mtemp手动减淡。
图2和图3:至于我的另一个建议--我真的很想鼓励你重新思考你的可视化,也许可以考虑遵循链接中的建议。下面是两种制作散点图或箱线图的方法。

  1. library(ggplot2)
  2. library(tidyr)
  3. library(dplyr)
  4. ## saving this as an expression in order to save typing
  5. expr <- expr(ifelse(mtemp == 23, newtreat - .25, newtreat + .25))
  6. s2n %>%
  7. mutate(newtreat = as.integer(factor(treat))) %>%
  8. ggplot(aes(x = !!expr, y = mo2_ms)) +
  9. ## you will need to explicitly define the boxplot group
  10. geom_boxplot(aes(group = !!expr)) +
  11. ## don't do anything dodgy
  12. geom_point() +
  13. geom_line(aes(group = fishid))

创建于2023年2月15日,使用reprex v2.0.2

  1. s2n %>%
  2. select(fishid, treat, mtemp, mo2_ms) %>%
  3. pivot_wider(names_from = "mtemp", values_from = "mo2_ms", names_prefix = "m") %>%
  4. ggplot(aes(m23, m28)) +
  5. geom_point() +
  6. ## I like to add a line of equality which you might label for more clarity
  7. geomtextpath::geom_textabline(intercept = 0, slope = 1, lty = 2, linewidth = .1,
  8. label = "Better\nEqual\nWorse") +
  9. facet_grid(~treat)

  1. s2n %>%
  2. select(fishid, treat, mtemp, mo2_ms) %>%
  3. pivot_wider(names_from = "mtemp", values_from = "mo2_ms", names_prefix = "m") %>%
  4. ggplot(aes(x = "", y = m28-m23)) +
  5. geom_boxplot(aes(fill = treat))

展开查看全部

相关问题