使用ggplot2进行数据可视化--案例

使用ggplot2进行数据可视化

1 mpg数据框

mpg 包含了由美国环境保护协会收集的 38 种车型的观测数据。

mpg 中包括如下变量。

displ:引擎大小,单位为升。

hwy:汽车在高速公路上行驶时的燃油效率,单位为英里 / 加仑(mpg)。与燃油效率高

的汽车相比,燃油效率低的汽车在行驶相同距离时要消耗更多燃油。

1.1 创建ggplot图形

为了绘制 mpg 的图形,运行以下代码将 displ 放在 x 轴,hwy 放在 y 轴:

ggplot(data = mpg) +

 geom_point(mapping = aes(x = displ, y = hwy))

#函数 geom_point() 向图中添加一个点层,这样就可以创建一张散点图。ggplot2 中的每个几何对象函数都有一个 mapping 参数。这个参数定义了如何将数据集中的变量映射为图形属性。mapping 参数总是与 aes() 函数成对出现,aes() 函数的 x 参数和 y参数分别指定了映射到 x 轴的变量与映射到 y 轴的变量。

 

结果分析:上图显示出引擎大小(displ)和燃油效率(hwy)之间是负相关关系。换句话说,大引擎汽车更耗油。

1.2 图形属性映射

可以向二维散点图中添加第三个变量,比如 class,方式是将它映射为图形属性。图形

属性是图中对象的可视化属性,其中包括数据点的大小、形状和颜色。通过改变图形属

性的值,可以用不同的方式来显示数据点

ggplot(data = mpg) +

 geom_point(mapping = aes(x = displ, y = hwy, color = class))

#mpg 数据集中的 class 变量对汽车进行了分类,比如小型、中型和 SUV

 

结果分析:右侧橙红色那些离群点多数是双座汽车,因为这些车不会是混合动力的,因为它们具有大引擎。

 

当然,class可以用同样的方式将其映射为点的大小size,也可以将 class 映射为控制数据点透明度的 alpha 图形属性,还可以将其映射为点的形状shape[ggplot2 只能同时使用 6 种形状。默认情况下,当使用这种图形属性时,多出的变量值将不会出现在图中]

ggplot(data = mpg) +

   geom_point(mapping = aes(x = displ, y = hwy, size = class))

ggplot(data = mpg) +

   geom_point(mapping = aes(x = displ, y = hwy, alpha = class))

ggplot(data = mpg) +

   geom_point(mapping = aes(x = displ, y = hwy, shape = class))

还可以手动为几何对象设置图形属性。例如,我们可以让图中的所有点都为蓝色:

ggplot(data = mpg) +

   geom_point(mapping = aes(x = displ, y = hwy), color = "blue")

 

用数值进行标识的 R 25 种内置形状

 

1.3 分面

要想通过单个变量对图进行分面,可以使用函数 facet_wrap()。其第一个参数是一个公

式,创建公式的方式是在 ~ 符号后面加一个变量名

ggplot(data = mpg) +

   geom_point(mapping = aes(x = displ, y = hwy)) +

 facet_wrap(~ class, nrow = 2)

 

要想通过两个变量对图进行分面,需要在绘图命令中加入函数 facet_grid()。这个函数的

第一个参数也是一个公式,但该公式包含由 ~ 隔开的两个变量名。

ggplot(data = mpg) +

   geom_point(mapping = aes(x = displ, y = hwy)) +

   facet_grid(drv ~ cyl)

 

如果不想在行或列的维度进行分面,你可以使用 . 来代替变量名,例如 + facet_grid(. ~ cyl)

1.4 几何对象

几何对象是图中用来表示数据的几何图形对象。条形图使用了条形几何对象,折线图使用了直线几何对象,箱线图使用了矩形和直线几何对象。散点图打破了这种趋势,它们使用点几何对象。

ggplot(data = mpg) +

  geom_point(mapping = aes(x = displ, y = hwy)) #使用了点几何对象

 

ggplot(data = mpg) +

 geom_smooth(mapping = aes(x = displ, y = hwy))  #使用了平滑曲线几何对象

 

geom_smooth() 函数可以按照不同的线型绘制出不同的曲线,每条曲线对应映射到线型的

变量的一个唯一值:

ggplot(data = mpg) +

   geom_smooth(mapping = aes(x = displ, y = hwy, linetype = drv))

 

结果分析:根据表示汽车驱动系统的 drv 变量的值,这里的 geom_smooth() 函数分别用 3 条曲线来表示汽车。一条线表示 drv 值为 4 的所有汽车,一条线表示 drv 值为 f 的所有汽车,另一条线表示 drv 值为 r 的所有汽车。其中 4 表示四轮驱动,f 表示前轮驱动,r 表示后轮驱动。

 

ggplot2 就会自动对数据进行分组来绘制多个几何对象:

ggplot(data = mpg) +

  geom_smooth(

  mapping = aes(x = displ, y = hwy, color = drv,group = drv),

  show.legend = TRUE

 )

 

在同一张图中显示多个几何对象,可以向 ggplot() 函数中添加多个几何对象函数:

ggplot(data = mpg) +

  geom_point(mapping = aes(x = displ, y = hwy)) +

  geom_smooth(mapping = aes(x = displ, y = hwy))

 

可以在不同的图层中显示不同的图形属性:

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

 )

 

1.5 统计变换

geom_bar() 函数就可以绘制的基本条形图。diamonds 数据集是 ggplot2的内置数据集,包含大约 54 000 颗钻石的信息,每颗钻石具有 pricecaratcolorclarity cut 变量。下面的条形图显示了 diamonds 数据集中按照 cut 变量分组的各种钻石的总数量。

ggplot(data = diamonds) +

  geom_bar(mapping = aes(x = cut))

 

结果分析:高质量切割钻石的数量要比低质量切割钻石的数量多

 

绘图时用来计算新数据的算法称为 statstatistical transformation,统计变换)。通常来说,几何对象函数和统计变换函数可以互换使用。例如,你可以使用 stat_count()替换 geom_bar() 来重新生成前面那张图:

ggplot(data = diamonds) +

 stat_count(mapping = aes(x = cut))

 

我们将 geom_bar() 函数的统计变换从计数(默认值)修改为标识。这样我们就可以将条形的高度映射为 y 轴变量的初始值。

demo <- tribble(

 ~a, ~b,

 "bar_1", 20,

 "bar_2", 30,

 "bar_3", 40

)

ggplot(data = demo) +

 geom_bar(

 mapping = aes(x = a, y = b), stat = "identity"

 )

 

想显示一张表示比例(而不是计数)的条形图:

ggplot(data = diamonds) +

  geom_bar(

  mapping = aes(x = cut, y = ..prop.., group = 1)

 )

 

想要在代码中强调统计变换,可以使用 stat_summary() 函数将人们的注意力吸引到你计算出的那些摘要统计量上。stat_summary() 函数为 x 的每个唯一值计算 y 值的摘要统计:

ggplot(data = diamonds) +

 stat_summary(

 mapping = aes(x = cut, y = depth),

fun.ymin = min,

 fun.ymax = max,

 fun.y = median

 )

 

1.6 位置调整

可以使用 color 或者 fill(这个更有用)图形属性来为条形图上色:

ggplot(data = diamonds) +

  geom_bar(mapping = aes(x = cut, color = cut))

 

ggplot(data = diamonds) +

  geom_bar(mapping = aes(x = cut, fill = cut))

 

如果将 fill 图形属性映射到另一个变量(如 clarity),那么条形会自动分块堆叠

起来。每个彩色矩形表示 cut clarity 的一种组合。

ggplot(data = diamonds) +

  geom_bar(mapping = aes(x = cut, fill = clarity))

 

这种堆叠是由 position 参数设定的位置调整功能自动完成的。如果不想生成堆叠式条形图,你还可以使用以下 3 种选项之一:"identity""fill" "dodge"

• position = "identity" 将每个对象直接显示在图中。这种方式不太适合条形图,因为条形会彼此重叠。为了让重叠部分能够显示出来,我们可以设置 alpha 参数为一个较小的数,从而使得条形略微透明;或者设定 fill = NA,让条形完全透明:

ggplot(

 data = diamonds,

 mapping = aes(x = cut, fill = clarity)

) +

 geom_bar(alpha = 1/5, position = "identity")

ggplot(

 data = diamonds,

 mapping = aes(x = cut, color = clarity)

) +

 geom_bar(fill = NA, position = "identity")

• position = "fill" 的效果与堆叠相似,但每组堆叠条形具有同样的高度,因此这种条

形图可以非常轻松地比较各组间的比例:

ggplot(data = diamonds) +

 geom_bar(

 mapping = aes(x = cut, fill = clarity),

 position = "fill"

 )

 

• position = "dodge" 将每组中的条形依次并列放置,这样可以非常轻松地比较每个条形

表示的具体数值:

ggplot(data = diamonds) +

 geom_bar(

 mapping = aes(x = cut, fill = clarity),

 position = "dodge"

 )

 

通过将位置调整方式设为抖动,可以避免这种网格化排列。position = "jitter" 为每个数据点添加一个很小的随机扰动,这样就可以将重叠的点分散开来,因为不可能有两个点会收到同样的随机扰动。可用geom_point(position = "jitter") 的一种快速实现方式:geom_jitter()

ggplot(data = mpg) +

 geom_point(

 mapping = aes(x = displ, y = hwy),

 position = "jitter"

 )

 

1.7 坐标轴

默认的坐标系是笛卡儿直角坐标系,可以通过其独立作用的 x 坐标和 y 坐标找到每个数据点。

• coord_flip() 函数可以交换 x 轴和 y 轴。当想要绘制水平箱线图时,这非常有用。它也非常适合使用长标签,但要想在 x 轴上不重叠地安排好它们是非常困难的:

ggplot(data = mpg, mapping = aes(x = class, y = hwy)) +

 geom_boxplot()

 

ggplot(data = mpg, mapping = aes(x = class, y = hwy)) +

 geom_boxplot() +

 coord_flip()

 

• coord_quickmap() 函数可以为地图设置合适的纵横比。当使用 ggplot2 绘制空间数据时,这个函数特别重要

nz <- map_data("nz")

ggplot(nz, aes(long, lat, group = group)) +

 geom_polygon(fill = "white", color = "black") +

 coord_quickmap()

 

• coord_polar() 函数使用极坐标系。极坐标系可以揭示出条形图和鸡冠花图间的一种有趣联系:

bar <- ggplot(data = diamonds) +

 geom_bar(

 mapping = aes(x = cut, fill = cut),

 show.legend = FALSE,

 width = 1

 ) +

 theme(aspect.ratio = 1) +

 labs(x = NULL, y = NULL)

bar + coord_flip()

 

bar + coord_polar()

 

posted @ 2021-11-19 11:29  zhang-X  阅读(796)  评论(0编辑  收藏  举报