ggplot2: 数据分布图
程序员文章站
2024-03-07 20:49:33
...
ggplot2: 数据分布图
用 R 数据包 ggplot 来画数据分布图。
#启用 ggplot 包
library(ggplot2)
library(gridExtra) #用以安排所画之图
# 先模拟一些数据
set.seed(50005)
xvar <- c(rnorm(1500, mean = -1.5), rnorm(1500, mean = 1.5))
yvar <- c(rnorm(1500, mean = 1.5), rnorm(1500, mean = 1.5))
zvar <- as.factor(c(rep(1, 1500), rep(2, 1500)))
xy <- data.frame(xvar, yvar, zvar)
前六行数据
> head(xy)
xvar yvar zvar
1 -1.280130 -0.2090427 1
2 -1.796032 2.2485486 1
3 -1.253466 2.5731907 1
4 -3.631125 1.4768379 1
5 -2.680294 2.9795864 1
6 -2.898034 1.8608034 1
直方图
用 ggplot 画直方图相对简单, 这里将 xvar 分布做成直方图, 经修改后分布图已不错。
#counts on y-axis
g1<-ggplot(xy, aes(xvar)) + geom_histogram() #难看
g2<-ggplot(xy, aes(xvar)) + geom_histogram(binwidth=1) #修改 binwidth
g3<-ggplot(xy, aes(xvar)) + geom_histogram(fill=NA, color="black") + theme_bw() #nicer looking
#密度 on y-axis
g4<-ggplot(xy, aes(x=xvar)) + geom_histogram(aes(y = ..density..), color="black", fill=NA) + theme_bw()
grid.arrange(g1, g2, g3, g4, nrow=1)
密度分布图
密度分布图的画法与画直方图相似, 将 geom_histogram() 改成 geom_density()即可.
#基本图
p1<-ggplot(xy, aes(xvar)) + geom_density()
#与直方图叠加, 再加条蓝色密度分布线
p2<-ggplot(xy, aes(x=xvar)) +
geom_histogram(aes(y = ..density..), color="black", fill=NA) +
geom_density(color="blue")
#将 xvar 用 z 数据分组, 用 alpha 来修饰透明度。
p3<-ggplot(xy, aes(xvar, fill = zvar)) + geom_density(alpha = 0.2)
grid.arrange(p1, p2, p3, nrow=1)
箱形图, 点阵箱形图, 小提琴图
#箱形图
b1<-ggplot(xy, aes(zvar, xvar)) +
geom_boxplot(aes(fill = zvar)) +
theme(legend.position = "none")
#点阵箱形图
b2<-ggplot(xy, aes(zvar, xvar)) +
geom_jitter(alpha=I(1/4), aes(color=zvar)) +
theme(legend.position = "none")
#小提琴图
b3<-ggplot(xy, aes(x = xvar)) +
stat_density(aes(ymax = ..density.., ymin = -..density..,
fill = zvar, color = zvar),
geom = "ribbon", position = "identity") +
facet_grid(. ~ zvar) +
coord_flip() +
theme(legend.position = "none")
grid.arrange(b1, b2, b3, nrow=1)
众图合成
最后, 将这些不同的分布图合成后会看到更有意思的结果。
先画散点图, 将xvar and yvar 的分布密度放在 X 和 Y 轴上。 我们将它称为地毯图。
#rug plot
ggplot(xy,aes(xvar,yvar)) + geom_point() + geom_rug(col="darkred",alpha=.1)
还可以将密度分布图(或直方图,箱形图)放在 X 和 Y 轴的边上 。 可将数据用第三变量 zvar 分组, 并以颜色区分。
#先搭一个空的框架, with nothing to print
empty <- ggplot()+geom_point(aes(1,1), colour="white") +
theme(
plot.background = element_blank(),
panel.grid.major = element_blank(),
panel.grid.minor = element_blank(),
panel.border = element_blank(),
panel.background = element_blank(),
axis.title.x = element_blank(),
axis.title.y = element_blank(),
axis.text.x = element_blank(),
axis.text.y = element_blank(),
axis.ticks = element_blank()
)
#xvar 和 yvar 的散点图
scatter <- ggplot(xy,aes(xvar, yvar)) +
geom_point(aes(color=zvar)) +
scale_color_manual(values = c("orange", "purple")) +
theme(legend.position=c(1,1),legend.justification=c(1,1))
#X轴的密度图
plot_top <- ggplot(xy, aes(xvar, fill=zvar)) +
geom_density(alpha=.5) +
scale_fill_manual(values = c("orange", "purple")) +
theme(legend.position = "none")
#Y轴的密度图
plot_right <- ggplot(xy, aes(yvar, fill=zvar)) +
geom_density(alpha=.5) +
coord_flip() +
scale_fill_manual(values = c("orange", "purple")) +
theme(legend.position = "none")
#将所有的图安排到一起, 并设计好合适的高和宽。 三个图按2x2排列, 空框架和散点图宽高为4, 另两图为4:1 和1:4
grid.arrange(plot_top, empty, scatter, plot_right, ncol=2, nrow=2, widths=c(4, 1), heights=c(1, 4))
以上code来自于网站Slawa Rokicki