[R語言] TidyTuesday ggplot2可視化學(xué)習(xí) 2 (Rap Artists)

數(shù)據(jù)主題:Rap Artists

數(shù)據(jù)源:
https://raw.githubusercontent.com/rfordatascience/tidytuesday/master/data/2020/2020-04-14/polls.csv

這次挑的圖比較簡單钙勃,比較有意思的就是純黑背景
實際就是封裝成一個函數(shù)可以單獨調(diào)用

前置知識

- 黑色主題

黑色主題代碼:Black theme for ggplot2

主題代碼和簡單示例如下:

theme_black = function(base_size = 12, base_family = "") {
  theme_grey(base_size = base_size, base_family = base_family) %+replace% 
    theme(
      # Specify axis options
      axis.line = element_blank(),  
      axis.text.x = element_text(size = base_size*0.8, color = "white", lineheight = 0.9),  
      axis.text.y = element_text(size = base_size*0.8, color = "white", lineheight = 0.9),  
      axis.ticks = element_line(color = "white", size  =  0.2),  
      axis.title.x = element_text(size = base_size, color = "white", margin = margin(0, 10, 0, 0)),  
      axis.title.y = element_text(size = base_size, color = "white", angle = 90, margin = margin(0, 10, 0, 0)),  
      axis.ticks.length = unit(0.3, "lines"),   
      # Specify legend options
      legend.background = element_rect(color = NA, fill = "black"),  
      legend.key = element_rect(color = "white",  fill = "black"),  
      legend.key.size = unit(1.2, "lines"),  
      legend.key.height = NULL,  
      legend.key.width = NULL,      
      legend.text = element_text(size = base_size*0.8, color = "white"),  
      legend.title = element_text(size = base_size*0.8, face = "bold", hjust = 0, color = "white"),  
      legend.position = "right",  
      legend.text.align = NULL,  
      legend.title.align = NULL,  
      legend.direction = "vertical",  
      legend.box = NULL, 
      # Specify panel options
      panel.background = element_rect(fill = "black", color  =  NA),  
      panel.border = element_rect(fill = NA, color = "white"),  
      panel.grid.major = element_line(color = "grey35"),  
      panel.grid.minor = element_line(color = "grey20"),  
      panel.spacing = unit(0.5, "lines"),   
      # Specify facetting options
      strip.background = element_rect(fill = "grey30", color = "grey10"),  
      strip.text.x = element_text(size = base_size*0.8, color = "white"),  
      strip.text.y = element_text(size = base_size*0.8, color = "white",angle = -90),  
      # Specify plot options
      plot.background = element_rect(color = "black", fill = "black"),  
      plot.title = element_text(size = base_size*1.2, color = "white"),  
      plot.margin = unit(rep(1, 4), "lines") 
    )  
}
library(patchwork)

p1 <- ggplot(mtcars, aes(wt, mpg)) + geom_point()
p2 <- ggplot(mtcars, aes(wt, mpg)) + geom_point(color = "white") + theme_black()

p3 <- iris %>% 
  ggplot(aes(Sepal.Length,Petal.Length,color=Species)) +
  geom_point() +
  theme(
    legend.position = c(0.85,0.18)
  )
p4 <- iris %>% 
  ggplot(aes(Sepal.Length,Petal.Length,color=Species)) +
  geom_point() + 
  theme_black() +
  theme(
    legend.position = c(0.85,0.18)
  )

(p1 + p3)/(p2 + p4)

- gghighlight

gghighlight() can highlight almost any geoms.

本質(zhì)就是把感興趣的點highlight
我覺得理解成非感興趣的點unhighlight可能更好

對示例簡單修改后如下:

# 構(gòu)建數(shù)據(jù)
dat <- data.frame(
  idx = c(1, 1, 1, 2, 2, 2, 3, 3, 3),
  value = c(1, 2, 3, 10, 11, 12, 9, 10, 11),
  category = rep(c("apple", "banana", "strawberry"), 3),
  stringsAsFactors = FALSE
)
  • (1) 各分組最大值符合條件則highlight該分組
p1 <- ggplot(dat, aes(idx, value, colour = category)) +
  geom_line() + 
  gghighlight(max(value) > 10)

可以看到gghighlight會設(shè)置打標(biāo)簽
本質(zhì)就是ggrepel::geom_label_repel(),所以可以進行個性化調(diào)整

  • (2) 分組后按數(shù)據(jù)篩選感興趣的點
ggplot(dat, aes(idx, value)) +
  geom_point() +
  gghighlight(value > 2, label_key = category)

依然會對highlight的點打上標(biāo)簽
但如果點過多會有如下warning并且不打標(biāo)簽傍妒,上限應(yīng)該是10個

label_key: category
Too many data points, skip labeling
  • (2) 可以調(diào)節(jié)非highlight數(shù)據(jù)的參數(shù):unhighlighted_params
    就是標(biāo)識但弱化非感興趣數(shù)據(jù)的存在,舉兩個例子
p1 <- ggplot(dat, aes(idx, value, colour = category)) +
  geom_line(size = 4) +
  gghighlight(max(value) > 10,
              unhighlighted_params = list(size = 2)
  )

p2 <- ggplot(mpg, aes(displ, hwy)) +
  geom_point(aes(fill=class),shape=21,color='white',size=2.5,stroke=1) +
  gghighlight::gghighlight(hwy > 19,
                           unhighlighted_params = list(size = 1))

p1 + p2

畫圖

  • 第一張圖:歌曲年份和排名的散點圖
# 數(shù)據(jù)源
polls <- readr::read_csv('https://raw.githubusercontent.com/rfordatascience/tidytuesday/master/data/2020/2020-04-14/polls.csv')
# 注冊字體
windowsFonts(HEL=windowsFont("Helvetica CE 55 Roman"),
             RMN=windowsFont("Times New Roman"),
             ARL=windowsFont("Arial"),
             JBM=windowsFont("JetBrains Mono"))

polls %>%
  # 自定義擴大了數(shù)據(jù)范圍利于結(jié)果呈現(xiàn)
  mutate(points = case_when(rank == 1 ~ 10,
                            rank == 2 ~ 8,
                            rank == 3 ~ 6,
                            rank == 4 ~ 4,
                            rank == 5 ~ 2)) %>%
  group_by(title, year, gender) %>%
  summarise(sum_points = sum(points)) %>%
  # arrange(-var) 等價于 arrange(desc(var))
  arrange(-sum_points) %>%
  ggplot(aes(year, sum_points)) +
  geom_point(position = "jitter")  +
  # 黑色背景下highlight無論是感興趣還是非興趣的數(shù)據(jù)點顏色均會反轉(zhuǎn)成可見
  gghighlight::gghighlight(sum_points > 90,  label_key = title,
                           # 這里原作者沒有修改
                           label_params = list(fill=NA, colour="white", 
                                               size = 5, family='ARL',
                                               segment.colour = NA)) +
  labs(title = "Top Rated Songs",
       x = "Year",
       y= "Total Points") +
  # 加上黑色主題函數(shù) 
  theme_black() +
  # 如果需要調(diào)整各參數(shù)需要在主題背景之后設(shè)置否則會被覆蓋
  theme(
    text = element_text(family="ARL"),
    plot.title = element_text(size = 20,vjust = 2),
    axis.title.x = element_text(size = 16),
    axis.title.y = element_text(size = 16),
    axis.text.x = element_text(size = 13),  
    axis.text.y = element_text(size = 13)
  )
  • 第二張圖:探究歌曲排名與歌手合作的關(guān)系
res <- polls %>%
  # 利用正則和文本檢測尋找特定符號 ft 和 & 明確有無合作
  mutate(first_artist = gsub( " ft.*$", "", artist ), 
         first_artist = gsub( " &.*$", "", first_artist ), 
         collaboration = case_when(str_detect(artist, "ft") ~ "Yes",
                                   str_detect(artist, "&") ~ "Yes",
                                   TRUE ~ "No"),
         points = case_when(rank == 1 ~ 10,
                            rank == 2 ~ 8,
                            rank == 3 ~ 6,
                            rank == 4 ~ 4,
                            rank == 5 ~ 2)) %>% 
  # 根據(jù)歌手和合作與否分別計算平均歌曲得分
  group_by(first_artist, collaboration) %>%
  summarise(sum_points = sum(points),
            n = n(),
            avg_points = sum_points/n) %>%
  group_by(first_artist) %>% 
  # 等價于 filter(n() == 2)恼蓬,篩選出有無合作均發(fā)過歌曲的歌手
  filter(n() > 1) %>% 
  arrange(-avg_points)

res %>% 
  ggplot(aes(avg_points, first_artist, color = collaboration)) +
  geom_line(aes(group = first_artist)) +
  geom_point() +
  scale_color_manual(values = c("red", "green"), name = "Collaboration?") +
  labs(title = "Do artists get higher rankings when they collaborate?",
       y = "",
       x = "Average Points Rating") +
  theme_black() +
  theme(
    text = element_text(family="ARL"),
    plot.title = element_text(size = 17,vjust = 4),
    axis.title.x = element_text(size = 14),
    axis.title.y = element_text(size = 14),
    axis.text.x = element_text(size = 11),  
    axis.text.y = element_text(size = 11),
    legend.title = element_text(size = 13),
    legend.text = element_text(size = 10)
  )
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌请梢,老刑警劉巖赠尾,帶你破解...
    沈念sama閱讀 217,509評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件力穗,死亡現(xiàn)場離奇詭異,居然都是意外死亡气嫁,警方通過查閱死者的電腦和手機当窗,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,806評論 3 394
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來寸宵,“玉大人崖面,你說我怎么就攤上這事元咙。” “怎么了巫员?”我有些...
    開封第一講書人閱讀 163,875評論 0 354
  • 文/不壞的土叔 我叫張陵庶香,是天一觀的道長。 經(jīng)常有香客問我简识,道長赶掖,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,441評論 1 293
  • 正文 為了忘掉前任七扰,我火速辦了婚禮奢赂,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘颈走。我一直安慰自己膳灶,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,488評論 6 392
  • 文/花漫 我一把揭開白布立由。 她就那樣靜靜地躺著轧钓,像睡著了一般。 火紅的嫁衣襯著肌膚如雪锐膜。 梳的紋絲不亂的頭發(fā)上聋迎,一...
    開封第一講書人閱讀 51,365評論 1 302
  • 那天,我揣著相機與錄音枣耀,去河邊找鬼霉晕。 笑死,一個胖子當(dāng)著我的面吹牛捞奕,可吹牛的內(nèi)容都是我干的牺堰。 我是一名探鬼主播,決...
    沈念sama閱讀 40,190評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼颅围,長吁一口氣:“原來是場噩夢啊……” “哼伟葫!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起院促,我...
    開封第一講書人閱讀 39,062評論 0 276
  • 序言:老撾萬榮一對情侶失蹤筏养,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后常拓,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體渐溶,經(jīng)...
    沈念sama閱讀 45,500評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,706評論 3 335
  • 正文 我和宋清朗相戀三年弄抬,在試婚紗的時候發(fā)現(xiàn)自己被綠了茎辐。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,834評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖拖陆,靈堂內(nèi)的尸體忽然破棺而出弛槐,到底是詐尸還是另有隱情,我是刑警寧澤依啰,帶...
    沈念sama閱讀 35,559評論 5 345
  • 正文 年R本政府宣布乎串,位于F島的核電站,受9級特大地震影響速警,放射性物質(zhì)發(fā)生泄漏灌闺。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,167評論 3 328
  • 文/蒙蒙 一坏瞄、第九天 我趴在偏房一處隱蔽的房頂上張望桂对。 院中可真熱鬧,春花似錦鸠匀、人聲如沸蕉斜。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,779評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽宅此。三九已至,卻和暖如春爬范,著一層夾襖步出監(jiān)牢的瞬間父腕,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,912評論 1 269
  • 我被黑心中介騙來泰國打工青瀑, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留璧亮,地道東北人。 一個月前我還...
    沈念sama閱讀 47,958評論 2 370
  • 正文 我出身青樓斥难,卻偏偏與公主長得像枝嘶,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子哑诊,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,779評論 2 354

推薦閱讀更多精彩內(nèi)容