我发现了我发现的大卫·斯特恩(David L. Stern)在howtogiveatalk.com处的一些有用数据,这些数字在每个分类变量的均值/标准摘要旁边都有一个抖动图。
上方链接的页面中的第一个示例我花了一些时间试图在网上找到类似的数据而不能。
我不确定他用哪些软件和软件包来创建这些数字(更新: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()
代码非常粗糙,但大部分都在那里。但我无法弄清楚如何在抖动旁边移动geom_point和geom_linerange。
那么如何在R中制作这个数字(最好是使用ggplot2)?
答案 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")
如果将此代码调整为ggplot扩展以使其成为一个简单的geom,那将是很棒的。如果我能找到时间,我可能会自己接受挑战。
答案 1 :(得分:2)
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"))