引言
在进行数据分析时,免不了对结果进行可视化。那么,什么样的图形才最适合自己的数据呢?一个有效的图形应具备以下特点:
- 能正确传递信息,而不会产生歧义;
- 样式简单,但是易于理解;
- 添加的图形美学应辅助理解信息;
- 图形上不应出现冗余无用的信息。
本系列推文,小编将汇总可视化中常用 7 大类型图形,供读者参考。每类制作成一篇推文,主要参考资料为:Top 50 ggplot2 Visualizations[1]。其他类似功能网站,资料包括:
- 庄闪闪的可视化笔记——常用图形[2]
- R Graph Gallery[3]
- 《R 语言教程》——ggplot 的各种图形[4]
系列目录
本文主要介绍第二部分:偏差关系图形。第一部分可见:可视化系列汇总——相关关系图形。
加载数据集
使用 ggplot2
包中自带数据集作为示例数据集。
library(ggplot2) library(plotrix) data("midwest", package = "ggplot2") #加载数据集
midwest 数据集
全局主题设置
全局配色、主题设置。注意,本文使用离散色阶,如果需要使用连续色阶,则需要重写。
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")
参考资料
[1]
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