这种图主要是针对一一对应的关系,简洁明了,图形的可读性很强,因为条形图在空间上是二维的,不容易直观建立一一对应的变量关联。
简单粗暴堆点
library(gcookbook)
library(ggplot2)
tophit <- tophitters2001[1:25,]
head(tophit)
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")