ggplot2-工具箱4

本文详细介绍了在ggplot2中如何控制群组几何对象,包括个体和总体几何对象的区别,以及如何通过图形属性`group`来管理数据分组。通过实例展示了如何绘制细面图、箱线图、折线图等,强调了在不同图层上应用不同分组的重要性,以及如何修改默认分组以实现预期的图形效果。内容涵盖了统计图形的创建、图形属性的映射以及群组几何对象在连续和离散变量下的行为。

群组几何对象

几何对象可以大体分为个体和总体两类。
个体几何对象对数据框的每一条(行)数据绘制一个可以区别于其它个体的图形对象,如散点图中每个点均代表一个观测。
群组几何对象则用来表示多个观测。它们可以是统计摘要的一个结果,如箱线图,或是几何对象的基础展示,如多边图
折线图和路径图则同时具备上述两种特点:其线路由一系列线段组成,而每条线段又都对应着两个点

该如何控制哪些观测值用哪种图形元素呢?这是图形属性group的任务

data(Oxboys, package = "nlme")
head(Oxboys)
1. 多个分组与单一图形属性

很多时候,想把数据分为若干组,并用相同的方式对每个组进行渲染
这在含有多个个体的纵向数据中是很常见的,而这类图形也被形象的称为细面图
下图展示了每个男孩(每个对象的成长轨迹)

ggplot(Oxboys, aes(age, height, group = Subject)) +
	geom_point() + geom_line()

ggplot(Oxboys, aes(age, height)) +
	geom_point() + geom_line()	

如果分组由多个变量定义而非单一变量,使用interaction合并各个分组变量,例如aes(group = interaction(school_id, student_id))

2. 不同图层上的不同分组

有时我们将不同水平下的数据整合,然后使用统计汇总信息绘制图形,从而不同的图层可能有不同的分组图形属性
因此有的图层展示个体水平的数据,而有的图层则展示更大组群的统计信息。在上下文的基础上,假设需要添加一条平滑曲线展示所有男孩的身高变化趋势。如果还应用和前面绘制折线图时同样的分组方式,会得到如下的结果

ggplot(Oxboys, aes(age, height, group = Subject)) +
	geom_line() + geom_smooth(method = "lm", se = FALSE)

这不是我们想要的结果:我们无意中给每个男孩拟合了一条平滑曲线
分组不仅会改变集合对象的展示,还影响着统计变换的操作:每组数据都进行了一次统计变换

因此,不能再ggplot()中设置分组,因为它会将统计变换应用于所有图层:在geom_line()中设置分组则可解决这一问题。因为图像中没有离散型变量,所以默认分组变量是连续型的,而我们也将得到如下土所示的平滑曲线

ggplot(Oxboys, aes(age, height)) +
	geom_line(aes(group = Subject)) +
	geom_smooth(method = "lm", size = 2, se = FALSE)
3. 修改默认分组

如果图像中含有x轴上的离散型变量,而你想绘制连接所有分组的线条,那么可以采取绘制交互作用图、轮廓图以及平行坐标图时所用的策略。
这里以绘制各个测量时期身高的箱线图为例

ggplot(Oxboys, aes(Occasion, height)) +
	geom_boxplot()

图中只有一个离散型变量occasion,所以我们对每一个不同的x取值均作出一幅箱线图
现在我们需要绘制每个男孩的身高变化曲线,简单添加geom_line()没有什么效果,因为绘制的曲线会局限于每个测量节点内,而不是连接各个对象

ggplot(Oxboys, aes(Occasion, height)) +
	geom_boxplot() +
	geom_line(color = "#3366ff", alpha = 0.5)

为了在此基础上添加个体轨迹,需要修改默认分组,告诉机器需要为每个男孩绘制一条曲线

ggplot(Oxboys, aes(Occasion, height)) +
	geom_boxplot() +
	geom_line(aes(group = Subject), color = "#3366ff", alpha = 0.5)
4. 匹配图形属性与图形对象

群组几何对象的另一重要问题是,如何将个体的图形属性映射给整体的图形属性。如果不同的图形属性映射到单个几何元素上会发生什么?
折线图和路径图遵循差一原则:若观测点比线段数目多一,第一条线段将使用第一个观测值的图形属性,第二条线段将使用第二个观测值的图形属性,依次类推。这意味着,最后一个观测值的图形属性不会被用到

df <- data.frame(x = 1:3, y = 1:3, color = c(1, 3, 5))

ggplot(df, aes(x, y, color = factor(color))) +
	geom_line(aes(group = 1), size = 2) +
	geom_point(size = 5)

ggplot(df, aes(x, y, color = color)) +
	geom_line(aes(group = 1), size = 2) +
	geom_point(size = 5)

可以设计一个更复杂的系统,其中的线段平稳地从一种图形属性变换到另一种图形属性。这种方式对连续型变量很有效,如大小和颜色,但并不适用于渐变地线条类型,而且尚未应用到ggplot2。如果要实现这种效果,可以通过线性插值法实现

xgrid <- with(df, seq(min(x), max(x), length = 50))
interp <- data.frame(x = xgrid,
	y = approx(df$x, df$y, xout = xgrid)$y,
	color = approx(df$x, df$color, xout = xgrid)$y)
ggplot(interp, aes(x, y, color = color)) +
	geom_line(size = 2) + geom_point(data = df, size = 5)

折线图和路径图的另一局限在于每个个体的线段类型必须是一致的,因为R不支持绘制不同线段类型相连接的曲线
对其它群组几何对象如对多边图而言,只有当所有个体的图形属性都相同时,该图形属性才会被使用,否则将使用默认值。这适用于fill参数,因为它是整体对象的一个性质:考虑对多边形边界上的点填充不同颜色没有任何意义
图形属性映射到连续型变量时,这类问题经常会被涉及。因为正如上文所述,当映射对象是离散型变量时,它将默认地将群组几何对象分解成更小的块。这对条形图和面积图的绘制非常有效,因为将每小块堆积起来就可得到和原来未分组前一样形状的图形

ggplot(mpg, aes(class)) +
	geom_bar()
ggplot(mpg, aes(class, fill = drv)) +
	geom_bar()

如果想用同样的方法把填充属性映射到连续型变量上,这将没有效果。默认分组只是基于class,因此每一条块把填充属性映射到连续型变量上,这将没有效果
默认分组只是基于class,因此每一条块会获得多重颜色。因为每一条块只能够显示一种颜色,它会使用默认的灰色。为了展示多重颜色,需要对每一class设定多重条块,我们可以设定分组来实现此效果

ggplot(mpg, aes(class, fill = hwy)) +
	geom_bar()
ggplot(mpg, aes(class, fill = hwy, group = hwy)) +
	geom_bar()

条形会根据分组变量的顺序依次叠加,如果需要对此作出调整,需要重新定义相关变量

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值