搜索
查看: 94|回复: 0

[R] 第21章

[复制链接]

24

主题

29

帖子

354

积分

中级会员

Rank: 3Rank: 3

积分
354
发表于 2018-12-1 19:44:21 | 显示全部楼层 |阅读模式
# chapter 21 使用ggplot2进行图形化沟通
# 准备工作
[AppleScript] 纯文本查看 复制代码
rm(list = ls())

library(tidyverse)


#1 标签
[AppleScript] 纯文本查看 复制代码
ggplot(mpg, aes(displ, hwy)) +

  geom_point(aes(color = class)) +

  geom_smooth(se = F) +

  labs(title = paste("Fuel efficiency generally decreases with", 

                     "engine size"))


# 使用图形标题的目的是概括主要成果,尽量不要使用只对图形进行描述的标题
# 如想添加更多文本,可以使用另外两个非常实用的标签
# subtitle可以在标题下以更小的字体添加更多附加信息
# caption可以在图形右下角添加文本,常用于描述数据来源
[AppleScript] 纯文本查看 复制代码
ggplot(mpg, aes(displ, hwy)) +

  geom_point(aes(color = class)) +

  geom_smooth(se = F) +

  labs(

    title = paste(

      "Fuel efficiency generally decreases with ",

      "engine size"

    ),

    subtitle = paste(

      "Two seaters (sports cars) are an exception ",

      "because of their light weight"

    ),

    caption = "Data from fueleconomy.gov"

  )


# 使用labs()函数替换坐标轴和图例中的标题,将间断的变量名称替换为更详细的描述并加上单位
[AppleScript] 纯文本查看 复制代码
ggplot(mpg, aes(displ, hwy)) +

  geom_point(aes(color = class)) +

  geom_smooth(se = F) +

  labs(

    x = "Engine displacement (L)",

    y = "Highway fuel economy (mpg)",

    color = "Car type"

  )



df <- tibble(

  x = runif(10),

  y = runif(10)

)

ggplot(df, aes(x, y)) + 

  geom_point() + 

  labs(

    x = quote(sum(x[i] ^ 2, i == 1, n)),

    y = quote(alpha + beta + frac(delta, theta))

  )



# 注释
[AppleScript] 纯文本查看 复制代码
best_in_class <-  mpg %>%

  group_by(class) %>%

  filter(row_number(desc(hwy)) == 1)

ggplot(mpg, aes(displ,hwy)) +

  geom_point(aes(color = class)) +

  geom_text(aes(label = model), data = best_in_class)


# 以上代码出图,数据点和标签彼此重叠,改进方法为使用geom_label()函数,它可为文本加上方框
[AppleScript] 纯文本查看 复制代码
ggplot(mpg, aes(displ, hwy)) +

  geom_point(aes(color = class)) +

  geom_label(

    aes(label = model),

    data = best_in_class,

    nudge_y = 2,

    alpha = .5

  )



# 上图仍有标签、数据点重叠,可以使用ggrepel包
# 以下代码添加了一个图层,用较大的空心圆强调添加了标签的数据点
[AppleScript] 纯文本查看 复制代码
ggplot(mpg, aes(displ, hwy)) + 

  geom_point(aes(color = class)) +

  geom_point(size = 3, shape = 1, data = best_in_class) + 

  ggrepel::geom_label_repel(

    aes(label = model),

    data = best_in_class

  )



class_avg <- mpg %>%

  group_by(class) %>%

  summarize(

    displ = median(displ),

    hwy = median(hwy)

  )

ggplot(mpg, aes(displ, hwy, color = class)) + 

  ggrepel::geom_label_repel(aes(label = class),

                            data = class_avg,

                            size = 6,

                            label.size = 0,

                            segment.color = NA) + 

  geom_point() + 

  theme(legend.position = "none")


# 及时只想向图中添加唯一的标签, 也需要创建一个数据框,
# 一般标签会放在角落,因此,应该用summarize()计算出x和y的最大值,并保存在数据框中
[AppleScript] 纯文本查看 复制代码
label <- mpg %>%

  summarize(

    displ = max(displ),

    hwy = max(hwy),

    label = paste(

      "Increasing engine size is \nrelated to",

      "decreasing fuel economy"

    )

  )

  

ggplot(mpg, aes(displ, hwy)) +

  geom_point() + 

  geom_text(

    aes(label = label),

    data = label,

    vjust = "top",

    hjust = "right"

  )


# +Inf和-Inf值可使标签紧贴着图形边界
[AppleScript] 纯文本查看 复制代码
label <- tibble(

  displ = Inf,

  hwy = Inf,

  label = paste(

    "Increasing engine size is \nrelated to",

    "decreasing fuel economy"

  )

)



ggplot(mpg, aes(displ, hwy)) + 

  geom_point() +

  geom_text(

    aes(label = label),

    data = label,

    vjust = "top",

    hjust = "right"

  )



"Increasing engine size related to decreasing fuel economy." %>%

  stringr::str_wrap(width = 48) %>%

  writeLines()


# 除了geom_text(),ggplot2中还有其他函数可添加注释
# 可以使用geom_hline()和geom_vline()添加参考线
# geom_rect()函数在我们感兴趣的数据点周围绘制矩形,
# 矩形边界由图形属性xmin、xmax、ymin和ymax确定
# 可使用geom_segment()及arrow参数绘制箭头,指向需要关注的数据点

#4 标度——控制着从数据值到图形属性的映射
[AppleScript] 纯文本查看 复制代码
ggplot(mpg, aes(displ, hwy)) +

  geom_point(aes(color = class))


# ggplot2会自动在后台为代码添加默认标度
[AppleScript] 纯文本查看 复制代码
ggplot(mpg, aes(displ, hwy)) +

  geom_point(aes(color = class)) +

  scale_x_continuous() +

  scale_y_continuous() +

  scale_color_discrete()


#4.1 坐标轴刻度与图例项目
# breaks控制坐标轴刻度的位置,以及与图例项目相关的数值显示。
# labels控制与每个坐标轴刻度或图例项目相关的文本标签
[AppleScript] 纯文本查看 复制代码
ggplot(mpg, aes(displ, hwy)) +

  geom_point() +

  scale_y_continuous(breaks = seq(15, 40, by = 5))



# labels也可以同样设置,还可以将其设置为NULL不显示刻度标签
[AppleScript] 纯文本查看 复制代码
ggplot(mpg, aes(displ, hwy)) + 

  geom_point() +

  scale_x_continuous(labels = NULL) +

  scale_y_continuous(labels = NULL)


# 可以使用breaks和labels控制图例的外观,坐标轴和图例统称为引导元素
# 需要使用breaks的一种情况是:数据点相对较少,如果想要强调观测的确切位置

[AppleScript] 纯文本查看 复制代码
presidential %>%

  mutate(id = 33 + row_number()) %>%

  ggplot(aes(start, id)) + 

  geom_point() +

  geom_segment(aes(xend = end, yend = id)) +

  scale_x_date(

    NULL,

    breaks = presidential$start,

    date_labels = "'%y"

  )


# 图例布局
# 使用theme()控制图例的整体位置
[AppleScript] 纯文本查看 复制代码
base <- ggplot(mpg, aes(displ, hwy)) +

  geom_point(aes(color = class))



base + theme(legend.position = "left")

base + theme(legend.position = "right")
# 默认设置

[AppleScript] 纯文本查看 复制代码
ggplot(mpg, aes(displ, hwy)) + 

  geom_point(aes(color = class)) + 

  geom_smooth(se = F) +

  theme(legend.position = "bottom") +

  guides(

    color = guide_legend(

      nrow = 1,

      override.aes = list(size = 4)

    )

  )


# 标度替换
[AppleScript] 纯文本查看 复制代码
ggplot(diamonds, aes(carat, price)) +

  geom_bin2d()



ggplot(diamonds, aes(log10(carat), log10(price))) +

  geom_bin2d()


# 可以发现,以上代码出的图坐标轴是以转换后的值来标记的

[AppleScript] 纯文本查看 复制代码
ggplot(diamonds, aes(carat, price)) +

  geom_bin2d() +

  scale_x_log10() +

  scale_y_log10()



ggplot(mpg, aes(displ, hwy)) +

  geom_point(aes(color = drv))



ggplot(mpg, aes(displ, hwy)) +

  geom_point(aes(color = drv)) +

  scale_color_brewer(palette = "Set1")



ggplot(mpg, aes(displ, hwy)) +

  geom_point(aes(color = drv, shape = drv)) +

  scale_color_brewer(palette = "Set1")


# 如预先确定数据值和颜色间的映射,那么可以使用scale_color_manual()函数
[AppleScript] 纯文本查看 复制代码
presidential %>%

  mutate(id = 33 + row_number()) %>%

  ggplot(aes(start, id, color = party)) + 

  geom_point() +

  geom_segment(aes(xend = end, yend = id)) +

  scale_color_manual(

    values = c(Republican = "red", Democratic = "blue")

  )


# 对于连续的颜色标度,可使用内置函数scale_color_gradient()或scale_fill_gradient()表示
# 如想表示发散性的颜色标度,可使用scale_color_gradient2()函数,
# 它可以使用正负数来表示不同的颜色,可用于区分位于平均值上下的点
[AppleScript] 纯文本查看 复制代码
df <- tibble(

  x = rnorm(10000),

  y = rnorm(10000)

)

ggplot(df, aes(x, y)) + 

  geom_hex() +

  coord_fixed()



ggplot(df, aes(x, y)) + 

  geom_hex() +

  viridis::scale_fill_viridis() +

  coord_fixed()



#5 缩放
#控制图形范围的方法
# 调整绘图所用数据
# 设置标度范围
# 在coord_cartesian()函数中设置xlim和ylim参数值

[AppleScript] 纯文本查看 复制代码
ggplot(mpg, mapping = aes(displ, hwy)) +

  geom_point(aes(color = class)) +

  geom_smooth() + 

  coord_cartesian(xlim = c(5, 7), ylim = c(10, 30))



mpg %>%

  filter(displ >= 5, displ <= 7, hwy >= 10, hwy <= 30) %>%

  ggplot(aes(displ, hwy)) +

  geom_point(aes(color = class)) +

  geom_smooth()



suv <- mpg %>%

  filter(class == "suv")

compact <- mpg %>% filter(class == "compact")



ggplot(suv, aes(displ, hwy, color = drv)) +

  geom_point()



ggplot(compact, aes(displ, hwy, color = drv)) +

  geom_point()



x_scale <- scale_x_continuous(limits = range(mpg$displ))

y_scale <- scale_y_continuous(limits = range(mpg$hwy))

col_scale <- scale_color_discrete(limits = unique(mpg$drv))



ggplot(compact, aes(displ, hwy, color = drv)) +

  geom_point() +

  x_scale +

  y_scale +

  col_scale

ggplot(suv, aes(displ, hwy, color = drv)) +

  geom_point() +

  x_scale +

  y_scale +

  col_scale


#6 主题
[AppleScript] 纯文本查看 复制代码
ggplot(mpg, aes(displ, hwy)) +

  geom_point(aes(color = class)) +

  geom_smooth(se = F) +

  theme_bw()


#7 保存图形
#ggsave()和knitr可以将图形从R导入最终报告,ggsave()可以将生成的图形保存到磁盘
[AppleScript] 纯文本查看 复制代码
ggplot(mpg, aes(displ, hwy)) + 

  geom_point()

ggsave("my-plot1.pdf")


#7.1 图形大小
# 设置fig.width = 6 和 fig.asp = 0.618
# 使用out.width控制输出图形大小,默认设置为out.width = "70%" 和fig.align = "center"
# 如想一行中防止多个图形,可将out.width设置为50%以放置2个图形,或设置为其他比例放置其他图形
# 同时需要设置fig.align = "default"

ggplot2画图并不是这本书的重点,推荐R数据可视化手册,对于画图有兴趣的朋友应该是更为合适的一本书~

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x



上一篇:第19章
下一篇:我想问大家
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|生信技能树    

GMT+8, 2018-12-12 05:25 , Processed in 0.029436 second(s), 27 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.