[数据分析与可视化] 数据绘图要点3-意大利面条图

数据绘图要点3-意大利面条图

线条太多的折线图通常变的不可读,这种图一般被称为意大利面条图。因此这种图几乎无法提供有关数据的信息。

绘图实例

让我们以美国从1880年到2015年女性婴儿名字的演变为例。

# Libraries
library(tidyverse)
library(hrbrthemes)
library(kableExtra)
library(babynames)
library(viridis)
library(DT)
library(plotly)
# 展示数据
data <- babynames
head(data)
nrow(data)
A tibble: 6 × 5
yearsexnamenprop
<dbl><chr><chr><int><dbl>
1880FMary 70650.07238359
1880FAnna 26040.02667896
1880FEmma 20030.02052149
1880FElizabeth19390.01986579
1880FMinnie 17460.01788843
1880FMargaret 15780.01616720

1924665

# 挑选某些姓名的数据
data = filter(data,name %in% c("Mary","Emma", "Ida", "Ashley", "Amanda", "Jessica", "Patricia", "Linda", "Deborah",   "Dorothy", "Betty", "Helen"))
head(data)
nrow(data)
A tibble: 6 × 5
yearsexnamenprop
<dbl><chr><chr><int><dbl>
1880FMary 70650.07238359
1880FEmma 20030.02052149
1880FIda 14720.01508119
1880FHelen 6360.00651606
1880FAmanda 2410.00246914
1880FBetty 1170.00119871

2599

# 只要女性数据
data= filter(data,sex=="F")
head(data)
nrow(data)
A tibble: 6 × 5
yearsexnamenprop
<dbl><chr><chr><int><dbl>
1880FMary 70650.07238359
1880FEmma 20030.02052149
1880FIda 14720.01508119
1880FHelen 6360.00651606
1880FAmanda 2410.00246914
1880FBetty 1170.00119871

1593

# 绘图
ggplot(data,aes(x=year, y=n, group=name, color=name)) +
geom_line() +
scale_color_viridis(discrete = TRUE) +
theme(
  plot.title = element_text(size=14)
) +
ggtitle("A spaghetti chart of baby names popularity")

png

从图中看到很难按照一条线来理解特定名称受欢迎程度的演变。另外,即使您设法遵循一条线显示结果,您也需要将其与更难的图例联系起来。让我们尝试找到一些解决方法来改进此图形。

改进方法

针对特定群体

假设您绘制了许多组,但实际原因是为了解释一个特定组与其他组相比的特征。然后一个好的解决方法是突出显示这个组:让它看起来不同,并给它一个适当的注释。在这里,Amanda的人气演变是显而易见的。保留其他名称很重要,因为它允许您将 Amanda 与所有其他名称进行比较

# 添加数据项
data =  mutate( data, highlight=ifelse(name=="Amanda", "Amanda", "Other"))
head(data)
A tibble: 6 × 6
yearsexnamenprophighlight
<dbl><chr><chr><int><dbl><chr>
1880FMary 70650.07238359Other
1880FEmma 20030.02052149Other
1880FIda 14720.01508119Other
1880FHelen 6360.00651606Other
1880FAmanda 2410.00246914Amanda
1880FBetty 1170.00119871Other
ggplot(data,aes(x=year, y=n, group=name, color=highlight, size=highlight)) +
geom_line() +
scale_color_manual(values = c("#69b3a2", "lightgrey")) +
scale_size_manual(values=c(1.5,0.2)) +
theme(legend.position="none") +
ggtitle("Popularity of American names in the previous 30 years") +
geom_label( x=1990, y=55000, label="Amanda reached 3550\nbabies in 1970", size=4, color="#69b3a2") +
theme(,
  plot.title = element_text(size=14)
)

png

使用子图

面积图可用于对数据集进行更全面的概述,尤其是与子图结合使用时。在下面的图表中,可以很容易地瞥见任何名称的演变情况:

ggplot(data,aes(x=year, y=n, group=name, fill=name)) +
geom_area() +
scale_fill_viridis(discrete = TRUE) +
theme(legend.position="none") +
ggtitle("Popularity of American names in the previous 30 years") +
theme(
  panel.spacing = unit(0.1, "lines"),
  strip.text.x = element_text(size = 8),
  plot.title = element_text(size=14)
) +
# 按名字分图
facet_wrap(~name)

png

从图上可以看到,Linda这个名字在很短的时间内是一个非常受欢迎的名字。另一方面,Ida 从来都不是很受欢迎,在几十年中较少被使用。

组合方法

如果您想比较每条线与其他线的演变情况,您可以将针对特定群体和使用子图结合起来

# 复制列,name/name2分别有不同用处,一个用于显示子图中的数据,一个用于分列
tmp <- data %>%
  mutate(name2=name)
head(tmp)
A tibble: 6 × 7
yearsexnamenprophighlightname2
<dbl><chr><chr><int><dbl><chr><chr>
1880FMary 70650.07238359Other Mary
1880FEmma 20030.02052149Other Emma
1880FIda 14720.01508119Other Ida
1880FHelen 6360.00651606Other Helen
1880FAmanda 2410.00246914AmandaAmanda
1880FBetty 1170.00119871Other Betty
tmp %>%
ggplot( aes(x=year, y=n)) +
# 用name2显示数据
geom_line( data=tmp %>% dplyr::select(-name), aes(group=name2), color="grey", size=0.5, alpha=0.5) +
geom_line( aes(color=name), color="#69b3a2", size=1.2 )+
scale_color_viridis(discrete = TRUE) +
theme(
  legend.position="none",
  plot.title = element_text(size=14),
  panel.grid = element_blank()
) +
ggtitle("A spaghetti chart of baby names popularity") +
# 用name分图
facet_wrap(~name)

png

参考

posted @ 2022-12-19 21:48  落痕的寒假  阅读(84)  评论(0编辑  收藏  举报