數(shù)據(jù)可視化基礎(chǔ)和常見(jiàn)可視化策略

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

  1. Ugly: 信息清晰豐富但很丑的圖片
  2. Bad: 不清晰、欺騙性、迷惑性、或者過(guò)度復(fù)雜的圖片
  3. 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'))
Ugly_Bad_Figures.png

解釋

圖不是完全相同,意思意思。
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í)。

  1. 應(yīng)該在柱狀圖背景保留橫網(wǎng)格線,便于比較我們關(guān)注的值。

  2. 當(dāng)分類(lèi)label過(guò)長(zhǎng)時(shí),最好選擇橫向柱狀圖,避免出現(xiàn)旋轉(zhuǎn)label,保持文字閱讀方向與圖形方向的統(tǒng)一性。

  3. 應(yīng)該注意對(duì)柱狀圖(或點(diǎn)圖,棒棒糖圖)進(jìn)行適當(dāng)排序(大小,分類(lèi)變量,分布心態(tài))。

  4. 當(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í)際值。

image.png

棒棒糖圖也是一種可以選擇的圖形映射。

Distributions

單變量分布圖

image.png

多變量分布圖

Proportions

單變量比例圖

image.png

多變量比例圖

image.png

image.png

其他

與散點(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
Proportional_Ink.png

左圖是陰影部分與實(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)
mean_bar.png

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")
ggrepel.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容