キング・クリムゾンのセットリストを分析する
動機
2021年最大の出来事といえばキング・クリムゾン(以下KC)の来日公演です。
2014年に現体制(公式の区分でいうところのKCVII)が結成されてから3回目の来日となりました。そして、これが最後の来日公演ともいわれています。
コロナ禍のために来日が危ぶまれていましたが、緊急事態宣言解除とオミクロン株による渡航制限発動の狭間で、奇跡の来日が実現しました。
本当に感謝しかありません。
私も東京の5公演に参加しましたが、本当に素晴らしいステージでした。
さて、現体制のKCの特徴として、公演ごとにころころと変わるセットリストがあります。
普通のミュージシャンであればツアー中に曲目や曲順を変えることはほとんどないと思いますが、KCは曲目も曲順も毎公演で変わります。
しかし、完全にランダムというわけではなく、ほぼ必ず演奏される曲があったり、この曲の後にはこの曲が演奏されやすい、といった
法則が見られます。
この点に注目されて2015年の来日公演時に id:nisshan_X さんがセットリストの分析をされていました。
nisshan-x.hatenablog.com
今回は現体制KCによる来日公演を含む以下の3回のツアーについて、同じようにR言語を用いて分析をしてみたいと思います。
- The Elements of King Crimson Tour (以下2015)
- Uncertain Times Tour (以下2018)
- Music Is Our Friend Tour (以下2021)
分析結果
楽曲の登場頻度
まずはツアー毎にどんな曲が多く演奏されているかを見てみます。
ただし、ツアー毎に公演回数が異なるので、公演回数に対する演奏割合で見てみます。
Starlessが不動の一位。まあ、そうですよね。Level Fiveもずっと上位にいます。
Indiscipleneが2018,2021と上位に入っているのも注目です。80年代の曲ですが、現行体制を代表する1曲です。最もいまのクリムゾンらしい曲といっていいでしょう。
どの曲とどの曲が同じ日に演奏されやすいか
曲と曲の組み合わせで、色が濃く円が大きい組み合わせがよく一緒に演奏される曲です。
これを見ると、2014はばらつきが大きく本当にどの曲が演奏されるか分からなかったのが、2018、2021ではある程度ほぼ決まって演奏される楽曲群とそれ以外のレア曲に明確に分かれるようになったのが分かりますj。
曲順分析
最後に曲順の分析です。
ある曲の次にある曲が演奏される割合を矢印の上にパーセントで書いています。
都合上、20%以下のつながりは割愛しています。
曲名の背景がピンクは定番曲(演奏割合66%以上)、青はレア曲(同33%以下)、黄色はその中間(33%~66%)です。
2021の Picture of a city (冷たい街の情景)がハブになっている感じが面白いですね。
2015
2018
2021
まとめ
最後の来日公演なんて言わないでまた来てよー。
80年代~00年代の曲ももっと聴きたいよー!
分析過程
以下、R言語のコードを含む分析の過程です。
データの取得
まずはセットリストのデータの取得です。
ありがたいことに setlist.fm に有志が投稿したセットリストが載っていますので、ここから分析のためのデータを取得したいと思います。
APIも用意されているようですが、うまく情報の取得ができなかったため、ここではウェブスクレイピングを行います。
# パッケージの読み込み library(tidyverse) # データ操作用 library(rvest) # ウェブスクレイピング library(polite) # お行儀よくウェブスクレイピングするため ### setlist.fmからセットリストを抽出する関数を定義。 setlist_fm_scraping <- function(search_list) { scrape_fun <- function(x) { scrape(bow(x, user_agent = "King Crimson Tour Setlist Analysis")) } html_list <- map(search_list, scrape_fun) link_vec <- unlist(map(html_list, ~ { html_attr(html_nodes(., css = "a[href *= 'setlist/king-crimson/']"), "href") })) extract_setlist <- function(x) { html_text(html_nodes(scrape(bow( paste0("https://www.setlist.fm/", x), user_agent = "King Crimson Tour Setlist Analysis" )), xpath = "//a[@class = 'songLabel']")) } setlists <- map(link_vec, extract_setlist) return(setlists) } ### 各ツアー毎の検索結果ページを設定 pages <- 1:4 search_list_2021 <- map_chr(pages, ~ { paste0( "https://www.setlist.fm/search?page=", ., "&query=tour:%28Music+Is+Our+Friend+2021") }) pages <- 1:6 search_list_2018 <- map_chr(pages, ~ { paste0( "https://www.setlist.fm/search?page=", ., "&query=king+crimson+Uncertain+Times+Tour") }) pages <- 1:11 search_list_2014 <- map_chr(pages, ~ { paste0( "https://www.setlist.fm/search?page=", ., "&query=tour:%28the+elements+of+king+crimson%29") }) ### 各ツアーのセットリストを抽出 # 1ページ当たり5秒間隔なのでちょっと時間がかかります setlist_2021 <- setlist_fm_scraping(search_list_2021) setlist_2018 <- setlist_fm_scraping(search_list_2018) setlist_2014 <- setlist_fm_scraping(search_list_2014) ### スクレイピングを繰り返さないでいいようにオブジェクトを保存しておく。 save(setlist_2021, setlist_2018, setlist_2014, file = "kc_setlist.RData")
前処理
分析を進める前に、見やすさのために長い曲名を短縮形にします。
library(tidyverse) load("kc_setlist.RData") # 長い曲名を短縮形に置換する関数。 song_name_shorten <- function(setlists) { res <- setlists %>% map(~ {str_replace_all(., pattern = "Larks' Tongues in Aspic, Part One", replacement = "LTIA1")}) %>% map(~ {str_replace_all(., pattern = "Larks' Tongues in Aspic, Part Two", replacement = "LTIA2")}) %>% map(~ {str_replace_all(., pattern = "21st Century Schizoid Man", replacement = "21CSM")}) %>% map(~ {str_replace_all(., pattern = "Devil Dogs of Tessellation Row", replacement = "Devil Dogs")}) %>% map(~ {str_replace_all(., pattern = "Hell Hounds of Krim", replacement = "Hell Hounds")}) %>% map(~ {str_replace_all(., pattern = "Fairy Dust of the Drumsons", replacement = "Fairy Dust")}) %>% map(~ {str_replace_all(., pattern = "One More Red Nightmare", replacement = "OMRN")}) %>% map(~ {str_replace_all(., pattern = "Suitable Grounds for the Blues", replacement = "Suitable")}) %>% map(~ {str_replace_all(., pattern = "The ConstruKction of Light", replacement = "TCOL")}) %>% map(~ {str_replace_all(., pattern = "The Court of the Crimson King", replacement = "ITCOTCK")}) %>% map(~ {str_replace_all(., pattern = "Radical Action III", replacement = "RA3")}) %>% map(~ {str_replace_all(., pattern = "Radical Action II", replacement = "RA2")}) %>% map(~ {str_replace_all(., pattern = "Radical Action \\(To Unseat the Hold of Monkey Mind\\)", replacement = "RA1")}) %>% map(~ {str_replace_all(., pattern = "Tony's Cadenza", replacement = "Tonys Cadenza")}) %>% map(~ {str_replace_all(., pattern = "Larks' Tongues in Aspic \\(Part IV\\)", replacement = "LTIA4")}) %>% map(~ {str_replace_all(., pattern = "Banshee Legs Bell Hassle", replacement = "Banshee Legs")}) %>% map(~ {str_replace_all(., pattern = "A Scarcity of Miracles", replacement = "Miracles")}) %>% map(~ {str_replace_all(., pattern = "Sailor's Tale", replacement = "Sailors Tale")}) %>% map(~ {str_remove_all(., '"')}) return(res) } setlist_2021 <- song_name_shorten(setlist_2021) setlist_2018 <- song_name_shorten(setlist_2018) setlist_2014 <- song_name_shorten(setlist_2014)
これで準備万端です。
ツアー毎に多く演奏された曲Top20
集計して割り算して棒グラフに。
song_table <- function(setlist) { t1 <- bind_rows( as_tibble(table(unlist(setlist)), .name_repair = ~ c("song_name", "freq")), tibble(song_name = c("START", "END"), freq = length(setlist)) ) t1$per <- t1$freq / length(setlist) return(t1) } table_2021 <- song_table(setlist_2021) table_2018 <- song_table(setlist_2018) table_2014 <- song_table(setlist_2014) all_table <- bind_rows( list("2021" = table_2021, "2018" = table_2018, "2014" = table_2014), .id = "year") %>% pivot_wider(names_from = year, values_from = freq, values_fill = 0) %>% pivot_longer(names_to = "year", cols=matches("\\d{4}"), values_to = "freq") top20 <- all_table %>% filter(!song_name %in% c("START", "END")) %>% group_by(year) %>% arrange(desc(per)) %>% top_n(20) g2014 <- top20 %>% filter(year == 2014) %>% ggplot(aes(x = reorder(song_name, per), y = per)) + geom_bar(stat = "identity", position = "dodge", color="black", fill="red") + coord_flip() + labs(title="2014", x="曲目", y="演奏割合") g2018 <- top20 %>% filter(year == 2018) %>% ggplot(aes(x = reorder(song_name, per), y = per)) + geom_bar(stat = "identity", position = "dodge", color="black", fill="green") + coord_flip() + labs(title="2018", x="曲目", y="演奏割合") g2021 <- top20 %>% filter(year == 2021) %>% ggplot(aes(x = reorder(song_name, per), y = per)) + geom_bar(stat = "identity", position = "dodge", color="black", fill="blue") + coord_flip() + labs(title="2021", x="曲目", y="演奏割合") library(gridExtra) grid.arrange(g2014, g2018, g2021, nrow = 1)
楽曲の共起分析
どの曲とどの曲が同じ日に演奏されやすいか。
ここではコサイン類似度で一緒に演奏されやすさを見ている。
exaxt_cor <- function(setlist) { ref <- unique(reduce(setlist, c)) res <- as.matrix(map_dfr(setlist, ~{setNames(as.integer(ref %in% .), ref)})) return(res) } cor_2014 <- exaxt_cor(setlist_2014) cor_2018 <- exaxt_cor(setlist_2018) cor_2021 <- exaxt_cor(setlist_2021) # コサイン類似度マトリクスで library(lsa) cm2014 <- cosine(cor_2014) cm2018 <- cosine(cor_2018) cm2021 <- cosine(cor_2021) library(corrplot) corrplot(cm2014, order="hclust", hclust.method="ward.D", addrect = 6) corrplot(cm2018, order="hclust", hclust.method="ward.D", addrect = 7) corrplot(cm2021, order="hclust", hclust.method="ward.D", addrect = 6)
曲順分析
ここはコードがだいぶ汚い……
セットリストからグラフのノードとエッジを設定しDOT言語のコードを吐き出す。
# セットリストのグラフ化 vec2graph <- function(x) { LEN <- length(x) data.frame( from = c("START", x), to = c(x, "END") ) } # どのツアーか設定する setlists <- setlist_2014 tb <- table_2014 # setlists <- setlist_2018 # tb <- table_2018 # setlists <- setlist_2021 # tb <- table_2021 setlist_df <- setlists %>% map_dfr(vec2graph) %>% group_by(from, to) %>% summarise(n = n()) %>% mutate(m = sum(n)) %>% ungroup() %>% mutate(per = round(n / m * 100, 0)) %>% select(from, to, per) library(DiagrammeR) nodes_df <- create_node_df( n = nrow(tb), type = "song", label = tb$song_name, shape = "ellipse", value = tb$per ) for_edges_df <- setlist_df %>% left_join(nodes_df, by = c("from" = "label")) %>% left_join(nodes_df, by = c("to" = "label")) %>% select(id.x, id.y, per) edges_df <- create_edge_df( from = for_edges_df$id.x, to = for_edges_df$id.y, rel = "a", width = for_edges_df$per ) %>% filter(width > 20) #ここでエッジの足切り graph <- create_graph( nodes_df = nodes_df, edges_df = edges_df ) %>% set_edge_attrs( edge_attr = color, values = "blue" ) %>% set_edge_attrs( edge_attr = label, values = edges_df$width ) %>% set_edge_attrs( edge_attr = penwidth, values = edges_df$width / 10 ) %>% set_edge_attrs( edge_attr = fontsize, values = 14) %>% set_node_attrs( node_attr = color, values = "blue" ) %>% set_node_attrs( node_attr = fillcolor, values = case_when( nodes_df$value > 66 ~ "lightpink", nodes_df$value > 33 ~ "yellow", nodes_df$value > 0 ~ "lightblue", TRUE ~ "black" ) ) %>% set_node_attrs( node_attr = fontcolor, values = "black") %>% set_node_attrs( node_attr = fontsize, values = 14) %>% set_node_attrs( node_attr = fixedsize, values = "false") graph %>% render_graph() graph %>% generate_dot() %>% cat()
ツアー毎にDOT言語で微調整し描画する。
2015
#2014 grViz( diagram = " digraph { graph [rankdir = TB, outputorder = 'edgesfirst', bgcolor = 'white'] node [fontname = 'Helvetica', fontsize = '10', shape = 'circle', fixedsize = 'true', width = '0.5', style = 'filled', fillcolor = 'aliceblue', color = 'gray70', fontcolor = 'gray50'] edge [fontname = 'Helvetica', fontsize = '8', len = '1.5', color = 'gray80', arrowsize = '0.5'] '1' [label = '21CSM', shape = 'ellipse', color = 'blue', fillcolor = 'lightpink', fontcolor = 'black', fontsize = '14', fixedsize = 'false'] '2' [label = 'Banshee Legs', shape = 'ellipse', color = 'blue', fillcolor = 'lightpink', fontcolor = 'black', fontsize = '14', fixedsize = 'false'] '3' [label = 'Cirkus', shape = 'ellipse', color = 'blue', fillcolor = 'yellow', fontcolor = 'black', fontsize = '14', fixedsize = 'false'] '4' [label = 'Coda: Marine 475', shape = 'ellipse', color = 'blue', fillcolor = 'lightblue', fontcolor = 'black', fontsize = '14', fixedsize = 'false'] '5' [label = 'Devil Dogs', shape = 'ellipse', color = 'blue', fillcolor = 'yellow', fontcolor = 'black', fontsize = '14', fixedsize = 'false'] '6' [label = 'Easy Money', shape = 'ellipse', color = 'blue', fillcolor = 'lightpink', fontcolor = 'black', fontsize = '14', fixedsize = 'false'] '7' [label = 'Epitaph', shape = 'ellipse', color = 'blue', fillcolor = 'lightpink', fontcolor = 'black', fontsize = '14', fixedsize = 'false'] '8' [label = 'Fairy Dust', shape = 'ellipse', color = 'blue', fillcolor = 'lightblue', fontcolor = 'black', fontsize = '14', fixedsize = 'false'] '9' [label = 'Fracture', shape = 'ellipse', color = 'blue', fillcolor = 'lightblue', fontcolor = 'black', fontsize = '14', fixedsize = 'false'] '10' [label = 'Hell Hounds', shape = 'ellipse', color = 'blue', fillcolor = 'lightpink', fontcolor = 'black', fontsize = '14', fixedsize = 'false'] '11' [label = 'Heroes', shape = 'ellipse', color = 'blue', fillcolor = 'lightblue', fontcolor = 'black', fontsize = '14', fixedsize = 'false'] '12' [label = 'Hoodoo', shape = 'ellipse', color = 'blue', fillcolor = 'lightblue', fontcolor = 'black', fontsize = '14', fixedsize = 'false'] '13' [label = 'Indiscipline', shape = 'ellipse', color = 'blue', fillcolor = 'lightblue', fontcolor = 'black', fontsize = '14', fixedsize = 'false'] '14' [label = 'Interlude', shape = 'ellipse', color = 'blue', fillcolor = 'yellow', fontcolor = 'black', fontsize = '14', fixedsize = 'false'] '15' [label = 'ITCOTCK', shape = 'ellipse', color = 'blue', fillcolor = 'lightpink', fontcolor = 'black', fontsize = '14', fixedsize = 'false'] '16' [label = 'Level Five', shape = 'ellipse', color = 'blue', fillcolor = 'lightpink', fontcolor = 'black', fontsize = '14', fixedsize = 'false'] '17' [label = 'Lizard', shape = 'ellipse', color = 'blue', fillcolor = 'yellow', fontcolor = 'black', fontsize = '14', fixedsize = 'false'] '18' [label = 'LTIA1', shape = 'ellipse', color = 'blue', fillcolor = 'lightpink', fontcolor = 'black', fontsize = '14', fixedsize = 'false'] '19' [label = 'LTIA2', shape = 'ellipse', color = 'blue', fillcolor = 'lightpink', fontcolor = 'black', fontsize = '14', fixedsize = 'false'] '20' [label = 'Magic Sprinkles', shape = 'ellipse', color = 'blue', fillcolor = 'lightblue', fontcolor = 'black', fontsize = '14', fixedsize = 'false'] '21' [label = 'Meltdown', shape = 'ellipse', color = 'blue', fillcolor = 'lightpink', fontcolor = 'black', fontsize = '14', fixedsize = 'false'] '22' [label = 'Miracles', shape = 'ellipse', color = 'blue', fillcolor = 'yellow', fontcolor = 'black', fontsize = '14', fixedsize = 'false'] '23' [label = 'OMRN', shape = 'ellipse', color = 'blue', fillcolor = 'yellow', fontcolor = 'black', fontsize = '14', fixedsize = 'false'] '24' [label = 'Peace: An End', shape = 'ellipse', color = 'blue', fillcolor = 'lightblue', fontcolor = 'black', fontsize = '14', fixedsize = 'false'] '25' [label = 'Pictures of a City', shape = 'ellipse', color = 'blue', fillcolor = 'lightpink', fontcolor = 'black', fontsize = '14', fixedsize = 'false'] '26' [label = 'RA1', shape = 'ellipse', color = 'blue', fillcolor = 'lightpink', fontcolor = 'black', fontsize = '14', fixedsize = 'false'] '27' [label = 'RA2', shape = 'ellipse', color = 'blue', fillcolor = 'yellow', fontcolor = 'black', fontsize = '14', fixedsize = 'false'] '28' [label = 'Red', shape = 'ellipse', color = 'blue', fillcolor = 'lightpink', fontcolor = 'black', fontsize = '14', fixedsize = 'false'] '29' [label = 'Sailors Tale', shape = 'ellipse', color = 'blue', fillcolor = 'yellow', fontcolor = 'black', fontsize = '14', fixedsize = 'false'] '30' [label = 'Starless', shape = 'ellipse', color = 'blue', fillcolor = 'lightpink', fontcolor = 'black', fontsize = '14', fixedsize = 'false'] '31' [label = 'Suitable', shape = 'ellipse', color = 'blue', fillcolor = 'yellow', fontcolor = 'black', fontsize = '14', fixedsize = 'false'] '32' [label = 'TCOL', shape = 'ellipse', color = 'blue', fillcolor = 'lightpink', fontcolor = 'black', fontsize = '14', fixedsize = 'false'] '33' [label = 'The Letters', shape = 'ellipse', color = 'blue', fillcolor = 'lightpink', fontcolor = 'black', fontsize = '14', fixedsize = 'false'] '34' [label = 'The Light of Day', shape = 'ellipse', color = 'blue', fillcolor = 'lightblue', fontcolor = 'black', fontsize = '14', fixedsize = 'false'] '35' [label = 'The Talking Drum', shape = 'ellipse', color = 'blue', fillcolor = 'lightpink', fontcolor = 'black', fontsize = '14', fixedsize = 'false'] '36' [label = 'VROOOM', shape = 'ellipse', color = 'blue', fillcolor = 'yellow', fontcolor = 'black', fontsize = '14', fixedsize = 'false'] '37' [label = 'START', shape = 'box', color = 'blue', fillcolor = 'blue', fontcolor = 'white', fontsize = '14', fixedsize = 'false', style = 'bold,filled'] '38' [label = 'END', shape = 'box', color = 'blue', fillcolor = 'blue', fontcolor = 'white', fontsize = '14', fixedsize = 'false', style = 'bold,filled'] '1'->'38' [color = 'blue', label = '95', penwidth = '9.5', fontsize = '14'] '2'->'6' [color = 'blue', label = '33', penwidth = '3.3', fontsize = '14'] '3'->'9' [color = 'blue', label = '52', penwidth = '5.2', fontsize = '14'] '4'->'2' [color = 'blue', label = '21', penwidth = '2.1', fontsize = '14'] '4'->'22' [color = 'blue', label = '36', penwidth = '3.6', fontsize = '14'] '4'->'34' [color = 'blue', label = '21', penwidth = '2.1', fontsize = '14'] '5'->'15' [color = 'blue', label = '40', penwidth = '4', fontsize = '14'] '6'->'33' [color = 'blue', label = '25', penwidth = '2.5', fontsize = '14'] '7'->'2' [color = 'blue', label = '28', penwidth = '2.8', fontsize = '14'] '8'->'17' [color = 'blue', label = '25', penwidth = '2.5', fontsize = '14'] '8'->'24' [color = 'blue', label = '33', penwidth = '3.3', fontsize = '14'] '9'->'33' [color = 'blue', label = '32', penwidth = '3.2', fontsize = '14'] '10'->'32' [color = 'blue', label = '24', penwidth = '2.4', fontsize = '14'] '11'->'1' [color = 'blue', label = '94', penwidth = '9.4', fontsize = '14'] '12'->'1' [color = 'blue', label = '75', penwidth = '7.5', fontsize = '14'] '13'->'15' [color = 'blue', label = '43', penwidth = '4.3', fontsize = '14'] '14'->'33' [color = 'blue', label = '30', penwidth = '3', fontsize = '14'] '15'->'1' [color = 'blue', label = '45', penwidth = '4.5', fontsize = '14'] '16'->'7' [color = 'blue', label = '26', penwidth = '2.6', fontsize = '14'] '17'->'27' [color = 'blue', label = '46', penwidth = '4.6', fontsize = '14'] '18'->'25' [color = 'blue', label = '71', penwidth = '7.1', fontsize = '14'] '19'->'30' [color = 'blue', label = '58', penwidth = '5.8', fontsize = '14'] '20'->'17' [color = 'blue', label = '29', penwidth = '2.9', fontsize = '14'] '21'->'10' [color = 'blue', label = '27', penwidth = '2.7', fontsize = '14'] '21'->'27' [color = 'blue', label = '23', penwidth = '2.3', fontsize = '14'] '23'->'30' [color = 'blue', label = '39', penwidth = '3.9', fontsize = '14'] '24'->'26' [color = 'blue', label = '26', penwidth = '2.6', fontsize = '14'] '25'->'3' [color = 'blue', label = '22', penwidth = '2.2', fontsize = '14'] '26'->'21' [color = 'blue', label = '100', penwidth = '10', fontsize = '14'] '27'->'16' [color = 'blue', label = '85', penwidth = '8.5', fontsize = '14'] '30'->'2' [color = 'blue', label = '30', penwidth = '3', fontsize = '14'] '30'->'5' [color = 'blue', label = '32', penwidth = '3.2', fontsize = '14'] '37'->'10' [color = 'blue', label = '24', penwidth = '2.4', fontsize = '14'] '37'->'18' [color = 'blue', label = '60', penwidth = '6', fontsize = '14'] '32'->'16' [color = 'blue', label = '22', penwidth = '2.2', fontsize = '14'] '33'->'29' [color = 'blue', label = '61', penwidth = '6.1', fontsize = '14'] '34'->'35' [color = 'blue', label = '48', penwidth = '4.8', fontsize = '14'] '35'->'19' [color = 'blue', label = '100', penwidth = '10', fontsize = '14'] '36'->'4' [color = 'blue', label = '30', penwidth = '3', fontsize = '14'] {rank = min; 37;} {rank = same; 17; 24; 18; 28; 31;} {rank = same; 25; 26; 36;} {rank = same; 4; 21; 3;} {rank = same; 22; 34; 27; 10; 9;} {rank = same; 35; 32;} {rank = max; 38;} } " )
2018
grViz( diagram = " digraph { graph [rankdir = TB, outputorder = 'edgesfirst', bgcolor = 'white'] node [fontname = 'Helvetica', fontsize = '10', shape = 'circle', fixedsize = 'true', width = '0.5', style = 'filled', fillcolor = 'aliceblue', color = 'gray70', fontcolor = 'gray50'] edge [fontname = 'Helvetica', fontsize = '8', len = '1.5', color = 'gray80', arrowsize = '0.5'] '1' [label = '21CSM', shape = 'ellipse', color = 'blue', fillcolor = 'lightpink', fontcolor = 'black', fontsize = '14', fixedsize = 'false'] '2' [label = 'Banshee Legs', shape = 'ellipse', color = 'blue', fillcolor = 'lightblue', fontcolor = 'black', fontsize = '14', fixedsize = 'false'] '3' [label = 'Breathless', shape = 'ellipse', color = 'blue', fillcolor = 'lightblue', fontcolor = 'black', fontsize = '14', fixedsize = 'false'] '4' [label = 'Cadence and Cascade', shape = 'ellipse', color = 'blue', fillcolor = 'yellow', fontcolor = 'black', fontsize = '14', fixedsize = 'false'] '5' [label = 'CatalytiKc No. 9', shape = 'ellipse', color = 'blue', fillcolor = 'lightblue', fontcolor = 'black', fontsize = '14', fixedsize = 'false'] '6' [label = 'Cirkus', shape = 'ellipse', color = 'blue', fillcolor = 'lightpink', fontcolor = 'black', fontsize = '14', fixedsize = 'false'] '7' [label = 'Devil Dogs', shape = 'ellipse', color = 'blue', fillcolor = 'yellow', fontcolor = 'black', fontsize = '14', fixedsize = 'false'] '8' [label = 'Discipline', shape = 'ellipse', color = 'blue', fillcolor = 'lightpink', fontcolor = 'black', fontsize = '14', fixedsize = 'false'] '9' [label = 'Drumsons', shape = 'ellipse', color = 'blue', fillcolor = 'lightblue', fontcolor = 'black', fontsize = '14', fixedsize = 'false'] '10' [label = 'Easy Money', shape = 'ellipse', color = 'blue', fillcolor = 'lightpink', fontcolor = 'black', fontsize = '14', fixedsize = 'false'] '11' [label = 'Epitaph', shape = 'ellipse', color = 'blue', fillcolor = 'lightpink', fontcolor = 'black', fontsize = '14', fixedsize = 'false'] '12' [label = 'Fairy Dust', shape = 'ellipse', color = 'blue', fillcolor = 'lightblue', fontcolor = 'black', fontsize = '14', fixedsize = 'false'] '13' [label = 'Fallen Angel', shape = 'ellipse', color = 'blue', fillcolor = 'lightblue', fontcolor = 'black', fontsize = '14', fixedsize = 'false'] '14' [label = 'Fracture', shape = 'ellipse', color = 'blue', fillcolor = 'lightblue', fontcolor = 'black', fontsize = '14', fixedsize = 'false'] '15' [label = 'Hell Hounds', shape = 'ellipse', color = 'blue', fillcolor = 'lightpink', fontcolor = 'black', fontsize = '14', fixedsize = 'false'] '16' [label = 'Indiscipline', shape = 'ellipse', color = 'blue', fillcolor = 'lightpink', fontcolor = 'black', fontsize = '14', fixedsize = 'false'] '17' [label = 'Interlude', shape = 'ellipse', color = 'blue', fillcolor = 'lightblue', fontcolor = 'black', fontsize = '14', fixedsize = 'false'] '18' [label = 'Islands', shape = 'ellipse', color = 'blue', fillcolor = 'lightpink', fontcolor = 'black', fontsize = '14', fixedsize = 'false'] '19' [label = 'ITCOTCK', shape = 'ellipse', color = 'blue', fillcolor = 'lightpink', fontcolor = 'black', fontsize = '14', fixedsize = 'false'] '20' [label = 'Level Five', shape = 'ellipse', color = 'blue', fillcolor = 'lightpink', fontcolor = 'black', fontsize = '14', fixedsize = 'false'] '21' [label = 'Lizard', shape = 'ellipse', color = 'blue', fillcolor = 'lightpink', fontcolor = 'black', fontsize = '14', fixedsize = 'false'] '22' [label = 'LTIA1', shape = 'ellipse', color = 'blue', fillcolor = 'yellow', fontcolor = 'black', fontsize = '14', fixedsize = 'false'] '23' [label = 'LTIA2', shape = 'ellipse', color = 'blue', fillcolor = 'lightpink', fontcolor = 'black', fontsize = '14', fixedsize = 'false'] '24' [label = 'LTIA4', shape = 'ellipse', color = 'blue', fillcolor = 'yellow', fontcolor = 'black', fontsize = '14', fixedsize = 'false'] '25' [label = 'Meltdown', shape = 'ellipse', color = 'blue', fillcolor = 'lightpink', fontcolor = 'black', fontsize = '14', fixedsize = 'false'] '26' [label = 'Moonchild', shape = 'ellipse', color = 'blue', fillcolor = 'lightpink', fontcolor = 'black', fontsize = '14', fixedsize = 'false'] '27' [label = 'Neurotica', shape = 'ellipse', color = 'blue', fillcolor = 'lightpink', fontcolor = 'black', fontsize = '14', fixedsize = 'false'] '28' [label = 'OMRN', shape = 'ellipse', color = 'blue', fillcolor = 'yellow', fontcolor = 'black', fontsize = '14', fixedsize = 'false'] '29' [label = 'Peace: An End', shape = 'ellipse', color = 'blue', fillcolor = 'yellow', fontcolor = 'black', fontsize = '14', fixedsize = 'false'] '30' [label = 'Pictures of a City', shape = 'ellipse', color = 'blue', fillcolor = 'lightblue', fontcolor = 'black', fontsize = '14', fixedsize = 'false'] '31' [label = 'RA1', shape = 'ellipse', color = 'blue', fillcolor = 'yellow', fontcolor = 'black', fontsize = '14', fixedsize = 'false'] '32' [label = 'RA2', shape = 'ellipse', color = 'blue', fillcolor = 'lightpink', fontcolor = 'black', fontsize = '14', fixedsize = 'false'] '33' [label = 'RA3', shape = 'ellipse', color = 'blue', fillcolor = 'lightpink', fontcolor = 'black', fontsize = '14', fixedsize = 'false'] '34' [label = 'Red', shape = 'ellipse', color = 'blue', fillcolor = 'yellow', fontcolor = 'black', fontsize = '14', fixedsize = 'false'] '35' [label = 'Sailors Tale', shape = 'ellipse', color = 'blue', fillcolor = 'lightblue', fontcolor = 'black', fontsize = '14', fixedsize = 'false'] '36' [label = 'Starless', shape = 'ellipse', color = 'blue', fillcolor = 'lightpink', fontcolor = 'black', fontsize = '14', fixedsize = 'false'] '37' [label = 'Suitable', shape = 'ellipse', color = 'blue', fillcolor = 'yellow', fontcolor = 'black', fontsize = '14', fixedsize = 'false'] '38' [label = 'TCOL', shape = 'ellipse', color = 'blue', fillcolor = 'lightblue', fontcolor = 'black', fontsize = '14', fixedsize = 'false'] '39' [label = 'The Errors', shape = 'ellipse', color = 'blue', fillcolor = 'lightblue', fontcolor = 'black', fontsize = '14', fixedsize = 'false'] '40' [label = 'The Letters', shape = 'ellipse', color = 'blue', fillcolor = 'lightblue', fontcolor = 'black', fontsize = '14', fixedsize = 'false'] '41' [label = 'START', shape = 'box', color = 'blue', fillcolor = 'blue', fontcolor = 'white', fontsize = '14', fixedsize = 'false'] '42' [label = 'END', shape = 'box', color = 'blue', fillcolor = 'blue', fontcolor = 'white', fontsize = '14', fixedsize = 'false'] '1'->'42' [color = 'blue', label = '95', penwidth = '9.5', fontsize = '14'] '2'->'6' [color = 'blue', label = '50', penwidth = '5', fontsize = '14'] '2'->'16' [color = 'blue', label = '50', penwidth = '5', fontsize = '14'] '3'->'1' [color = 'blue', label = '25', penwidth = '2.5', fontsize = '14'] '3'->'11' [color = 'blue', label = '50', penwidth = '5', fontsize = '14'] '3'->'13' [color = 'blue', label = '25', penwidth = '2.5', fontsize = '14'] '5'->'29' [color = 'blue', label = '50', penwidth = '5', fontsize = '14'] '5'->'38' [color = 'blue', label = '50', penwidth = '5', fontsize = '14'] '6'->'21' [color = 'blue', label = '92', penwidth = '9.2', fontsize = '14'] '7'->'8' [color = 'blue', label = '23', penwidth = '2.3', fontsize = '14'] '8'->'16' [color = 'blue', label = '37', penwidth = '3.7', fontsize = '14'] '9'->'8' [color = 'blue', label = '22', penwidth = '2.2', fontsize = '14'] '9'->'29' [color = 'blue', label = '22', penwidth = '2.2', fontsize = '14'] '9'->'37' [color = 'blue', label = '33', penwidth = '3.3', fontsize = '14'] '10'->'23' [color = 'blue', label = '33', penwidth = '3.3', fontsize = '14'] '11'->'10' [color = 'blue', label = '33', penwidth = '3.3', fontsize = '14'] '12'->'16' [color = 'blue', label = '25', penwidth = '2.5', fontsize = '14'] '12'->'28' [color = 'blue', label = '25', penwidth = '2.5', fontsize = '14'] '12'->'33' [color = 'blue', label = '25', penwidth = '2.5', fontsize = '14'] '12'->'36' [color = 'blue', label = '25', penwidth = '2.5', fontsize = '14'] '13'->'34' [color = 'blue', label = '38', penwidth = '3.8', fontsize = '14'] '14'->'16' [color = 'blue', label = '50', penwidth = '5', fontsize = '14'] '14'->'18' [color = 'blue', label = '50', penwidth = '5', fontsize = '14'] '15'->'8' [color = 'blue', label = '32', penwidth = '3.2', fontsize = '14'] '15'->'27' [color = 'blue', label = '41', penwidth = '4.1', fontsize = '14'] '17'->'4' [color = 'blue', label = '50', penwidth = '5', fontsize = '14'] '17'->'11' [color = 'blue', label = '50', penwidth = '5', fontsize = '14'] '20'->'18' [color = 'blue', label = '25', penwidth = '2.5', fontsize = '14'] '20'->'36' [color = 'blue', label = '33', penwidth = '3.3', fontsize = '14'] '21'->'11' [color = 'blue', label = '21', penwidth = '2.1', fontsize = '14'] '22'->'27' [color = 'blue', label = '37', penwidth = '3.7', fontsize = '14'] '22'->'29' [color = 'blue', label = '22', penwidth = '2.2', fontsize = '14'] '23'->'36' [color = 'blue', label = '33', penwidth = '3.3', fontsize = '14'] '24'->'18' [color = 'blue', label = '21', penwidth = '2.1', fontsize = '14'] '25'->'32' [color = 'blue', label = '92', penwidth = '9.2', fontsize = '14'] '26'->'19' [color = 'blue', label = '96', penwidth = '9.6', fontsize = '14'] '28'->'34' [color = 'blue', label = '32', penwidth = '3.2', fontsize = '14'] '29'->'30' [color = 'blue', label = '48', penwidth = '4.8', fontsize = '14'] '30'->'4' [color = 'blue', label = '30', penwidth = '3', fontsize = '14'] '31'->'25' [color = 'blue', label = '42', penwidth = '4.2', fontsize = '14'] '31'->'33' [color = 'blue', label = '53', penwidth = '5.3', fontsize = '14'] '32'->'20' [color = 'blue', label = '98', penwidth = '9.8', fontsize = '14'] '33'->'25' [color = 'blue', label = '80', penwidth = '8', fontsize = '14'] '34'->'28' [color = 'blue', label = '32', penwidth = '3.2', fontsize = '14'] '35'->'26' [color = 'blue', label = '100', penwidth = '10', fontsize = '14'] '36'->'1' [color = 'blue', label = '63', penwidth = '6.3', fontsize = '14'] '36'->'42' [color = 'blue', label = '32', penwidth = '3.2', fontsize = '14'] '41'->'15' [color = 'blue', label = '53', penwidth = '5.3', fontsize = '14'] '41'->'22' [color = 'blue', label = '45', penwidth = '4.5', fontsize = '14'] '39'->'33' [color = 'blue', label = '50', penwidth = '5', fontsize = '14'] '39'->'34' [color = 'blue', label = '50', penwidth = '5', fontsize = '14'] {rank = min; 41;} {rank = same; 37; 38;} {rank = same; 2; 8; 14; 27; 29;} {rank = same; 35; 32;} {rank = max; 42;} } " )
2021
grViz( diagram = " digraph { graph [rankdir=TB, outputorder = 'edgesfirst', bgcolor = 'white'] node [fontname = 'Helvetica', fontsize = '10', shape = 'circle', fixedsize = 'true', width = '0.5', style = 'filled', fillcolor = 'aliceblue', color = 'gray70', fontcolor = 'gray50'] edge [fontname = 'Helvetica', fontsize = '8', len = '1.5', color = 'gray80', arrowsize = '0.5'] '1' [label = '21CSM', shape = 'ellipse', color = 'blue', fillcolor = 'lightpink', fontcolor = 'black', fontsize = '14', fixedsize = 'false'] '2' [label = 'Cirkus', shape = 'ellipse', color = 'blue', fillcolor = 'lightblue', fontcolor = 'black', fontsize = '14', fixedsize = 'false'] '3' [label = 'Devil Dogs', shape = 'ellipse', color = 'blue', fillcolor = 'lightblue', fontcolor = 'black', fontsize = '14', fixedsize = 'false'] '4' [label = 'Discipline', shape = 'ellipse', color = 'blue', fillcolor = 'lightblue', fontcolor = 'black', fontsize = '14', fixedsize = 'false'] '5' [label = 'Drumsons', shape = 'ellipse', color = 'blue', fillcolor = 'lightblue', fontcolor = 'black', fontsize = '14', fixedsize = 'false'] '6' [label = 'Drumzilla', shape = 'ellipse', color = 'blue', fillcolor = 'yellow', fontcolor = 'black', fontsize = '14', fixedsize = 'false'] '7' [label = 'Epitaph', shape = 'ellipse', color = 'blue', fillcolor = 'lightpink', fontcolor = 'black', fontsize = '14', fixedsize = 'false'] '8' [label = 'Fairy Dust', shape = 'ellipse', color = 'blue', fillcolor = 'lightblue', fontcolor = 'black', fontsize = '14', fixedsize = 'false'] '9' [label = 'Hell Hounds', shape = 'ellipse', color = 'blue', fillcolor = 'lightblue', fontcolor = 'black', fontsize = '14', fixedsize = 'false'] '10' [label = 'Indiscipline', shape = 'ellipse', color = 'blue', fillcolor = 'lightpink', fontcolor = 'black', fontsize = '14', fixedsize = 'false'] '11' [label = 'Islands', shape = 'ellipse', color = 'blue', fillcolor = 'lightpink', fontcolor = 'black', fontsize = '14', fixedsize = 'false'] '12' [label = 'ITCOTCK', shape = 'ellipse', color = 'blue', fillcolor = 'lightpink', fontcolor = 'black', fontsize = '14', fixedsize = 'false'] '13' [label = 'Level Five', shape = 'ellipse', color = 'blue', fillcolor = 'lightpink', fontcolor = 'black', fontsize = '14', fixedsize = 'false'] '14' [label = 'Lizard', shape = 'ellipse', color = 'blue', fillcolor = 'lightblue', fontcolor = 'black', fontsize = '14', fixedsize = 'false'] '15' [label = 'LTIA1', shape = 'ellipse', color = 'blue', fillcolor = 'yellow', fontcolor = 'black', fontsize = '14', fixedsize = 'false'] '16' [label = 'LTIA2', shape = 'ellipse', color = 'blue', fillcolor = 'lightblue', fontcolor = 'black', fontsize = '14', fixedsize = 'false'] '17' [label = 'Moonchild', shape = 'ellipse', color = 'blue', fillcolor = 'lightblue', fontcolor = 'black', fontsize = '14', fixedsize = 'false'] '18' [label = 'Neurotica', shape = 'ellipse', color = 'blue', fillcolor = 'yellow', fontcolor = 'black', fontsize = '14', fixedsize = 'false'] '19' [label = 'OMRN', shape = 'ellipse', color = 'blue', fillcolor = 'lightpink', fontcolor = 'black', fontsize = '14', fixedsize = 'false'] '20' [label = 'Peace: A Beginning', shape = 'ellipse', color = 'blue', fillcolor = 'lightblue', fontcolor = 'black', fontsize = '14', fixedsize = 'false'] '21' [label = 'Peace: An End', shape = 'ellipse', color = 'blue', fillcolor = 'lightblue', fontcolor = 'black', fontsize = '14', fixedsize = 'false'] '22' [label = 'Pictures of a City', shape = 'ellipse', color = 'blue', fillcolor = 'lightpink', fontcolor = 'black', fontsize = '14', fixedsize = 'false'] '23' [label = 'RA2', shape = 'ellipse', color = 'blue', fillcolor = 'lightpink', fontcolor = 'black', fontsize = '14', fixedsize = 'false'] '24' [label = 'Red', shape = 'ellipse', color = 'blue', fillcolor = 'lightpink', fontcolor = 'black', fontsize = '14', fixedsize = 'false'] '25' [label = 'Starless', shape = 'ellipse', color = 'blue', fillcolor = 'lightpink', fontcolor = 'black', fontsize = '14', fixedsize = 'false'] '26' [label = 'Suitable', shape = 'ellipse', color = 'blue', fillcolor = 'lightblue', fontcolor = 'black', fontsize = '14', fixedsize = 'false'] '27' [label = 'TCOL', shape = 'ellipse', color = 'blue', fillcolor = 'lightblue', fontcolor = 'black', fontsize = '14', fixedsize = 'false'] '28' [label = 'Tonys Cadenza', shape = 'ellipse', color = 'blue', fillcolor = 'lightpink', fontcolor = 'black', fontsize = '14', fixedsize = 'false'] '29' [label = 'START', shape = 'box', color = 'blue', fillcolor = 'blue', fontcolor = 'white', fontsize = '14', fixedsize = 'false'] '30' [label = 'END', shape = 'box', color = 'blue', fillcolor = 'blue', fontcolor = 'white', fontsize = '14', fixedsize = 'false'] '1'->'30' [color = 'blue', label = '88', penwidth = '8.8', fontsize = '14'] '2'->'7' [color = 'blue', label = '25', penwidth = '2.5', fontsize = '14'] '2'->'14' [color = 'blue', label = '25', penwidth = '2.5', fontsize = '14'] '2'->'23' [color = 'blue', label = '25', penwidth = '2.5', fontsize = '14'] '2'->'24' [color = 'blue', label = '25', penwidth = '2.5', fontsize = '14'] '3'->'15' [color = 'blue', label = '33', penwidth = '3.3', fontsize = '14'] '3'->'22' [color = 'blue', label = '56', penwidth = '5.6', fontsize = '14'] '4'->'10' [color = 'blue', label = '33', penwidth = '3.3', fontsize = '14'] '4'->'16' [color = 'blue', label = '25', penwidth = '2.5', fontsize = '14'] '5'->'22' [color = 'blue', label = '80', penwidth = '8', fontsize = '14'] '6'->'22' [color = 'blue', label = '47', penwidth = '4.7', fontsize = '14'] '7'->'19' [color = 'blue', label = '27', penwidth = '2.7', fontsize = '14'] '8'->'22' [color = 'blue', label = '100', penwidth = '10', fontsize = '14'] '9'->'15' [color = 'blue', label = '25', penwidth = '2.5', fontsize = '14'] '9'->'22' [color = 'blue', label = '50', penwidth = '5', fontsize = '14'] '10'->'11' [color = 'blue', label = '22', penwidth = '2.2', fontsize = '14'] '10'->'25' [color = 'blue', label = '32', penwidth = '3.2', fontsize = '14'] '11'->'10' [color = 'blue', label = '21', penwidth = '2.1', fontsize = '14'] '11'->'23' [color = 'blue', label = '28', penwidth = '2.8', fontsize = '14'] '12'->'23' [color = 'blue', label = '23', penwidth = '2.3', fontsize = '14'] '13'->'25' [color = 'blue', label = '49', penwidth = '4.9', fontsize = '14'] '14'->'11' [color = 'blue', label = '33', penwidth = '3.3', fontsize = '14'] '14'->'23' [color = 'blue', label = '67', penwidth = '6.7', fontsize = '14'] '15'->'22' [color = 'blue', label = '31', penwidth = '3.1', fontsize = '14'] '16'->'11' [color = 'blue', label = '50', penwidth = '5', fontsize = '14'] '17'->'1' [color = 'blue', label = '33', penwidth = '3.3', fontsize = '14'] '17'->'23' [color = 'blue', label = '33', penwidth = '3.3', fontsize = '14'] '17'->'28' [color = 'blue', label = '33', penwidth = '3.3', fontsize = '14'] '18'->'10' [color = 'blue', label = '28', penwidth = '2.8', fontsize = '14'] '18'->'24' [color = 'blue', label = '22', penwidth = '2.2', fontsize = '14'] '19'->'10' [color = 'blue', label = '22', penwidth = '2.2', fontsize = '14'] '19'->'28' [color = 'blue', label = '59', penwidth = '5.9', fontsize = '14'] '20'->'19' [color = 'blue', label = '50', penwidth = '5', fontsize = '14'] '20'->'22' [color = 'blue', label = '50', penwidth = '5', fontsize = '14'] '21'->'16' [color = 'blue', label = '29', penwidth = '2.9', fontsize = '14'] '21'->'22' [color = 'blue', label = '43', penwidth = '4.3', fontsize = '14'] '22'->'7' [color = 'blue', label = '30', penwidth = '3', fontsize = '14'] '22'->'12' [color = 'blue', label = '39', penwidth = '3.9', fontsize = '14'] '23'->'13' [color = 'blue', label = '100', penwidth = '10', fontsize = '14'] '24'->'7' [color = 'blue', label = '24', penwidth = '2.4', fontsize = '14'] '24'->'19' [color = 'blue', label = '30', penwidth = '3', fontsize = '14'] '25'->'1' [color = 'blue', label = '81', penwidth = '8.1', fontsize = '14'] '29'->'3' [color = 'blue', label = '24', penwidth = '2.4', fontsize = '14'] '29'->'6' [color = 'blue', label = '24', penwidth = '2.4', fontsize = '14'] '29'->'9' [color = 'blue', label = '32', penwidth = '3.2', fontsize = '14'] '26'->'12' [color = 'blue', label = '33', penwidth = '3.3', fontsize = '14'] '26'->'19' [color = 'blue', label = '33', penwidth = '3.3', fontsize = '14'] '26'->'24' [color = 'blue', label = '33', penwidth = '3.3', fontsize = '14'] '27'->'23' [color = 'blue', label = '27', penwidth = '2.7', fontsize = '14'] {rank = min; 29;} {rank = max; 30;} } ")