【问题标题】:ggplot2 does not plot multiple groups of a variable, only plots one lineggplot2 不绘制多组变量,只绘制一行
【发布时间】:2021-04-17 20:01:54
【问题描述】:

我想使用 ggplot 绘制与不同组变量“Prob”(0.1、0.5 和 0.9)相对应的多行图。尽管如此,当我运行代码时,它只绘制一行而不是 3。感谢您的帮助:)

这是我的代码:

Prob <- c(0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.9,0.9,0.9,0.9,0.9,0.9,0.9,0.9,0.9,0.9,0.9,0.9,0.9,0.9,0.9,0.9,0.9,0.9,0.9,0.9,0.9,0.9,0.9,0.9,0.9,0.9,0.9,0.9,0.9,0.9,0.9,0.9,0.9,0.9,0.9,0.9,0.9)

nit <- c(0.9,0.902777775,0.90555555,0.908333325,0.9111111,0.913888875,0.91666665,0.919444425,0.9222222,0.924999975,0.92777775,0.930555525,0.9333333,0.936111075,0.93888885,0.941666625,0.9444444,0.947222175,0.94999995,0.952777725,0.9555555,0.958333275,0.96111105,0.963888825,0.9666666,0.969444375,0.97222215,0.974999925,0.9777777,0.980555475,0.98333325,0.986111025,0.9888888,0.991666575,0.99444435,0.997222125,0.9999999,0.9,0.902777775,0.90555555,0.908333325,0.9111111,0.913888875,0.91666665,0.919444425,0.9222222,0.924999975,0.92777775,0.930555525,0.9333333,0.936111075,0.93888885,0.941666625,0.9444444,0.947222175,0.94999995,0.952777725,0.9555555,0.958333275,0.96111105,0.963888825,0.9666666,0.969444375,0.97222215,0.974999925,0.9777777,0.980555475,0.98333325,0.986111025,0.9888888,0.991666575,0.99444435,0.997222125,0.9999999,0.9,0.902777775,0.90555555,0.908333325,0.9111111,0.913888875,0.91666665,0.919444425,0.9222222,0.924999975,0.92777775,0.930555525,0.9333333,0.936111075,0.93888885,0.941666625,0.9444444,0.947222175,0.94999995,0.952777725,0.9555555,0.958333275,0.96111105,0.963888825,0.9666666,0.969444375,0.97222215,0.974999925,0.9777777,0.980555475,0.98333325,0.986111025,0.9888888,0.991666575,0.99444435,0.997222125,0.9999999)

greek <- log((1-Prob)/Prob)/-10
italian <- ((0.997-nit)/(0.997-0.97))^3 
Temp<-c(rep(25,111))
GT <- ((30-Temp)/(30-3.3))^3
GH <- 1-GT-italian
acid <- (-1*(((sign(GH)*(abs(GH)^(1/3)))*(7-5))-7))
Species<-c(rep("Case",111))
data <- as.data.frame(cbind(Prob,greek,GT,GH,italian, Temp,acid,nit, Species))
ggplot()  +
        geom_line(data = data, aes_string(x = acid, y = nit, group = Prob, color = factor(Prob)), size = 0.8)

【问题讨论】:

  • 数据位于相同的 x,y 位置,因此它们被过度绘制。按照您的代码,这是有道理的,因为Prop 仅用于计算greek,并且不会以我可以检测到的方式流入nitacid
  • @teunbrand 问题是当变量(Prob、nit、greek、italian、Temp、GT、GH、acid、Species)取自 Excel 文件时,ggplot 会绘制 Prob 变量的组,但不是,当我使用上述 R 代码计算它们时..我不知道错误...感谢您的帮助!

标签: r ggplot2


【解决方案1】:

答案似乎分为两部分:

  1. 在您的数据框data 中,应该是数字的列不是数字的。
  2. 你只看到一行的原因。

修复数据框并使用aes() 代替aes_string()

当您使用 as.data.frame(cbind(... 创建数据框并在 ggplot 部分中使用 aes_string(.. 时,我注意到有些奇怪。如果您通过str(data) 快速检查data,您将看到data 中的所有列都是字符,而在环境中,在代码中为它们各自的列准备的数据是数字的。前任。 acid 是数字,而 data$acid 是字符。

原因是您使用as.data.frame(cbind(... 将列绑定到数据框中。这导致所有数据都被强制转换为一个字符,因此您失去了数据的数字性质。这也是为什么您必须使用aes_string(...) 而不是aes() 才能使其工作的原因。要将向量绑定到一个数据框中,请使用data.frame(...,而不是as.data.frame(cbind(...

要解决所有这些问题,请将您的列绑定在一起,如下所示 + ggplot 代码:

data <- data.frame(Prob,greek,GT,GH,italian, Temp,acid,nit, Species)
# data <- as.data.frame(cbind(Prob,greek,GT,GH,italian, Temp,acid,nit, Species))

ggplot()  +
  geom_line(data=data, aes(x = acid, y = nit, group = Prob, color = factor(Prob)), size = 0.8)

为什么只有一行?

为什么你只看到一行的简单答案是data$Prob 的每个值的行是相等的。你看到的是overplotting的效果。这意味着data$Prob == 0.1 的行与data$Prob == 0.5data$Prob = 0.9 时的行是同一行。

为了证明这一点,让我们将它们分开。我将意识到Prob 可以通过连续 37 次重复 0.1、0.5 和 0.9 来创建。我将创建一个因子,用作data$nit 的乘法因子,这将导致我们的行分开:

my_factor <- rep(c(1,1.1,1.5), each=37)  # our multiplication fractor
data$nit <- data$nit * my_factor   # new nit column

# same plot code
ggplot()  +
      geom_line(data=data, aes(x = acid, y = nit, group = Prob, color = factor(Prob)), size = 0.8)

你去吧。我们那里有所有线条,由于过度绘制,您只是看不到它们。您可以通过比较每个 data$Prob 的图来说服自己,无需乘法业务和原始数据:

# use original dataset as above
ggplot()  +
  geom_line(data=data, aes(x = acid, y = nit, group = Prob, color = factor(Prob)), size = 0.8) +
  facet_wrap(~Prob)

【讨论】:

  • 非常感谢您的回复@chemdork123,但这不是问题。我意识到这三行应该是不同的,它们不会重叠。如果变量“酸”被替换为ggplot 工作的数字向量而不是公式。所以我认为该错误与计算包含三次平方根的“酸”的公式有关,R 无法将其识别为数字向量(尽管我检查过并且它的类是数字的)。我不知道如何解决这个问题....再次感谢您的帮助:)
  • 如果您认为问题在于立方根的计算 - 那么这不是ggplot 问题。虽然 - 使用 data.fram(... 而不是 as.data.frame(cbind(... 仍然是更好的主意,除非您想花所有时间转换回正确的课程。至于立方根,kader 包(documentation here)中有一个cuberoot() 函数。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-15
相关资源
最近更新 更多