使用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 颗钻石的信息,每颗钻石具有 price、carat、color、clarity 和 cut 变量。下面的条形图显示了 diamonds 数据集中按照 cut 变量分组的各种钻石的总数量。
ggplot(data = diamonds) + geom_bar(mapping = aes(x = cut))
结果分析:高质量切割钻石的数量要比低质量切割钻石的数量多。
绘图时用来计算新数据的算法称为 stat(statistical 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()
本文来自博客园,作者:zhang-X,转载请注明原文链接:https://www.cnblogs.com/YY-zhang/p/15576385.html