小白读《R语言实战》写的读书笔记(第四章)

#######第四章:图形初阶#######
####1、使用ggplot2包创建图形####
#这一章数据用mosaicData包中CPS85数据框,
#这个数据框中包含1985年随机抽样的534个雇员样本
install.packages(c("mosaicData", "ggplot2"))

###1.1 函数ggplot()###
#最初,ggolot2图形只显示在白色参考线的灰色背景下
#ggplot()函数需要两组参数
#一个是数据框data,其中包含需要绘制的数据
#另一个是一组映射mapping,将数据进行图形可视化的操作,函数为aes(),表示为美化或可以看到的东西
#以下是第一段代码
library(ggplot2)
library(mosaicData)
ggplot(data = CPS85, mapping = aes(x = exper, y = wage))
#绘制的图中并没有什么,原因是我们指定了X轴和Y轴,但没有指定图中需要显示些什么

###1.2geom_函数###
#geom_图像是在背景上放置几何对象,包括点、线、条和阴影区域
#目前可用的geom_函数有37个,且数量还在增加,以下罗列出常用的geom_函数
geom_bar() #条形图  ##选项有:color, fill, alpha
geom_boxplot() #箱线图  ##选项有:color, fill, alpha, notch, width
geom_density() #核密度图  ##选项有:color, fill, alpha, linetype
geom_histogram() #直方图  ##选项有:color, fill, alpha, linetype, binwidth
geom_hline() #水平线图  ##选项有:color, alpha,linetype,size
geom_jitter() #抖动图  ##选项有:color, size, alpha, shape
geom_line() #线图  ##选项有:colorvalpha, linetype, size
geom_point() #散点图  ##选项有:color, alpha, shape, size
geom_rug() #地毯图 ##选项有:color, alpha
geom_smooth() #拟合曲线  ##选项有:method, formula, color, fill, linetype, size
geom_text() #文本注释  ##选项有:选项很多,详见帮助信息
geom_violin() #小提琴图  ##选项有:color, fill, alpha, linetype
geom_vline() #垂线 ##选项有:color, alpha,linetype,size
###geom_函数相当于让R知道在ggplot画布中需要画什么样子的图(John注)
#现在用geom_point()来创建散点图
#用+号和函数连接在一起创建图形
#代码如下
library(ggplot2)
library(mosaicData)
ggplot(data = CPS85, mapping = aes(x = exper, y = wage)) + geom_point()
#从图中可以看到,随着工作年限增加,工资也在增加,但是不明显
#同时可以看到一个异常值,所以需要对异常值进行处理
CPS85 <- CPS85[CPS85$wage < 40,]
ggplot(data = CPS85, mapping = aes(x = exper, y = wage)) + geom_point()
#geom_函数中可以指定很多选项,详见数第65页
??geom_point
#geom_point()函数可以指定4个选项,分别是:
#color, alpha, shape和size,分别为颜色、透明度、形状和大小
#颜色用通用名或十六进制代码指定
#形状与线条用相对应的名称或数字指定
#大小由0开始的正数指定,数字越大,图像越大
#透明度由0-1,指定,0为完全透明,1为完全不透明
#现在将上图调整图形稍微大一些,透明度调成半透明,颜色改为蓝色
#用theme将灰色背景改为白色(后续会再次讲解)
#代码如下:
ggplot(data = CPS85, mapping = aes(x = exper, y = wage)) + 
  geom_point(color = "cornflowerblue", alpha = .7, size = 1.5) +
  theme_bw()
#再向图中添加一条相关线段用来组织相关关系
#用geom_smooth()来添加这条线
#geom_smooth()的选项有类型(显性、二次、非参数)、粗细、颜色以及是否存在置信区间(第11章会再次学习)
#这里使用线性回归(method = lm), lm代表线性模型
#代码如下
ggplot(data = CPS85, mapping = aes(x = exper, y = wage)) + 
  geom_point(color = "cornflowerblue", alpha = .7, size = 1.5) +
  geom_smooth(method = "lm") +
  theme_bw()
?geom_smooth()


###1.3分组###
#上一节中最终将颜色和透明度用一个常量进行设置
#R还可以将变量值映射到颜色、形状、大小、透明度、线条样式、几何对象等让他们展示出不同的视觉特征
#这样会使多组观测值在单个图形中叠加,这个过程被成为分组
#将上图添加sex变量,并用color,shape和linetype表示该变量
#代码如下
ggplot(data = CPS85, mapping = aes(x = exper, y = wage,
                                   color = sex, shape = sex, linetype = sex)) + 
  geom_point(alpha = .7, size = 1.5) +
  geom_smooth(method = "lm", se = FALSE, size = 1.5) +
  theme_bw()
##这里John现注明一下
##sex只有F和M,按照前面章节,R会自动将其编码为二分类变量
##其实本质上还是在对用color,shape和linetype进行赋值,只不过赋值等于sex,用sex的变量值进行分组
##这种图用SPSS,以我目前的水平是万万做不出来的
##linetype是图例
#color = sex, shape = sex, linetype = sex需要放置在aes()中,因为我们需要将变量映射到几何对象中
#上段代码对geom_smooth()中的选项se = FALSE进行定义,代表限制置信区间,可以让图更简洁


###1.4标尺###
#标尺是制定每个映射是如何进行的
#举例来说,ggplot2会自动创建带刻度、刻度标签的图形和坐标轴
#但有时我们需要再更大程度上控制他们的外观
#例如颜色目前是自动选的,但根据自己或出版社的要求,必须选择不同的颜色
#标尺函数scale_允许我们修改默认的标尺设置
scale_x_continuous()
scale_y_continuous() 
#缩放定量变量的x和y轴。
#选项包括用于指定刻度标记的breaks,用于指定刻度标记标签的labels,以及用于控制显示的值范围的limits
scale_x_discrete()
scale_y_discrete()
#与上述表示分类变量的坐标轴相同
scale_color_manual()
#指定代表分类变量层级的颜色。values选项指定颜色
#以下为书中代码,我会分步解释代码(John注)
ggplot(data = CPS85,
       mapping = aes(x = exper, y = wage,
                     color = sex, shape = sex, linetype = sex)) +
  geom_point(alpha = .7, size = 1.5) +
  geom_smooth(method = "lm", se = FALSE, size = 1.5) +
  scale_x_continuous(breaks = seq(0, 60, 10)) + #更改代表工作年限的x轴的范围从0到60,每个格子为10
  scale_y_continuous(breaks = seq(0, 30, 5)) + #更改代表薪资的y轴的范围从0到30,每个格子为5
  scale_color_manual(values = c("indianred3", "cornflowerblue")) + #更改女性为红色,男性为蓝色
  theme_bw()
#刻度标记由一个向量值定义,这里用函数seq(),例如seq(0,60,10)代表从0到60,以10递增
#现在要在y轴中添加美元符号
#这里使用了scales包中的符号(另外可添加欧元、百分比等符号)
#以下是书中代码:
ggplot(data = CPS85,
       mapping = aes(x = exper, y = wage,
                     color = sex, shape = sex, linetype = sex)) +
  geom_point(alpha = .7, size = 1.5) +
  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),
                     labels = scales::dollar) + #这里使用scales包的dollar符号
  scale_color_manual(values = c("indianred3", "cornflowerblue")) + 
  theme_bw()
##(John注)双冒号::为引用某个未加载包中的某函数,这样可以避免该包或者函数对本研究结果的影响
##(John注)表达为packagename::functionname
#下一步是对比不同职业,工作年限、薪资和性别之间的关系是否相同


###1.5刻面###
#刻面是将某一个变量或者组合按照不同水平分别绘制一张图
#使用函数facet_wrap()和函数facet_grid()来创建
#以下为相关语法,var、rowvar和colvar代表相对应的因子
facet_wrap(~var, ncol = n) #将每个var水平排列成n列的独立图
facet_wrap(~var, nrow = n) #将每个var水平排列成n行的独立图
facet_grid(rowvar~colvar) #rowvar和colvar组合的独立图,其中rowvar代表行,colvar代表列
facet_grid(rowvar~.) #每个rowvar水平的独立图,配制成一个单列
facet_grid(.~colvar) #每个colvar水平的独立图,配制成一个单行
#以上面的数据,将每个sector中的8个水平分别定义成小图
#去除所有size定义,让R自己定义,可以让图看起来更好看一些
ggplot(data = CPS85,
       mapping = aes(x = exper, y = wage,
                     color = sex, shape = sex, linetype = 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),
                     labels = scales::dollar) +
  scale_color_manual(values = c("indianred3", "cornflowerblue")) + 
  facet_wrap(~sector) +
  theme_bw()
##John注:例子中并没有对这部分进行很好的展示,书中也没有细讲
##这部分需要的话再仔细看一下吧


###1.6标签###
#labs()可以定义标题、副标题、x轴和y轴名称
#代码如下:
ggplot(data = CPS85,
       mapping = aes(x = exper, y = wage,
                     color = sex, shape = sex, linetype = 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),
                     labels = scales::dollar) +
  scale_color_manual(values = c("indianred3", "cornflowerblue")) + 
  facet_wrap(~sector) +
  labs(title = "Relationshpi between wages and exprience",
       subtitle = "Current Population Survey",
       x = "Years of Exprience",
       y = "Hourly Wage",
       color = "Gender", shape = "Gender", linetype = "Gender") +
  theme_bw()

###1.7主题###
#主题函数theme_控制背景、颜色、字体、网格线、图例位置以及与其他无冠的图形特征
#设置一个不同的主题:
ggplot(data = CPS85,
       mapping = aes(x = exper, y = wage,
                     color = sex, shape = sex, linetype = 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),
                     labels = scales::dollar) +
  scale_color_manual(values = c("indianred3", "cornflowerblue")) + 
  facet_wrap(~sector) +
  labs(title = "Relationshpi between wages and exprience",
       subtitle = "Current Population Survey",
       x = "Years of Exprience",
       y = "Hourly Wage",
       color = "Gender", shape = "Gender", linetype = "Gender") +
  theme_minimal()
#第19章会做详细的主题讲解


####2、ggplot2包的详细信息####

###2.1放置数据和放射选项###
#ggplot2包创建图形总是从ggplot()函数开始的
#前面内容中ggplot()函数放置了data和mapping两个选项
#这两个选项将应用到后面每一个geom函数中
#我们可以直接将这两个选项放进几何对象中,但这样只能应用到制定的几何对象中
#书中代码如下:
ggplot(CPS85, aes(x = exper, y = wage, color = sex)) +
  geom_point(alpha = .7, size = 1.5) +
  geom_smooth(method = "lm", se = FALSE, size = 1) +
  scale_color_manual(values = c("lightblue", "midnightblue")) +
  theme_bw()
#由于性别到颜色的映射在函数ggplo()中,因此也会映射到geom_print()和geom_smooth()中
#重新书写代码,注意与上面的图形区别
ggplot(CPS85, aes(x = exper, y = wage)) +
  geom_point(aes(color = sex), alpha = .7, size = 1.5) +
  geom_smooth(method = "lm", se = FALSE, size = 1) +
  scale_color_manual(values = c("lightblue", "midnightblue")) +
  theme_bw()
#这样最终的颜色映射只能出现到geom_point()函数中
#由于第一个选项总是引用数据,第二个选项总是用于映射,所以短于data =和mapping =可以省略

###2.2将图形作为对象使用###
#ggplot2图形可以保存为被命名的R对象(列表型数据),进一步操作可以打印或者保存
#以下为书中代码
data("CPS85", package = "mosaicData") #①
CPS85 <- CPS85[CPS85$wage < 40,] #①

myplot <- ggplot(data = CPS85, #②
                 aes(x = exper, y = wage)) + #②
  geom_point() #②

myplot #③

myplot2 <- myplot + geom_point(size = 3, color = "blue") #④
myplot2 #④

myplot + geom_smooth(method = "lm") + #⑤
  labs(title = "Mildly interesting graph") #⑤
#①准备数据
#②创建一张散点图并保存为myplot
#③显示myplot
#④修改数据点的大小,颜色调整为蓝色,并保存为myplot2,显示该图形
#⑤显示myplot并配以最佳拟合曲线与标题
##以上这样分步操作可以保存每一步的数据


###2.3保存图形###
#用RStudio可以用右侧plots中的Export保存图像
#另外可以用ggsave()函数进行保存,函数可以指定文件及图像大小
#代码如下:
ggsave(file = "mygraph.png", plot = myplot, width = 5, height = 4)
#具体可保存的格式见书第79页,长宽的数值单位为英寸
#如果是导入Word文档或者powerpoint文档,建议保存为.wmf文档


###2.4常见错误###
#第一个错误是aes()函数的右括号经常会被忘掉,但如果用RStudio,它会提醒的
#第二个错误是混淆映射的赋值,例如
ggplot(CPS85, aes(x = exper, y = wage, color = "blue")) +
geom_point()
#这段代码最终显示是错误的,因为aes()函数用于将变量映射到图形的视觉特征
#给常量赋值的操作应该在aes()函数之外,正确代码如下:
ggplot(CPS85, aes(x = exper, y = wage)) +
geom_point(color = "blue")

  • 12
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值