欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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)

ggplot2: 数据分布图

密度分布图

密度分布图的画法与画直方图相似, 将 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)

ggplot2: 数据分布图

箱形图, 点阵箱形图, 小提琴图

#箱形图
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)

ggplot2: 数据分布图

众图合成

最后, 将这些不同的分布图合成后会看到更有意思的结果。
先画散点图, 将xvar and yvar 的分布密度放在 X 和 Y 轴上。 我们将它称为地毯图。

#rug plot
ggplot(xy,aes(xvar,yvar))  + geom_point() + geom_rug(col="darkred",alpha=.1)

ggplot2: 数据分布图

还可以将密度分布图(或直方图,箱形图)放在 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))

ggplot2: 数据分布图

以上code来自于网站Slawa Rokicki