【问题标题】:Multiple Line Plot with Line Lengths Equal to Data Range--GGPlot2线长等于数据范围的多条线图--GGPlot2
【发布时间】:2014-04-03 15:59:52
【问题描述】:

我正在尝试使用 R 中的 ggplot2 创建一个具有多条线性线的图,其中每条线代表一个单独的个体对 x 轴上环境变化的响应。我可以使用下面提供的脚本使这个图没有问题,但是,我希望每个人的每条线的长度代表每个人被采样的数据范围(有些线显然会比其他线长)。

此链接 (http://www.intechopen.com/source/html/18476/media/image4.jpeg) 将向您展示我希望最终图表的样子,除了我只需要 1 帧(不是 9 帧),而且线条的长度会有所不同。另外,我的 x 轴上的数据是连续的,而不是离散的。

看来我可能需要使用geom_linerange,但调整 ymin 和 ymax 似乎没有意义,因为我实际上是在尝试限制 x 轴上的范围。

非常感谢任何帮助!

此代码将根据以下数据生成图表。

p <- qplot(dBLevel,LowFreq, group=Male,data=test,geom="line")

数据子集('Upper' 和 'Lower' 表示每个 'Male' 在其下采样的环境变量 (dBLevel) 的范围。'LowFreq' 是对 'dBLevel' 的响应变量。)

test <- structure(list(Male = c(69L, 69L, 69L, 69L, 69L, 113L, 113L, 
113L, 113L, 113L, 126L, 126L, 126L, 126L, 126L, 143L, 143L, 143L, 
143L, 143L, 155L, 155L, 155L, 155L, 155L, 178L, 178L, 178L, 178L, 
178L, 186L, 186L, 186L, 186L, 186L, 193L, 193L, 193L, 193L, 193L
), dBLevel = c(-20L, -10L, 0L, 10L, 20L, -20L, -10L, 0L, 10L, 
20L, -20L, -10L, 0L, 10L, 20L, -20L, -10L, 0L, 10L, 20L, -20L, 
-10L, 0L, 10L, 20L, -20L, -10L, 0L, 10L, 20L, -20L, -10L, 0L, 
10L, 20L, -20L, -10L, 0L, 10L, 20L), LowFreq = c(3093.5, 3142.7, 
3191.9, 3241.2, 3290.4, 3017.7, 3218.1, 3418.6, 3619, 3819.4, 
2986.1, 3251.1, 3516.2, 3781.2, 4046.3, 2776.5, 2793.1, 2809.8, 
2826.4, 2843.1, 3207.8, 3306.2, 3404.5, 3502.8, 3601.2, 2813.1, 
2834.5, 2855.9, 2877.2, 2898.6, 4468.3, 4461.2, 4454.2, 4447.1, 
4440.1, 2498.5, 2596.9, 2695.4, 2793.8, 2892.3), Upper = c(3.7, 
3.7, 3.7, 3.7, 3.7, 12.23, 12.23, 12.23, 12.23, 12.23, -3.96, 
-3.96, -3.96, -3.96, -3.96, -3.22, -3.22, -3.22, -3.22, -3.22, 
-11.34, -11.34, -11.34, -11.34, -11.34, 15.34, 15.34, 15.34, 
15.34, 15.34, -6.75, -6.75, -6.75, -6.75, -6.75, -0.67, -0.67, 
-0.67, -0.67, -0.67), Lower = c(-2.71, -2.71, -2.71, -2.71, -2.71, 
-1.31, -1.31, -1.31, -1.31, -1.31, -16.17, -16.17, -16.17, -16.17, 
-16.17, -15.28, -15.28, -15.28, -15.28, -15.28, -15.79, -15.79, 
-15.79, -15.79, -15.79, -3.79, -3.79, -3.79, -3.79, -3.79, -20.19, 
-20.19, -20.19, -20.19, -20.19, -8.24, -8.24, -8.24, -8.24, -8.24
)), .Names = c("Male", "dBLevel", "LowFreq", "Upper", "Lower"
), row.names = c(NA, 40L), class = "data.frame")

【问题讨论】:

  • 如果没有可重现的示例,将很难为您提供帮助(即我们需要数据框 dbLevel)。
  • 您只需要dBLevel 列中的数据吗?还是来自实际数据框“lowfreqblups”的数据?无论哪种方式,您需要整个数据框还是只需要两个人的子集?
  • 如果您提供一个最小的、独立的示例,帮助会容易得多。请查看这些链接以了解一般想法以及如何在 R 中执行此操作:hereherehere
  • 我已经编辑了帖子以包含生成我目前可以制作的绘图的最少代码,以及绘图的原始数据。我很抱歉没有事先阅读一些指导方针并发表了一篇实际上毫无用处的帖子。感谢您的意见!
  • 我仍在试图弄清楚您所说的“我希望每个人的每行长度代表每个人被采样的数据范围”。例如,男性 #69 被测量了五次。你的意思是 -20 真的等于 -2.71(而 20 等于 3.70)吗?如果,那么其他 dBLevel 值如何映射到区间 (-2.71, 3.70)?

标签: r ggplot2


【解决方案1】:

这是一个可能的解决方案,它为每个 Male 绘制一条线,其中斜率和截距由原始数据确定,但 x 范围由该男性的 LowerUpper 的值确定.

我使用线性回归lm() 来获取线系数,并使用predict() 来获取每个下限值和上限值的 y 值。这些值被放入名为line_dat 的data.frame 中。

male_vec = unique(test$Male)

predict_list = list()

for (i in seq(length(male_vec))) {
    male = male_vec[i]
    subdat = test[test$Male == male, ]
    x = subdat[, "dBLevel"]
    y = subdat[, "LowFreq"]
    model = lm(y ~ x)
    new_x = data.frame(x=c(subdat[1, "Lower"], subdat[1, "Upper"]))
    new_y = predict(model, new_x)
    predict_list[[i]] = data.frame(Male=male, dBLevel=new_x$x, LowFreq=new_y)
}

line_dat = do.call(rbind, predict_list)
line_dat
#    Male dBLevel  LowFreq
# 1    69   -2.71 3178.599
# 2    69    3.70 3210.155
# 11  113   -1.31 3392.304
# 21  113   12.23 3663.686
# 12  126  -16.17 3087.594
# 22  126   -3.96 3411.220
# 13  143  -15.28 2784.339
# 23  143   -3.22 2804.419
# 14  155  -15.79 3249.221
# 24  155  -11.34 3292.982
# 15  178   -3.79 2847.761
# 25  178   15.34 2888.642
# 16  186  -20.19 4468.414
# 26  186   -6.75 4458.939
# 17  193   -8.24 2614.257
# 27  193   -0.67 2688.784

library(ggplot2)

p = ggplot(data=line_dat, aes(x=dBLevel, y=LowFreq, group=Male)) +
    geom_line(size=1.0)

ggsave("lines.png", plot=p, height=4, width=6, dpi=150)

【讨论】:

  • 我觉得你做的很棒!这正是我所想象的。我将不得不花一些时间坐下来理解你的剧本,因为我不熟悉其中的一些。谢谢!
猜你喜欢
  • 2013-09-06
  • 2019-06-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-10
  • 1970-01-01
  • 2022-01-17
  • 1970-01-01
相关资源
最近更新 更多