搜索
查看: 1398|回复: 0

[R] 第21章

[复制链接]

31

主题

36

帖子

1589

积分

金牌会员

Rank: 6Rank: 6

积分
1589
发表于 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数据可视化手册,对于画图有兴趣的朋友应该是更为合适的一本书~

mathmatics.png
log10 xy.png
labs.png
labs subtitle caption.png
labels ps.png
labels null.png
label right margin.png
label margin.png
ggsave.png
ggsave 默认尺寸.png
ggrepel.png
ggplot2 auto.png
ggplot.png
geom label.png
fire.png
coord.png
color set1.png
color presidential.png
color drv.png
breaks 15 40.png
10-30.png
4.3.1 log 10.png
4.2.png
4,31.png
回复

使用道具 举报

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

本版积分规则

QQ|手机版|小黑屋|生信技能树 ( 粤ICP备15016384号  

GMT+8, 2020-7-6 19:37 , Processed in 0.033652 second(s), 34 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.