2ggplot2简介

2 ggplot2简介

本节简要概述了ggplot2包的工作原理。如果您只是在寻找代码来制作特定类型的图表,请跳过本节。但是,该章可以帮助您了解这些部件如何组合在一起。

2.1 一个有效的例子

ggplot2包中的函数在图层中构建图形。我们将通过一个简单的图形开始,并一次添加一个附加元素来构建一个复杂的图形。

该示例使用1985年当前人口调查的数据来探索工资(wage)和经验(expr)之间的关系。

# load data
# install.packages("mosaicData")
library(mosaicData)
library(tidyverse)
data(CPS85, package = "mosaicData")
CPS85 %>% glimpse()

在构建ggplot2图形时,只需要下面描述的前两个功能。其他功能是可选的,可以按任何顺序出现。

2.1.1 ggplot

构建图形的第一个功能是ggplot函数。它指定了

  • 包含要绘制数据的数据框

  • 变量映射到图的可视属性。映射放置在aes函数内(其中aes代表美学)。

# specify dataset and mapping
library(ggplot2)
ggplot(data = CPS85,mapping = aes(x = exper, y = wage))

图2.1:映射变量

为什么图表是空的?我们指定的EXPER变量应该被映射到X轴,而且工资应被映射到Ÿ轴,但我们还没有指定我们想要在图表上放置什么。

2.1.2 geoms

Geoms是可以放置在图形上的几何对象(点,线,条等)。它们是使用以…开头的函数添加的geom_。在这个例子中,我们将使用该geom_point函数添加点,创建一个散点图。

在ggplot2图形中,使用+符号将函数链接在一起以构建最终图。

# add points
ggplot(data = CPS85,mapping = aes(x = exper, y = wage)) +
  geom_point()

图2.2:添加点

该图表明存在异常值。一个人的工资远高于其他人。我们会在继续之前删除此案例。

# delete outlier
library(dplyr)
plotdata <- CPS85 %>% filter(wage < 40)
# redraw scatterplot
ggplot(data = plotdata,
       mapping = aes(x = exper, y = wage)) +
  geom_point()

图2.3:删除异常值

可以在geom_函数中指定许多参数(选项)。对于选项geom_point功能包括colorsizealpha。它们分别控制点颜色,大小和透明度。透明度范围从0(完全透明)到1(完全不透明)。添加一定程度的透明度有助于可视化重叠点。

# make points blue, larger, and semi-transparent
ggplot(data = plotdata,
       mapping = aes(x = exper, y = wage)) +
  geom_point(color = "cornflowerblue",
             alpha = .7,
             size = 3)

图2.4:修改点颜色,透明度和大小

接下来,让我们添加一条最合适的线。我们可以用这个geom_smooth功能做到这一点。选项控制线的类型(线性,二次,非参数),线的粗细,线的颜色以及置信区间的存在与否。这里我们请求线性回归(method = lm)线(其中lm代表线性模型)。

# add a line of best fit.
ggplot(data = plotdata,mapping = aes(x = exper, y = wage)) +
  geom_point(color = "cornflowerblue",
             alpha = .7,
             size = 3) +
  geom_smooth(method = "lm")

图2.5:添加最佳拟合线

工资似乎随着经验而增加。

2.1.3 分组

除了将变量映射到x和y轴之外,还可以将变量映射到几何对象的颜色,形状,大小,透明度和其他视觉特征。这允许将观察组叠加在单个图中。

让我们在图中添加性别并用颜色表示。

# indicate sex using color
ggplot(data = plotdata,
       mapping = aes(x = exper, y = wage, color = sex)) +
  geom_point(alpha = .7,
             size = 3) +
  geom_smooth(method = "lm", 
              se = FALSE, 
              size = 1.5)

图2.6:使用颜色包括性别

color = sex选项放在aes函数中,因为我们将变量映射到美学。添加了The geom_smooth option(se = FALSE)以抑制置信区间。

看起来男人往往比女人赚更多的钱。此外,男性的经验和工资之间可能存在比女性更强的关系。

2.1.4 Scales

Scales控制变量如何映射到绘图的视觉特征。缩放功能(以其开头scale_)允许您修改此映射。在下一个图中,我们将更改x和y轴缩放以及所使用的颜色。

# modify the x and y axes and specify the colors to be used
ggplot(data = plotdata,mapping = aes(x = exper, y = wage, color = sex)) +
  geom_point(alpha = .7,
             size = 3) +
  geom_smooth(method = "lm", 
              se = FALSE, 
              size = 1.5) +
  scale_x_continuous(breaks = seq(0, 60, 10)) +
  scale_y_continuous(breaks = seq(0, 30, 5),
                     label = scales::dollar) +
  scale_color_manual(values = c("indianred3", "cornflowerblue"))

ggplot(data = plotdata,mapping = aes(x = exper, y = wage, color = sex)) +
  geom_point(alpha = .7,
             size = 3) +
  geom_smooth(method = "lm", 
              se = FALSE, 
              size = 1.5) +
  scale_x_continuous(breaks = seq(0, 60, 10)) +
  scale_y_continuous(breaks = seq(0, 30, 5),
                     label = scales::dollar)

图2.7:更改颜色和轴标签

ÿ轴使用美元符号,而且颜色更有吸引力(IMHO)。

每个工作部门的经验,工资和性别之间的关系是否相同?让我们为每个工作部门重复一次这个图表,以便探索这个问题。

2.1.5 分面

Facet为每个级别(给定变量或变量组合)生成一个图。Facet是使用以facet_开头的函数创建的。在这里,facet将由变量的八个级别定义。

# reproduce plot for each level of job sector
ggplot(data = plotdata,
       mapping = aes(x = exper, 
                     y = wage,
                     color = sex)) +
  geom_point(alpha = .7) +
  geom_smooth(method = "lm", 
              se = FALSE) +
  scale_x_continuous(breaks = seq(0, 60, 10)) +
  scale_y_continuous(breaks = seq(0, 30, 5),
                     label = scales::dollar) +
  scale_color_manual(values = c("indianred3",  "cornflowerblue")) +
  facet_wrap(~sector)

图2.8:使用分面添加工作部门

男性和女性收入之间的差别似乎取决于正在审议的就业部门。

2.1.6 标签

图表应易于理解,信息标签是实现此目标的关键因素。该labs功能为轴和图例提供自定义标签。此外,还可以添加自定义标题,副标题和标题。

# add informative labels
ggplot(data = plotdata,
       mapping = aes(x = exper, 
                     y = wage,
                     color = sex)) +
  geom_point(alpha = .7) +
  geom_smooth(method = "lm", 
              se = FALSE) +
  scale_x_continuous(breaks = seq(0, 60, 10)) +
  scale_y_continuous(breaks = seq(0, 30, 5),
                     label = scales::dollar) +
  scale_color_manual(values = c("indianred3", 
                                "cornflowerblue")) +
  facet_wrap(~sector) +
  labs(title = "Relationship between wages and experience",
       subtitle = "Current Population Survey",
       caption = "source: http://mosaic-web.org/",
       x = " Years of Experience",
       y = "Hourly Wage",
       color = "Gender")

图2.9:添加信息标题和标签

现在,查看者不需要猜测标签expr和工资的含义,或者数据的来源。

2.1.7 主题

最后,我们可以使用主题微调图形的外观。主题功能(以其开头theme_)控制图形的背景颜色,字体,网格线,图例放置和其他非数据相关功能。让我们使用更清洁的主题。

# use a minimalist theme
ggplot(data = plotdata,
       mapping = aes(x = exper, 
                     y = wage,
                     color = sex)) +
  geom_point(alpha = .6) +
  geom_smooth(method = "lm", 
              se = FALSE) +
  scale_x_continuous(breaks = seq(0, 60, 10)) +
  scale_y_continuous(breaks = seq(0, 30, 5),
                     label = scales::dollar) +
  scale_color_manual(values = c("indianred3", 
                                "cornflowerblue")) +
  facet_wrap(~sector) +
  labs(title = "Relationship between wages and experience",
       subtitle = "Current Population Survey",
       caption = "source: http://mosaic-web.org/",
       x = " Years of Experience",
       y = "Hourly Wage",
       color = "Gender") +
  theme_minimal()

图2.10:使用更简单的主题

男性在管理、制造、销售和“其他”领域的收入似乎高于女性。他们在文书、专业和服务职位上最相似。这些数据不包括建筑业的妇女。对于管理职位,男性的工资似乎与工作经验有关,而女性则没有(这可能是最有趣的发现)。这似乎也适用于销售。

当然,这些发现只是暂时的。它们基于有限的样本量,不涉及统计测试,以评估差异是否可能由于偶然的变化。

2.2 data和mapping选项

使用ggplot2创建的图总是从ggplot函数开始。在上面的例子中,数据映射选项被放置在这个函数中。在本例中,它们应用于下面的每个geom_函数。

您也可以将这些选项直接放在geom中。在这种情况下,它们仅适用于特定的geom

请考虑以下图表。

# placing color mapping in the ggplot function
ggplot(plotdata,
       aes(x = exper, 
           y = wage,
           color = sex)) +
  geom_point(alpha = .7,
             size = 3) +
  geom_smooth(method = "lm",
              formula = y ~ poly(x,2),
              se = FALSE, 
              size = 1.5)

图2.11:ggplot函数中的颜色映射

由于性别的颜色映射出现在ggplot中,它适用于这两个geom_pointgeom_smooth。该点的颜色表示性别,并为男性和女性制作单独的彩色趋势线。比较这个:

# placing color mapping in the geom_point function
ggplot(plotdata,
       aes(x = exper, 
           y = wage)) +
  geom_point(aes(color = sex),
             alpha = .7,
             size = 3) +
  geom_smooth(method = "lm",
              formula = y ~ poly(x,2),
              se = FALSE, 
              size = 1.5)

图2.12:ggplot函数中的颜色映射

由于性别与颜色的映射仅出现在geom_point函数中,因此仅在此处使用。为所有观测创建单个趋势线。

本书中的大多数示例都将数据和映射选项放在ggplot函数中。另外,因为第一个选型总是引用数据而第二个选项 总是引用映射,所以省略了短语data =mapping=,。

2.3 图形作为对象

ggplot2图表可以保存为一个名为R对象(如数据帧),进一步处理,然后打印或保存到磁盘。

# prepare data
data(CPS85 , package = "mosaicData")
plotdata <- CPS85 %>% dplyr::filter(wage < 40)
# create scatterplot and save it
myplot <- ggplot(data = plotdata,
                  aes(x = exper, y = wage)) +
             geom_point()
# print the graph
myplot
# make the points larger and blue
# then print the graph
myplot <- myplot + geom_point(size = 3, color = "blue")
myplot
# print the graph with a title and line of best fit
# but don't save those changes
myplot + geom_smooth(method = "lm") +
  labs(title = "Mildly interesting graph")
# print the graph with a black and white theme
# but don't save those changes
myplot + theme_bw()

这可以节省时间。以编程方式保存图形时也很方便。

现在是时候尝试其他类型的图表了。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值