如何在R中为两个geom并排绘制相同的分类? (errorbarjitter)

时间:2016-03-10 23:18:55

标签: r data-visualization ggplot2

我发现了我发现的大卫·斯特恩(David L. Stern)在howtogiveatalk.com处的一些有用数据,这些数字在每个分类变量的均值/标准摘要旁边都有一个抖动图。

以下是enter image description here

上方链接的页面中的第一个示例

我花了一些时间试图在网上找到类似的数据而不能。

我不确定他用哪些软件和软件包来创建这些数字(更新:David Stern responded并解释他使用了custom built Matlab函数)。我最熟悉R和ggplot2,并认为必须能够使用这些工具创建类似的东西。我试图直接进入并制造它,但无法弄清楚从哪里开始。

我是如何开始的:

library(dplyr)
library(ggplot2)
library(tidyr)

df <- data_frame(a = rnorm(100, mean = 0.75, sd  = 0.5), b = rgamma(100, shape = 0.75, scale = 0.5), c = rbinom(100, size = 1, prob = 0.6))
df <- gather(df)
df.sum <- df %>% group_by(key) %>% summarise(mean = mean(value), sd = sd(value))

ggplot(data = df.sum, aes(x = key)) + 
  geom_jitter(data = df, aes(y = value)) + 
  geom_point(aes(y = mean)) +
  geom_linerange(aes(x = key, y = mean, ymin = (mean - sd), ymax = (mean + sd))) +
  theme_bw()

生成以下图表: enter image description here

代码非常粗糙,但大部分都在那里。但我无法弄清楚如何在抖动旁边移动geom_point和geom_linerange。

那么如何在R中制作这个数字(最好是使用ggplot2)?

2 个答案:

答案 0 :(得分:2)

我已经明白了!我将在这里发布答案以供将来参考,以及其他任何想要制作类似情节的人。

我的关键是将x轴从因子转换为数字以应用移位。

library(dplyr)
library(ggplot2)
library(tidyr)

set.seed(125)

df <- data_frame(Normal = rnorm(100, mean = 0.5, sd  = 0.5), 
                 Gamma = rgamma(100, shape = 0.5, scale = 0.5), 
                 Bimodal = c(rnorm(50, mean = 0.1, sd = 0.15), rnorm(50, mean = 0.9, sd = 0.15))
                 )
df <- gather(df)
df.sum <- df %>% 
  group_by(key) %>% 
  summarise(mean = mean(value), sd = sd(value))

ggplot(data = df, aes(x = key, y = value)) + 
  geom_jitter(position = position_jitter(width = 0.2), shape = 1, size = 3.5) + 
  geom_pointrange(data = df.sum, aes(x = as.numeric(key)+0.3, y = mean, ymin = (mean - sd), ymax = (mean + sd))) +
  geom_point(data = df.sum, aes(x = as.numeric(key)+0.3, y = mean), size = 3.5) +
  theme_bw() + xlab("") + ylab("Arbitrary Units")

Example plot

如果将此代码调整为ggplot扩展以使其成为一个简单的geom,那将是很棒的。如果我能找到时间,我可能会自己接受挑战。

答案 1 :(得分:2)

没有ggplot2

相当简单
x<-0.5+runif(100,-0.2,0.2)
y<-rbind(rnorm(100,1,1),rgamma(100,1,1),rbinom(100,1,0.5)*2+rnorm(100,0,0.2))
for (j in 0:2){
  if (j==0){plot(x,y[1,],xlim=c(0,4),ylim=c(-1,5),xlab="",ylab="Arbitrary Units",xaxt="n",bty="n",col="gray50")}
  else{points(x+j, y[j+1,],col="gray50")}
  points(j+0.9, mean(y[j+1,]),pch=19)
  arrows(j+0.9,mean(y[j+1,])-sd(y[j+1,]),j+0.9,mean(y[j+1,])+sd(y[j+1,]), angle=90,length=0)
  } # for j categories
axis(1,seq(0.5,2.5, by=1),tick=F,labels=c("Normal","Gamma","Bimodal"))

enter image description here