【上一篇:24.关于Exploratory Data Analysis之四】
【下一篇:25.关于Exploratory Data Analysis之六】
本篇介绍共变的第二部分:两个分类变量的共变。
两个分类变量
为了可视化两个分类变量之间的共变,需要计算每个组合(combination)中观测值(observation)的数量。一种实现方法是用内置函数geom_count()。
ggplot(data = diamonds) +
geom_count(mapping = aes(x = cut, y = color))
两个分类变量
图中每个圈的大小代表这个combination中observation的个数。共变表现为特定的x值和特定的y值之间有很强的相关性(这句话没理解)。
另一种实现方法是先计算count再直接可视化count值。
# 计算count
diamonds %>% count(color, cut)
# 或者diamonds %>% group_by(color,cut) %>% summarise(n=n())
# A tibble: 35 x 3
color cut n
<ord> <ord> <int>
1 D Fair 163
2 D Good 662
3 D Very Good 1513
4 D Premium 1603
5 D Ideal 2834
6 E Fair 224
7 E Good 933
8 E Very Good 2400
9 E Premium 2337
10 E Ideal 3903
# ... with 25 more rows
# 计算count+geom_tile()可视化
diamonds %>%
count(color, cut) %>%
ggplot(mapping = aes(x = color, y = cut)) +
geom_tile(mapping = aes(fill = n))
# tile是瓷砖、瓦片的意思,就是一个小方块一个小方块排列的感觉,
# 然后可以用颜色填充每个小方块。
color和cut的瓦片图
图中每个combination用一个方块表示,方块的颜色代表count值的大小。(距我这些年的工作经历,当分类变量比较少的时候用第一种比较多,分类变量很多的时候用第二种热图的形式,做热图有很多函数,geom_tile()函数用得也比较少。)
如果分类变量是无序的,您可能希望使用序列化包同时重新排序行和列,以便更清楚地显示有趣的模式。对于较大的图,您可能希望尝试d3heatmap或heatmapply包,它们可以创建交互式图。
练习题
1. 如何重新调节上述count数据集以更清楚地展示cut下color的分布或者color下cut的分布?
呃,说的是这种吗?因为圈的大小看不到细节?
diamonds %>% group_by(color,cut) %>%
summarise(n=n()) %>%
ggplot(mapping=aes(x=cut,y=n,fill=color))
+geom_bar(stat="identity",position = "dodge")
图片.png
2. 使用geom_tile()和dplyr来研究平均航班延误如何随目的地和月份而变化。是什么让图难以读懂?你如何改进它?
难道是这个意思?
flights %>% filter(!is.na(dep_delay)) %>%
group_by(year,month,dest) %>%
summarise(average_delay=mean(dep_delay)) %>%
ggplot(mapping=aes(x=month,y=dest,fill=average_delay))
+geom_tile()
每个月的不同目的的飞机的平均延误时间
图片问题1:横坐标没有显示所有月份,而且有小数点,不符合月份是个整数的实际情况。
图片问题2:纵坐标分类变量太多(统计了下是105个),都重叠到一起了。
图片问题3:图的最左边和最右边有空白的部分。
问题1和问题3的原因在于绘图数据集中month这一列数据类型其实是int,这样的话绘图的时候就不会认为这是离散型的变量,所以需要先把month变量变成一个离散型的变量,你可以用as.character先将其变成字符型,但你会发现绘图后横坐标的排序不是你想要的,所以直接用as.factor变成因子了。问题2暂时的解决办法是将字体变小,要是y上的分类变量再多,就只能不展示y上的label了。
flights %>% filter(!is.na(dep_delay)) %>%
group_by(year,month,dest) %>%
summarise(average_delay=mean(dep_delay)) %>%
ggplot(mapping=aes(x=as.factor(month),y=dest,fill=average_delay))
+geom_tile()+theme(axis.text.y=element_text(size=4))
要是想去掉y轴上label,则用theme(axis.text.y=element_blank())
修改后的geom_tile图
3. 为什么在上面的例子中使用aes(x = color, y = cut)比aes(x = cut, y = color)稍微好一点?
下面这两张图彼此好在哪里了?还是我理解题干错了。
点图 瓦片图
【上一篇:24.关于Exploratory Data Analysis之四】
【下一篇:25.关于Exploratory Data Analysis之六】
网友评论