2

我想用 ggplot2 从一组数据(Y 中的 $ proteinN 和 X 中的 $ 方法)创建一个带有 SDM 的条形图,并在同一个条形图中(重叠)与图例中的一个指标包含另一组数据($ 特定)具有子弹条形图的形状。有点像这样(但第一组数据的竖线和 SDM)


(来源:yaksis.com

这是我的代码和数据:

    library(ggplot2) 
    data <- textConnection("proteinN, supp, method, specific
    293, protnumb, insol, 46
    259, protnumb, insol, 46
    274, protnumb, insol, 46
    359, protnumb, fasp, 49
    373, protnumb, fasp, 49
    388, protnumb, fasp, 49
    373, protnumb, efasp, 62
    384, protnumb, efasp, 62
    382, protnumb, efasp, 62
    ")

    data <- read.csv(data, h=T)

# create functions to get the lower and upper bounds of the error bars
stderr <- function(x){sqrt(var(x,na.rm=TRUE)/length(na.omit(x)))}
lowsd <- function(x){return(mean(x)-stderr(x))}
highsd <- function(x){return(mean(x)+stderr(x))}

cbPalette <- c("#999999", "#E69F00", "#56B4E9", "#009E73", 
               "#F0E442", "#0072B2", "#D55E00", "#CC79A7")

# create a ggplot
ggplot(data=data,aes(x=method, y=proteinN, fill=method))+
  #Change _hue by _manualand remove c=45, l=80 if not desire#
  scale_fill_manual(values=cbPalette)+
  scale_fill_hue(c=45, l=80)+

  # first layer is barplot with means
  stat_summary(fun.y=mean, geom="bar", position="dodge", colour='black')+
  # second layer overlays the error bars using the functions defined above
  stat_summary(fun.y=mean, fun.ymin=lowsd, fun.ymax=highsd, 
              geom="errorbar", position="dodge",color = 'black', size=.5)

我确实尝试了一些东西,但没有任何效果,当我尝试添加第二组数据时,我总是得到这个错误输出:

错误:将变量映射到 y 并使用 stat="bin"。使用 stat="bin",它将尝试将 y 值设置为每组中的案例数。这可能会导致意外行为,并且不会在未来版本的 ggplot2 中被允许。如果您希望 y 表示案例计数,请使用 stat="bin" 并且不要将变量映射到 y。如果您希望 y 表示数据中的值,请使用 stat="identity"。有关示例,请参见 ?geom_bar。(已失效;最后在 0.9.2 版中使用)

错误:将变量映射到 y 并使用 stat="bin"。使用 stat="bin",它将尝试将 y 值设置为每组中的案例数。这可能会导致意外行为,并且不会在未来版本的 ggplot2 中被允许。如果您希望 y 表示案例计数,请使用 stat="bin" 并且不要将变量映射到 y。如果您希望 y 表示数据中的值,请使用 stat="identity"。有关示例,请参见 ?geom_bar。(已失效;最后在 0.9.2 版中使用)

这是我的尝试:

# create functions to get the lower and upper bounds of the error bars
stderr <- function(x){sqrt(var(x,na.rm=TRUE)/length(na.omit(x)))}
lowsd <- function(x){return(mean(x)-stderr(x))}
highsd <- function(x){return(mean(x)+stderr(x))}

cbPalette <- c("#999999", "#E69F00", "#56B4E9", "#009E73", 
               "#F0E442", "#0072B2", "#D55E00", "#CC79A7")
# create a ggplot
ggplot(data=data,aes(x=method, y=proteinN, fill=method, witdh=1))+
  #Change _hue by _manualand remove c=45, l=80 if not desire#
  scale_fill_manual(values=cbPalette)+
  scale_fill_hue(c=45, l=80)+

  #Second set of data#
  geom_bar(aes(x=method, y=specific, fill="light green"), width=.4) +

  # first layer is barplot with means
  stat_summary(fun.y=mean, geom="bar", position="dodge", colour='black')+

  # second layer overlays the error bars using the functions defined above
  stat_summary(fun.y=mean, fun.ymin=lowsd, fun.ymax=highsd, 
      geom="errorbar", position="dodge",color = 'black', size=.5)
4

1 回答 1

2

也许尝试这样的事情?

ggplot(data=data,aes(x=method, y=proteinN, fill=method, width=1))+
  scale_fill_hue(c=45, l=80) +
  stat_summary(fun.y=mean, geom="bar", position="dodge", colour='black')+
  stat_summary(fun.y=mean, fun.ymin=lowsd, fun.ymax=highsd, 
               geom="errorbar", position="dodge",color = 'black', size=.5) + 
  geom_bar(data = unique(data[,c('method','specific')]),
           aes(x = method,y = specific),
           stat = "identity",
           fill = "light green",
           width = 0.5)

一些笔记。

你拼错了“宽度”。

你的两条scale_fill线毫无意义。ggplot只会采用一个填充比例,以最后出现的为准。你不能像那样“修改”填充比例。您应该收到关于它的警告,明确指出:

“填充”的比例已经存在。为“填充”添加另一个比例,它将替换现有比例。

您收到的错误消息说:

将变量映射到 y 并使用 stat="bin"

即您在使用in (默认值)的y = proteinN同时指定。它继续解释:stat = "bin"geom_bar

使用 stat="bin",它将尝试将 y 值设置为每组中的案例数。

即,它不会在 中绘制y,而是尝试计算实例的数量,例如insol,并绘制它。(在这种情况下是三个。)对示例的粗略检查会?geom_bar立即发现大多数示例只指定了一个 x 变量。直到您在帮助中找到此示例:

# When the data contains y values in a column, use stat="identity"
library(plyr)
# Calculate the mean mpg for each level of cyl
mm <- ddply(mtcars, "cyl", summarise, mmpg = mean(mpg))
ggplot(mm, aes(x = factor(cyl), y = mmpg)) + geom_bar(stat = "identity")

它表明,当您指定所需的精确y值时,您还必须说stat = "identity". 方便的是,错误消息这样说:

如果您希望 y 表示数据中的值,请使用 stat="identity"。

最后一点是知道由于覆盖的条形图每个 x 值只有一个值,我们应该通过以下方式将该部分真正折叠到所需的最少信息:

unique(data[,c('method','specific')]

或者只是提前将其拆分为自己的数据框。

于 2014-08-15T02:49:43.847 回答