使用ggplot2进行数据可视化①
使用ggplot2进行数据可视化②
添加其他变量的一种方法是aesthetics。 另一种对分类变量特别有用的方法是将绘图分割为多个子图,每个子图显示一个数据子集。要通过单个变量来划分您的绘图,请使用facet_wrap()。 facet_wrap()的第一个参数应该是一个公式,你用〜后跟一个变量名创建(这里“formula”是R中数据结构的名称,而不是“equation”的同义词)。 传递给facet_wrap()的变量应该是离散的。
library(ggplot2)
ggplot(data = mpg) +
geom_point(mapping = aes(x = displ, y = hwy)) +
facet_wrap(~ class, nrow = 2)
要在两个变量的组合上构建绘图,请将facet_grid()添加到绘图调用中facet_grid()的第一个参数也是一个公式。 这次公式应该包含两个用〜分隔的变量名。
如果您不想在行或列维度中进行构面,请使用。 而不是变量名,例如facet_grid(.〜cyl)。
Genometric Objects
两个图包含相同的x变量,相同的y变量,并且都描述相同的数据。 但情节并不完全相同。 每个图使用不同的可视对象来表示数据。 在ggplot2语法中,我们说它们使用不同的geom。
geom是绘图用于表示数据的几何对象。 人们经常根据情节使用的几何类型来描绘情节。 例如,条形图使用条形图,折线图使用线条图,箱形图使用箱形图格栅等。 散点图打破了这一趋势; 他们使用点geom。 如上所述,您可以使用不同的geom来绘制相同的数据。 左边的图使用点geom,右边的图使用光滑的geom,一条适合数据的平滑线。
要更改绘图中的geom,请更改添加到ggplot()的geom函数。 例如,要制作下面的图,您可以使用以下代码:
# left
ggplot(data = mpg) +
geom_point(mapping = aes(x = displ, y = hwy))
# right
ggplot(data = mpg) +
geom_smooth(mapping = aes(x = displ, y = hwy))
ggplot2中的每个geom函数都有一个mapping参数。 然而,并非每一种aesthetic都适用于每个几何。 您可以设置点的形状,但无法设置线的“形状”。 另一方面,您可以设置线的线型。 geom_smooth()将为您映射到linetype的变量的每个唯一值绘制一个不同的线型,具有不同的线型。
ggplot(data = mpg) +
geom_smooth(mapping = aes(x = displ, y = hwy, linetype = drv))
在这里,geom_smooth()根据他们的drv值将汽车分成三行,描述汽车的动力传动系统。 一行描述具有4值的点,一行描述具有f值的点,并且一行描述具有r值的点。 这里,4代表四轮驱动,f代表前轮驱动,r代表后轮驱动。
如果这听起来很奇怪,我们可以通过在原始数据上叠加线条然后根据drv着色所有内容来使其更清晰。
请注意,此图包含同一图表中的两个geom!我们将很快学会如何在同一个地块中放置多个geoms。ggplot2提供超过30个geoms,扩展包提供更多(请参阅https://www.ggplot2-exts.org)。获得全面概述的最佳方法是ggplot2备忘单,您可以在http://rstudio.com/cheatsheets找到它。要了解有关任何单个geom的更多信息,请使用help:?geom_smooth。许多geom,如geom_smooth(),使用单个几何对象来显示多行数据。对于这些geoms,您可以将组审美设置为分类变量以绘制多个对象。 ggplot2将为分组变量的每个唯一值绘制一个单独的对象。实际上,每当您将美学映射到离散变量时,ggplot2都会自动将这些geoms的数据分组(如线型示例中所示)。依靠这个特征很方便,因为群体aesthetic本身并没有增加传说或区别特征与geoms。
ggplot(data = mpg) +
geom_smooth(mapping = aes(x = displ, y = hwy))
ggplot(data = mpg) +
geom_smooth(mapping = aes(x = displ, y = hwy, group = drv))
ggplot(data = mpg) +
geom_smooth(
mapping = aes(x = displ, y = hwy, color = drv),
show.legend = FALSE
)
要在同一个图中显示多个geom,请向ggplot()添加多个geom函数:
ggplot(data = mpg) +
geom_point(mapping = aes(x = displ, y = hwy)) +
geom_smooth(mapping = aes(x = displ, y = hwy))
image.png
然而,这在我们的代码中引入了一些重复。 想象一下,如果你想改变y轴来显示cty而不是hwy。 您需要在两个位置更改变量,并且可能忘记更新一个变量。 您可以通过将一组映射传递给ggplot()来避免这种类型的重复。 ggplot2会将这些映射视为适用于图中每个geom的全局映射。 换句话说,此代码将生成与上一代码相同的图:
ggplot(data = mpg, mapping = aes(x = displ, y = hwy)) +
geom_point() +
geom_smooth()
image.png
如果将映射放在geom函数中,ggplot2会将它们视为图层的本地映射。 它将使用这些映射来仅扩展或覆盖该层的全局映射。 这使得可以在不同层中显示不同的aesthetics。
ggplot(data = mpg, mapping = aes(x = displ, y = hwy)) +
geom_point(mapping = aes(color = class)) +
geom_smooth()
您可以使用相同的想法为每个图层指定不同的数据。 在这里,我们的平滑线仅显示mpg数据集的子集,即小型汽车。 geom_smooth()中的本地数据参数仅覆盖该层的ggplot()中的全局数据参数。
ggplot(data = mpg, mapping = aes(x = displ, y = hwy)) +
geom_point(mapping = aes(color = class)) +
geom_smooth(data = filter(mpg, class == "subcompact"), se = FALSE)