けものフレンズ公式サイト「けもフレ図鑑」に掲載の80種類のキャラクターおよびキャラ名画像をRで処理して得られた各カラーコードから、キャラクターは出現数上位9位、キャラクター名は出現数1位をカラーパレットとしました。紹介コマンドをコピー後にRStudioを利用し「ui.R」と「server.R」を用意、メニューのRun Appを実行で動作します。
・けものフレンズ公式サイト
http://kemono-friends.jp/
残り2話、けものはどこに向かうのだろうか?
RStudioのversion 1.0.136。windows 10のR version 3.3.3で動作を確認しています。
コマンドの紹介
詳細はコマンド、各パッケージのヘルプを確認してください。RStudioの他に必要なパッケージは「DT」、「gsheet」、[shiny]パッケージです。
なお、Shiny実行時に使用するカラーパレットのデータはGoogleDocsからダウンロードするので別途データの用意は必要ありません。参考までに、下部にカラーパレットのデータを掲載しています。
ui.Rの内容
#ui.R
#パッケージの読み込み
#キャラ名カラーパレットデータ
MasterNameData <- gsheet2tbl("https://drive.google.com/open?id=18vnUnvXL9Qh-OuvtnXCdZ6ccZngQJ8H6euvi7bvOy_A")
shinyUI(fluidPage(
#タイトルを指定
titlePanel("けものフレンズ カラーパレット80種"),
#UI設定
fluidRow(
#1列目
column(2,
selectInput(inputId = "SelectName",
label = "キャラクター名を選択",
choices = MasterNameData[, 1]),
DT::dataTableOutput("DTable")),
#2列目
column(3, plotOutput("Plot", width = "100%"))
)
)
)
server.Rの内容
#server.R
#パッケージの読み込み
if (!require("DT")) {
install.packages("DT")}
if (!require("gsheet")) {
install.packages("gsheet")}
if (!require("shiny")) {
install.packages("shiny")}
###データ例の作成#####
n <- 150
TestData <- data.frame(Data1 <- sample(1:20, n, replace = TRUE),
Data2 <- sample(1:20, n, replace = TRUE))
########
#データをGoogleSheetから取得:gsheetパッケージ
#キャラ画像カラーパレットデータ
MasterCharaData <- gsheet2tbl("https://drive.google.com/open?id=1gewqpvl3BEwPk0Bor1tD1l6A7_sWI2k7tGMxYV1QDz0")
#キャラ名カラーパレットデータ
MasterNameData <- gsheet2tbl("https://drive.google.com/open?id=18vnUnvXL9Qh-OuvtnXCdZ6ccZngQJ8H6euvi7bvOy_A")
shinyServer(function(input, output) {
#キャラカラーを取得
GetCharcolData <- reactive({
CharaCol <- subset(MasterCharaData, MasterCharaData[, 1] == input$SelectName)
CharaCol <- as.data.frame(CharaCol)
})
# #キャラ名カラーを取得
# GetNamecolData <- reactive({
# NameCol <- subset(MasterNameData, MasterNameData[, 1] == input$SelectName)
# })
#プロットを描写
output$Plot <- renderPlot({
CharaCol <- GetCharcolData()
par(bg = "black")
plot(x = TestData[, 1], y = TestData[, 2],
col = CharaCol[, 2], pch = 15, cex = 3,
axes = FALSE, xlab = "", ylab = "")
})
#テーブルを描写
output$DTable <- DT::renderDataTable({
CharaCol <- GetCharcolData()
ColCodeData <- data.frame(CharaCol[, 2], rep("", nrow(CharaCol)))
colnames(ColCodeData) <- c("カラーコード", "カラー")
datatable(ColCodeData, rownames = FALSE, options = list(dom = "t")) %>%
formatStyle("カラー", valueColumns = "カラーコード",
backgroundColor = styleEqual(ColCodeData[, 1], ColCodeData[, 1]))
})
})
・Shiny実行
・Googleスプレッドシート
けものキャラカラー
https://drive.google.com/open?id=1gewqpvl3BEwPk0Bor1tD1l6A7_sWI2k7tGMxYV1QDz0
けもの名前カラー
https://drive.google.com/open?id=18vnUnvXL9Qh-OuvtnXCdZ6ccZngQJ8H6euvi7bvOy_A
#必要パッケージの読み込み
if (!require("png")) {
install.packages("png")}
if (!require("tcltk")) {
install.packages("tcltk")}
if (!require("colorspace")) {
install.packages("colorspace")}
if (!require("scales")) {
install.packages("scales")}
#キャラ名を設定
CharaName <- c("サーバル", "キタキツネ", "カラカル", "アライグマ", "フェネック",
"トキ", "コアラ", "トラ", "ライオン", "タイリクオオカミ",
"ニホンオオカミ", "チーター", "ショウジョウトキ", "シヴァテリウム",
"シロサイ", "クロサイ", "アラビアオリックス", "トムソンガゼル",
"アフリカゾウ", "インドゾウ", "クロハゲワシ", "セグロジャッカル",
"イワハイラックス", "アクシスジカ", "タスマニアデビル", "オーストラリアデビル",
"ハクトウワシ", "オオタカ", "コウテイペンギン", "ジェンツーペンギン",
"イワトビペンギン", "フンボルトペンギン", "ロイヤルペンギン", "ヒョウ",
"クロヒョウ", "ピューマ", "ジャイアントペンギン", "メキシコサラマンダー",
"アゴヒゲアザラシ", "人面魚", "アフリカオオコノハズク", "ワシミミズク",
"アードウルフ", "スナネコ", "キンシコウ", "ホワイトタイガー", "ゴールデンタビータイガー",
"マルタタイガー", "ニシツノドリ", "ジャイアントパンダ", "レッサーパンダ", "ヒグマ",
"ホッキョクグマ", "オカピ", "エリマキトカゲ", "ミナミコアリクイ", "カバ", "ニホンカワウソ",
"コツメカワウソ", "アカカンガルー", "エゾヒグマ", "カムチャッカオオヒグマ", "コディアックヒグマ",
"マーゲイ", "オセロット", "ギンギツネ", "オイナリサマ", "キュウビキツネ", "トナカイ",
"ニホンジカ", "ヘラジカ", "ジャガー", "ブラックジャガー", "アミメキリン", "ヨーロッパビーバー",
"アメリカビーバー", "オグロプレーリードッグ", "アルパカ・スリ", "ツチノコ", "リカオン")
#キャラ・名前画像を保存するフォルダを選択
FoldPath <- paste(as.character(tkchooseDirectory(title = "フォルダを選択"), sep = "", collapse =""))
#キャラ画像を取得
for(n in seq(CharaName)){
GetUrl <- paste0("http://kemono-friends.jp/wp-content/themes/kemono-friends/assets/zoo/img/detail/",
formatC(n, width = 3, flag = "0"), "/chara.png")
download.file(GetUrl, destfile = paste0("chara_", formatC(n, width = 3, flag = "0"), ".png"), mode="wb")
}
#名前画像を取得
for(n in seq(CharaName)){
GetUrl <- paste0("http://kemono-friends.jp/wp-content/themes/kemono-friends/assets/zoo/img/detail/",
formatC(n, width = 3, flag = "0"), "/name.png")
download.file(GetUrl, destfile = paste0("name_", formatC(n, width = 3, flag = "0"), ".png"), mode="wb")
}
#画像名を取得
ItemList <- list.files(path = FoldPath)
#キャラ画像名を取得
CharaFile <- ItemList[ItemList %in% grep("chara", ItemList, value = TRUE)]
#名前画像名を取得
NameFile <- ItemList[ItemList %in% grep("name", ItemList, value = TRUE)]
#データ格納用の引数
MasterCharaData <- MasterNameData <- NULL
for(i in seq(CharaName)){
###キャラ画像を読み込み########
selectChara <- paste(FoldPath, "/", CharaFile[i],
sep = "", collapse = "")
#画像をカラーコード化
CharaImage <- readPNG(selectChara)
CharaLABCol <- as(RGB(as.vector(CharaImage[,, 1]), as.vector(CharaImage[,, 2]), as.vector(CharaImage[,, 3])), "LAB")
CharaRGBCol <- cbind(CharaLABCol@coords[,1:3], hex(CharaLABCol))
#マスターデータのデータフレーム化
CharaRGBCol <- as.data.frame(CharaRGBCol)
#特定の色を削除。白色系を削除
CharaRGBCol <- subset(CharaRGBCol, CharaRGBCol[, 4] != "#FFFFFF")
CharaRGBCol <- subset(CharaRGBCol, !(CharaRGBCol[, 4] %in% grep("#FDF", CharaRGBCol[, 4], value = TRUE)))
CharaRGBCol <- subset(CharaRGBCol, CharaRGBCol[, 4] != "#90B194")
#画像で使用されているカラーコードを集計
CharaRGBCol <- as.data.frame(table(CharaRGBCol[, 4]))
#集計データをカラーコードで並び替え
CharaRGBCol <- CharaRGBCol[order(CharaRGBCol[, 2], decreasing = TRUE), ]
#上位9を選択
CharaRGBCol <- as.character(CharaRGBCol[1:9, 1])
#show_col(CharaRGBCol)
#データを結合
CharaData <- cbind(CharaName[i], CharaRGBCol)
MasterCharaData <- rbind(MasterCharaData, CharaData)
########
###名前画像を読み込み#####
selectName <- paste(FoldPath, "/", NameFile[i],
sep = "", collapse = "")
###画像をカラーコード化#####
NameImage <- readPNG(selectName)
NameLABCol <- as(RGB(as.vector(NameImage[,, 1]), as.vector(NameImage[,, 2]), as.vector(NameImage[,, 3])), "LAB")
NameRGBCol <- cbind(NameLABCol@coords[,1:3], hex(NameLABCol))
#マスターデータのデータフレーム化
NameRGBCol <- as.data.frame(NameRGBCol)
#がさっと白色系を削除
NameRGBCol <- subset(NameRGBCol, NameRGBCol[, 4] != "#FFFFFF")
NameRGBCol <- subset(NameRGBCol, !(NameRGBCol[, 4] %in% grep("#FDF", NameRGBCol[, 4], value = TRUE)))
NameRGBCol <- subset(NameRGBCol, NameRGBCol[, 4] != "#90B194")
#画像で使用されているカラーコードを集計
NameRGBCol <- as.data.frame(table(NameRGBCol[, 4]))
#集計データをカラーコードで並び替え
NameRGBCol <- NameRGBCol[order(NameRGBCol[, 2], decreasing = TRUE), ]
#上位1を選択
NameRGBCol <- as.character(NameRGBCol[1, 1])
#show_col(NameRGBCol)
#データを結合
NameData <- cbind(CharaName[i], NameRGBCol)
MasterNameData <- rbind(MasterNameData, NameData)
########
}
実行例

少しでも、何かの参考になりますように!!