常用 7 大类型图形可视化——偏差关系图形
点击下方公众号,回复资料分享,收获惊喜
引言
在进行数据分析时,免不了对结果进行可视化。那么,什么样的图形才最适合自己的数据呢?一个有效的图形应具备以下特点:
能正确传递信息,而不会产生歧义; 样式简单,但是易于理解; 添加的图形美学应辅助理解信息; 图形上不应出现冗余无用的信息。
本系列推文,小编将汇总可视化中常用 7 大类型图形,供读者参考。每类制作成一篇推文,主要参考资料为:Top 50 ggplot2 Visualizations[1]。其他类似功能网站,资料包括:
庄闪闪的可视化笔记——常用图形[2]
R Graph Gallery[3]
《R 语言教程》——ggplot 的各种图形[4]
系列目录
本文主要介绍第二部分:偏差关系图形。第一部分可见:可视化系列汇总——相关关系图形。
加载数据集
使用 ggplot2
包中自带数据集作为示例数据集。
library(ggplot2)
library(plotrix)
data("midwest", package = "ggplot2") #加载数据集
全局主题设置
全局配色、主题设置。注意,本文使用离散色阶,如果需要使用连续色阶,则需要重写。
options(scipen=999) # 关掉像 1e+48 这样的科学符号
# 颜色设置(灰色系列)
cbp1 <- c("#999999", "#E69F00", "#56B4E9", "#009E73",
"#F0E442", "#0072B2", "#D55E00", "#CC79A7")
# 颜色设置(黑色系列)
cbp2 <- c("#000000", "#E69F00", "#56B4E9", "#009E73",
"#F0E442", "#0072B2", "#D55E00", "#CC79A7")
ggplot <- function(...) ggplot2::ggplot(...) +
scale_color_manual(values = cbp1) +
scale_fill_manual(values = cbp1) + # 注意: 使用连续色阶时需要重写
theme_bw()
2 偏差
2.1 发散条形图
发散条形图是一种可以同时处理负值和正值的条形图。这可以通过 geom_bar()
来实现。但是 geom_bar()
的用法可能会让人很困惑。这是因为,它既可以用来制作柱状图,也可以用来制作直方图。默认情况下,geom_bar()
中 stat
参数的默认值为 count
。这意味着,当您只提供一个连续的 x 变量(而不提供 y 变量)时,它会尝试从数据中生成一个直方图。如果要制作条形图,需要做两件事:
设置 stat=identity
;在 aes()
中同时输入 x 和 y,其中 x 是字符或因子型变量,y 是数值型。
data("mtcars") # load data
mtcars$`car name` <- rownames(mtcars) # create new column for car names
mtcars$mpg_z <- round((mtcars$mpg - mean(mtcars$mpg))/sd(mtcars$mpg), 2) # compute normalized mpg
mtcars$mpg_type <- ifelse(mtcars$mpg_z < 0, "below", "above") # above / below avg flag
mtcars <- mtcars[order(mtcars$mpg_z), ] # sort
mtcars$`car name` <- factor(mtcars$`car name`, levels = mtcars$`car name`)
为了确保得到的是发散条形图,数据需要满足:分类变量的两个类别在连续变量的某个阈值处改变其值。在下面的例子中,mtcars
数据集的 mpg 通过计算 z 分数被规范化。那些 mpg 在 0 以上的车辆被标记为绿色,低于 0 的车辆被标记为红色。
ggplot(mtcars, aes(x=`car name`, y=mpg_z, label=mpg_z)) +
geom_bar(stat='identity', aes(fill=mpg_type), width=.5) +
scale_fill_manual(name="Mileage",
labels = c("Above Average", "Below Average"),
values = c("above"="#00ba38", "below"="#f8766d")) +
labs(subtitle="Normalised mileage from 'mtcars'",
title= "Diverging Bars") +
coord_flip()
2.2 带标记的发散型棒棒糖图
这个图形是发散条形图的一个变体。
ggplot(mtcars, aes(x=`car name`, y=mpg_z, label=mpg_z)) +
geom_point(stat='identity', fill="black", size=6) +
geom_segment(aes(y = 0,
x = `car name`,
yend = mpg_z,
xend = `car name`),
color = "black") +
geom_text(color="white", size=2) +
labs(title="Diverging Lollipop Chart",
subtitle="Normalized mileage from 'mtcars': Lollipop") +
ylim(-2.5, 2.5) +
coord_flip()
2.3 发散性点图
ggplot(mtcars, aes(x=`car name`, y=mpg_z, label=mpg_z)) +
geom_point(stat='identity', aes(col=mpg_type), size=6) +
scale_color_manual(name="Mileage",
labels = c("Above Average", "Below Average"),
values = c("above"="#00ba38", "below"="#f8766d")) +
geom_text(color="white", size=2) +
labs(title="Diverging Dot Plot",
subtitle="Normalized mileage from 'mtcars': Dotplot") +
ylim(-2.5, 2.5) +
coord_flip()
2.4 面积图
面积图通常用于可视化特定指标(如股票回报率)与基线的对比情况。
library(quantmod)
data("economics", package = "ggplot2")
# 计算利润
economics$returns_perc <- c(0, diff(economics$psavert)/economics$psavert[-length(economics$psavert)])
# 为轴刻度创建断点和标签
brks <- economics$date[seq(1, length(economics$date), 12)]
lbls <- lubridate::year(economics$date[seq(1, length(economics$date), 12)])
# Plot
ggplot(economics[1:100, ], aes(date, returns_perc)) +
geom_area() +
scale_x_date(breaks=brks, labels=lbls) +
theme(axis.text.x = element_text(angle=90)) +
labs(title="Area Chart",
subtitle = "Perc Returns for Personal Savings",
y="% Returns for Personal savings",
caption="Source: economics")
参考资料
Top 50 ggplot2 Visualizations: http://r-statistics.co/Top50-Ggplot2-Visualizations-MasterList-R-Code.html
[2]庄闪闪的可视化笔记——常用图形: https://liangliangzhuang.github.io/R-tutorial/main-diagram-types.html
[3]R Graph Gallery: https://www.r-graph-gallery.com/ggplot2-package.html
[4]R 语言教程——ggplot 的各种图形: https://www.math.pku.edu.cn/teachers/lidf/docs/Rbook/html/_Rbook/ggplotvis.html
推荐: 可以保存以下照片,在b站扫该二维码,或者b站搜索【庄闪闪
】观看Rmarkdown系列的视频教程。Rmarkdown视频新增两节视频(写轮眼幻灯片制作)需要视频内的文档,可在公众号回复【rmarkdown
】
R沟通|Rmarkdown教程(4)
R沟通|Rmarkdown教程(3)
R沟通|Rmarkdown教程(2)