Fundamentals of Data Visualization: A Primer on Making Informative and Compelling Figures 1st Edition - by Claus O. Wilke
是一本系統(tǒng)講解常見(jiàn)數(shù)據(jù)可視化的問(wèn)題的書(shū)籍,包括內(nèi)容選擇、表現(xiàn)形式、注釋形式等。但作者并沒(méi)有把它當(dāng)成編程書(shū)籍,因此沒(méi)有現(xiàn)成的代碼。
Ugly, Bad, and Wrong Figures
- Ugly: 信息清晰豐富但很丑的圖片
- Bad: 不清晰、欺騙性、迷惑性、或者過(guò)度復(fù)雜的圖片
- Wrong:存在數(shù)字上的問(wèn)題
library(ggplot2)
library(patchwork)
data <- data.frame(names = c("A", "B", "C"),
values = c(5, 4, 3))
theme <- theme(panel.grid.major.y = element_line(colour = "black"),
panel.background = element_blank(),
axis.line.y = element_blank())
p1 <- ggplot(data = data) + geom_col(aes(x = names, y = values)) +
theme
p2 <- ggplot(data = data) + geom_col(aes(x = names,
y = values,
fill = names)) +
labs(title = "ugly") +
theme
p3 <- ggplot(data = data) + geom_col(aes(x = names,
y = values)) +
labs(title = "bad") +
theme(panel.background = element_blank(),
axis.ticks = element_blank(),
axis.title = element_blank(),
axis.text.y = element_blank())
ggsave("C:\\Users\\Administrator\\Desktop\\Ugly_Bad_Figures.png", p1+p2/p3 + plot_annotation(tag_levels = 'A'))

解釋
圖不是完全相同,意思意思。
A. 沒(méi)有太多瑕疵。
B. 填充顏色是沒(méi)有必要的變量。
C. 沒(méi)有y坐標(biāo)軸,只知道數(shù)據(jù)大概比例,不知道確切數(shù)值。
可視化目錄
總述一般常見(jiàn)的數(shù)據(jù)可視化策略,可以作為參考字典,為日??梢暬峁┧悸?。
Visualizing Amounts
柱狀圖一般用于,當(dāng)我們都有一組分類(lèi)變量以及每個(gè)類(lèi)別的定量值,而我們關(guān)注的主要重點(diǎn)是定量值的大小時(shí)。
應(yīng)該在柱狀圖背景保留橫網(wǎng)格線,便于比較我們關(guān)注的值。
當(dāng)分類(lèi)label過(guò)長(zhǎng)時(shí),最好選擇橫向柱狀圖,避免出現(xiàn)旋轉(zhuǎn)label,保持文字閱讀方向與圖形方向的統(tǒng)一性。
應(yīng)該注意對(duì)柱狀圖(或點(diǎn)圖,棒棒糖圖)進(jìn)行適當(dāng)排序(大小,分類(lèi)變量,分布心態(tài))。
當(dāng)分類(lèi)數(shù)據(jù)過(guò)多時(shí),可以選擇棒棒糖圖(點(diǎn)圖 + 點(diǎn)到坐標(biāo)軸連線)或熱圖
ggplot2中柱狀圖的基本繪制函數(shù)有g(shù)eom_bar() 和 geom_col(),其中g(shù)eom_bar() 產(chǎn)生的柱狀圖映射是經(jīng)過(guò)統(tǒng)計(jì)變換的(count, ..prop..);geom_col()是不經(jīng)過(guò)統(tǒng)計(jì)變換的,代表的就是該分類(lèi)變量的實(shí)際值。

棒棒糖圖也是一種可以選擇的圖形映射。
Distributions
單變量分布圖

多變量分布圖

Proportions
單變量比例圖

多變量比例圖


其他
與散點(diǎn)圖相比,坡度圖(Slopegraphs)有一個(gè)重要的優(yōu)勢(shì):它們可用于一次比較兩個(gè)以上的測(cè)量結(jié)果。
比列原則
1. 保證坐標(biāo)軸從0開(kāi)始
在許多不同的可視化場(chǎng)景中,我們常常通過(guò)圖形元素的范圍來(lái)表示數(shù)據(jù)值。例如,在柱狀圖中,我們所繪制柱子一般是從0開(kāi)始到其代表的數(shù)據(jù)值結(jié)束。在這種情況下,數(shù)據(jù)值不僅被編碼在條的端點(diǎn)中,而且還被編碼在條的高度或長(zhǎng)度中。此時(shí),如果我們繪制的條形圖的起始值不在0點(diǎn),則條形圖的長(zhǎng)度比例和條形圖端點(diǎn)所代表的數(shù)字可能會(huì)傳達(dá)相互矛盾的信息。因此,當(dāng)陰影區(qū)域用于表示數(shù)值時(shí),該陰影區(qū)域的面積應(yīng)與相應(yīng)的值成正比。
library(ggplot2)
require(patchwork)
set.seed(13)
data <- data.frame(name = rep(LETTERS[1:10],3),
value = runif(30, min = 1, max = 10))
customer_theme <- theme(panel.grid.major.y = element_line(colour = "black"),
panel.background = element_blank(),
axis.line = element_line(colour = "black"),
axis.title.y = element_blank())
p1 <- ggplot(data = data, aes(x = name, y = value)) +
geom_col() +
coord_cartesian(ylim = c(10, 25)) +
customer_theme
p2 <- ggplot(data = data, aes(x = name, y = value)) +
geom_col() +
customer_theme

左圖是陰影部分與實(shí)際值成正比的一個(gè)示例,當(dāng)我們讓實(shí)際值等于陰影部分加上坐標(biāo)軸起點(diǎn)10時(shí),我們可以看到F、G與其他的分組的值差異顯得非常大,使圖片傳遞出了一個(gè)具有誤導(dǎo)性的信息。
2. 利用平均值或中位數(shù)
當(dāng)我們切實(shí)需要展示大數(shù)據(jù)中的差異度相對(duì)較小變化時(shí),可以選擇利用數(shù)據(jù)的中位數(shù)或者平均值為0點(diǎn),做類(lèi)似瀑布圖的柱狀圖。
library(ggplot2)
require(patchwork)
set.seed(13)
data <- data.frame(name = rep(LETTERS[1:10]),
value = rnorm(10, mean = 5, sd = 2))
customer_theme <- theme(panel.grid.major.y = element_line(colour = "black"),
panel.background = element_blank(),
axis.line = element_line(colour = "black"),
axis.title.y = element_text(colour = "red"))
p1 <- ggplot(data = data, aes(x = name, y = value)) +
geom_col() +
customer_theme
data_mean <- mean(data$value)
p2 <- ggplot(data = data, aes(x = name, y = (value - data_mean))) +
geom_col() +
customer_theme + labs(y = "change in mean **")
ggsave(filename = quote(mean_bar.png),
plot = p1 +p2 + plot_annotation(tag_levels = 'A'),
path = file)

3. 避免標(biāo)簽重疊
ggrepel 主要通過(guò)geom_text_repel() 和geom_label_repel() 兩個(gè)函數(shù)對(duì)標(biāo)簽重疊進(jìn)行處理。
library(ggplot2)
library(patchwork)
library(ggrepel)
set.seed(13)
dat <- subset(mtcars, wt > 2.75 & wt < 3.45)
dat$car <- rownames(dat)
p <- ggplot(dat, aes(wt, mpg, label = car)) +
geom_point(color = "red")
p2 <- p + geom_text()
p3 <- p + geom_text_repel() +
labs(title = "geom_text_repel")
p4 <- p + geom_text_repel(min.segment.length = 0,
box.padding = 0.5) +
labs(title = "box.padding = 0.5")
