拿R来画画(六):很漂亮的Cleveland点图


这种图主要是针对一一对应的关系,简洁明了,图形的可读性很强,因为条形图在空间上是二维的,不容易直观建立一一对应的变量关联。

简单粗暴堆点

library(gcookbook)
library(ggplot2)
tophit <- tophitters2001[1:25,]
head(tophit)
A data.frame: 6 × 26
id first last name year stint team lg g ab ... sb cs bb so ibb hbp sh sf gidp avg
<fct> <chr> <chr> <chr> <int> <int> <fct> <fct> <int> <int> ... <int> <int> <int> <int> <int> <int> <int> <int> <int> <dbl>
walkela01 Larry Walker Larry Walker 2001 1 COL NL 142 497 ... 14 5 82 103 6 14 0 8 9 0.3501
suzukic01 Ichiro Suzuki Ichiro Suzuki 2001 1 SEA AL 157 692 ... 56 14 30 53 10 8 4 4 3 0.3497
giambja01 Jason Giambi Jason Giambi 2001 1 OAK AL 154 520 ... 2 0 129 83 24 13 0 9 17 0.3423
alomaro01 Roberto Alomar Roberto Alomar 2001 1 CLE AL 157 575 ... 30 6 80 71 5 4 9 9 9 0.3357
heltoto01 Todd Helton Todd Helton 2001 1 COL NL 159 587 ... 7 5 98 104 15 5 1 5 14 0.3356
aloumo01 Moises Alou Moises Alou 2001 1 HOU NL 136 513 ... 5 1 57 57 14 3 0 8 18 0.3314
ggplot(tophit, aes(x = avg, y = name)) + geom_point()

在这里插入图片描述

各点有序上升下降

观察一下上面的图可以发现,点上升得很凌乱,没有规律。因为这里Y轴是按字母序排列的,我们使用reorder来重排一下。reorder会首先将输入的第一个参数转化为因子类型,然后根据第二个参数对其进行排序。

在这里插入图片描述

根据上表在theme中调整主题,这里去掉背景的网格。

ggplot(tophit, aes(x = avg, y = reorder(name, avg))) + 
geom_point(size = 3) + 
# 与默认主题theme_gray相对,背景空白
theme_bw() + 
theme(panel.grid.major.x = element_blank(),
     panel.grid.minor.x = element_blank(), 
     panel.grid.major.y = element_line(colour = 'lightblue', linetype = 'dashed'))

在这里插入图片描述

颠倒一下顺序

ggplot(tophit, aes(x = avg, y = reorder(name, -avg))) + 
geom_point(size = 3) + 
# 与默认主题theme_gray相对,背景空白
theme_bw() + 
theme(panel.grid.major.x = element_blank(),
     panel.grid.minor.x = element_blank(), 
     panel.grid.major.y = element_line(colour = 'lightblue', linetype = 'dashed'))

在这里插入图片描述

也可以直接X轴Y轴对调,此时引入更多的美化操作,比如X轴的文本倾斜,以及更细致地调整点和线条。

ggplot(tophit, aes(x = reorder(name, avg), y = avg)) + 
geom_point(size = 4, fill = 'lightblue', color = 'lightblue') + 
# 与默认主题theme_gray相对,背景空白
theme_bw() + 
theme(axis.text.x = element_text(angle = 60,hjust = 1),
    panel.grid.major.y = element_blank(),
     panel.grid.minor.y = element_blank(), 
     panel.grid.major.x = element_line(colour = 'orange', linetype = 'dashed', size = 0.8)) + 
#设置线段到数据点出结束
geom_segment(aes(xend=name),yend=0,colour='lightblue', size = 1.5)

在这里插入图片描述

扫描二维码关注公众号,回复: 11562580 查看本文章

对样本分组绘图

根据lg和avg对name进行排序,并将其转换为因子水平的level

nameorder <- tophit$name[order(tophit$lg, tophit$avg)]
tophit$name <- factor(tophit$name, levels = nameorder)
ggplot(tophit, aes(x = avg, y =name)) + 
geom_segment(aes(yend=name, colour = lg),xend=0, size = 1.5) + 
# 按颜色分组
geom_point(size = 3, aes(colour = lg)) + 
scale_color_brewer(palette = "Set1", limits = c("NL", "AL")) + 
# 与默认主题theme_gray相对,背景空白
theme_bw() + 
theme(panel.grid.major.x = element_blank(),
     panel.grid.minor.x = element_blank(),     
    panel.grid.major.y = element_blank(), 
     # 将图标移到图的里面去
     legend.position=c(1, 0.55), 
     legend.justification =c(1, 0.5))

在这里插入图片描述

分面图

ggplot(tophit, aes(x = avg, y =name)) + 
geom_segment(aes(yend=name),xend=0, size = 1.5, colour = 'grey50') + 
# 按颜色分组
geom_point(size = 3, aes(colour = lg)) + 
# 取消guide分组
scale_color_brewer(palette = "Set1", limits = c("NL", "AL"), guide = FALSE) + 
# 与默认主题theme_gray相对,背景空白
theme_bw() + 
theme(panel.grid.major.x = element_blank(),
     panel.grid.minor.x = element_blank(),     
    panel.grid.major.y = element_blank())+
     # 分面图
     facet_grid(lg~., scales = "free_y", space = "free_y")

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/jining11/article/details/103663487