28.4.4练习题
105. Graphics for communication(2)
- 为什么下列“代替颜色scale的代码”没有覆盖了默认的scale?
# 原始代码
df <- dplyr::tibble(
x = rnorm(10000),
y = rnorm(10000)
)
p1<-ggplot(df, aes(x, y)) +
geom_hex() +
coord_fixed() + labs(title="default")
# 代替颜色scale的代码
p2<-ggplot(df, aes(x, y)) +
geom_hex() +
scale_colour_gradient(low = "white", high = "red") +
coord_fixed() + labs(title='scale_colour_gradient(low = "white", high = "red")')
- 每一个scale的第一个参数是什么?与
labs()
相比如何? - 改变与总统任期的显示,通过:
1)联合上文所述的两种变体;
2)改善y-axis的展示;
3)给每个任期标上总统的名字;
4)添加信息丰富的图片labels;
5)没四年设置一个break - 用
override.aes
使下图中的legend更容易被看见:
ggplot(diamonds, aes(carat, price)) +
geom_point(aes(colour = cut), alpha = 1/20)
解答:
1.geom_hex()
绘制2d bin counts的六边形热图; coord_fixed()
函数用于生成指定纵横比(aspect ratio)的笛卡尔坐标。
# 将scale_color_gradient()变成scale_fill_gradient()就可以解决这个问题
p3<-ggplot(df, aes(x, y)) +
geom_hex() +
scale_fill_gradient(low = "white", high = "red") +
coord_fixed() + labs(title='scale_fill_gradient(low = "white", high = "red")')
ggpubr::ggarrange(p1,p2,p3,nrow=1)
color和fill的对比
- 有很多scale函数,似乎每个scale函数的第一个参数不一样,但总体分为两类:一类是第一个参数是 "...",另一类是第一个参数是"name",包括scale_x/y/size_*。
与labs()
相比,scale类函数的功能更全面,例如scale_x/y_contimuous()
不仅可以设置x/y-axis上的标题,也可以设置坐标轴上的刻度、刻度标签等信息。labs()
仅可以设置axis标题
、legend标题
以及plot labels,即title、subtitle、caption、tag等
,labs()
是设置axes和legend(并称guide)标题的快捷方式
。
据我不严谨地查了一下,ggplot2中可以设置scale的美学属性以及scale的名字如下:
scale_name\aesthetic_name | description | alpha | color/colour | fill | linetype | shape | size | x | y |
---|---|---|---|---|---|---|---|---|---|
binned | √ | √ | √ | √ | √ | √ | √ | √ | |
continuous | 连续变量 | √ | √ | √ | √ | √ | √ | √ | √ |
date | dates(class Date ) |
√ | √ | √ | √ | √ | √ | ||
datetime | datetimes(class POSXIct ) |
√ | √ | √ | √ | √ | √ | ||
discrete | 离散变量 | √ | √ | √ | √ | √ | √ | √ | √ |
identity | - | √ | √ | √ | √ | √ | √ | ||
manual | 手动设置 | √ | √ | √ | √ | √ | √ | ||
ordinal | - | √ | √ | √ | √ | √ | |||
brewer | 使用ColorBrewer颜色画板的颜色 | √ | √ | ||||||
distiller | - | √ | √ | ||||||
fermenter | - | √ | √ | ||||||
gradient/gradient2/gradientn | 使用梯度颜色:单/双/多颜色 | √ | √ | ||||||
grey | - | √ | √ | ||||||
hue | - | √ | √ | ||||||
steps/steps2/stepsn | - | √ | √ | ||||||
viridis_b/c/d | 翠绿色 | √ | √ | ||||||
area | - | √ | |||||||
binned_area | - | √ | |||||||
log10 | - | √ | √ | ||||||
reverse | - | √ | √ | ||||||
sqrt | - | √ | √ | ||||||
time | times(class hms ) |
√ | √ |
另外还有scale_linetype()
、scale_radius()
、scale_shape()
、scale_size()
、scale_type()
、scale_alpha()
一个函数。
-
ggplot2::presidential
数据集是从艾森豪威尔(第34届)到奥巴马(第44届)共11届总统的任期信息。
# 11行4列,每列分别是总统名字、任期开始日期、任期结束日期、政党名
> presidential
# A tibble: 11 x 4
name start end party
<chr> <date> <date> <chr>
1 Eisenhower 1953-01-20 1961-01-20 Republican
2 Kennedy 1961-01-20 1963-11-22 Democratic
3 Johnson 1963-11-22 1969-01-20 Democratic
4 Nixon 1969-01-20 1974-08-09 Republican
5 Ford 1974-08-09 1977-01-20 Republican
6 Carter 1977-01-20 1981-01-20 Democratic
7 Reagan 1981-01-20 1989-01-20 Republican
8 Bush 1989-01-20 1993-01-20 Republican
9 Clinton 1993-01-20 2001-01-20 Democratic
10 Bush 2001-01-20 2009-01-20 Republican
11 Obama 2009-01-20 2017-01-20 Democratic
# 添加id 和 label列
newdf <- presidential %>%
mutate(id = 33 + row_number()) %>% mutate(label=paste0(id,"th"))
# 将数字提到的“x轴标签格式化”和“根据政党标注颜色”结合到一起
p<-ggplot(data=newdf,aes(start, id, colour = party)) +
geom_point() +
geom_segment(aes(xend = end, yend = id)) +
scale_colour_manual(values = c(Republican = "red", Democratic = "blue")) +
# 并优化y-axis
scale_y_continuous(name=list(y="the Order of Presidency"),breaks=newdf$id, labels=newdf$label) +
# 标注每任总统的名字
geom_text(aes(x=start,y=id,label=name,hjust="left",vjust="bottom"),nudge_y=0.15, show.legend=FALSE)
# 优化图片的labels
p1<- p +scale_x_date(name=list(x="Date from the 18th Century"), breaks = newdf$start, date_labels = "'%y")
# 将x-axis改为4年一个间隔
new_break = seq(min(newdf$start),max(newdf$end),by=365*4+1)
p2<-p + scale_x_date(breaks=new_break) + theme(axis.text.x = element_text(angle=45,hjust=1,vjust=1))
ggpubr::ggarrange(p1,p2,nrow=1)
总统任期可视化的优化
- 结果如下:
p <- ggplot(diamonds, aes(carat, price)) +
geom_point(aes(colour = cut), alpha = 1/20)
p1 <- p + ggtitle(label="Poorly Visual Legend")
p2 <- p+guides(color=guide_legend(override.aes = list(alpha=1))) + ggtitle(label="Well Visual Legend")
ggpubr::ggarrange(p1,p2,nrow=1)
优化图例的视觉效果
网友评论