Rで解析:Shinyで習作3。けものフレンズ80種類のカラーパレット

Rの解析に役に立つ記事
スポンサーリンク

けものフレンズ公式サイト「けもフレ図鑑」に掲載の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(
  #&#12479;&#12452;&#12488;&#12523;&#12434;&#25351;&#23450;
  titlePanel("&#12369;&#12418;&#12398;&#12501;&#12524;&#12531;&#12474; &#12459;&#12521;&#12540;&#12497;&#12524;&#12483;&#12488;80&#31278;"),
  #UI&#35373;&#23450;
  fluidRow(
    #1&#21015;&#30446;
    column(2,
           selectInput(inputId = "SelectName",
                       label = "&#12461;&#12515;&#12521;&#12463;&#12479;&#12540;&#21517;&#12434;&#36984;&#25246;",
                       choices = MasterNameData[, 1]),
           DT::dataTableOutput("DTable")),
    #2&#21015;&#30446;
    column(3, plotOutput("Plot", width = "100%"))
  )
)
)

server.Rの内容

#server.R
#&#12497;&#12483;&#12465;&#12540;&#12472;&#12398;&#35501;&#12415;&#36796;&#12415;
if (!require("DT")) {
  install.packages("DT")}
if (!require("gsheet")) {
  install.packages("gsheet")}
if (!require("shiny")) {
  install.packages("shiny")}

###&#12487;&#12540;&#12479;&#20363;&#12398;&#20316;&#25104;#####	 	 
n <- 150	 	 
TestData <- data.frame(Data1 <- sample(1:20, n, replace = TRUE),
                       Data2 <- sample(1:20, n, replace = TRUE))
########

#&#12487;&#12540;&#12479;&#12434;GoogleSheet&#12363;&#12425;&#21462;&#24471;:gsheet&#12497;&#12483;&#12465;&#12540;&#12472;
#&#12461;&#12515;&#12521;&#30011;&#20687;&#12459;&#12521;&#12540;&#12497;&#12524;&#12483;&#12488;&#12487;&#12540;&#12479;
MasterCharaData <- gsheet2tbl("https://drive.google.com/open?id=1gewqpvl3BEwPk0Bor1tD1l6A7_sWI2k7tGMxYV1QDz0")
#&#12461;&#12515;&#12521;&#21517;&#12459;&#12521;&#12540;&#12497;&#12524;&#12483;&#12488;&#12487;&#12540;&#12479;
MasterNameData <- gsheet2tbl("https://drive.google.com/open?id=18vnUnvXL9Qh-OuvtnXCdZ6ccZngQJ8H6euvi7bvOy_A")

shinyServer(function(input, output) {
  
  #&#12461;&#12515;&#12521;&#12459;&#12521;&#12540;&#12434;&#21462;&#24471;
  GetCharcolData <- reactive({
    CharaCol <- subset(MasterCharaData, MasterCharaData[, 1] == input$SelectName)
    CharaCol <- as.data.frame(CharaCol)
  })
  
  # #&#12461;&#12515;&#12521;&#21517;&#12459;&#12521;&#12540;&#12434;&#21462;&#24471;
  # GetNamecolData <- reactive({
  #   NameCol <- subset(MasterNameData, MasterNameData[, 1] == input$SelectName)
  #   })
  
  #&#12503;&#12525;&#12483;&#12488;&#12434;&#25551;&#20889;
  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 = "")
  })
  
  #&#12486;&#12540;&#12502;&#12523;&#12434;&#25551;&#20889;
  output$DTable <- DT::renderDataTable({
    CharaCol <- GetCharcolData()
    ColCodeData <- data.frame(CharaCol[, 2], rep("", nrow(CharaCol)))
    colnames(ColCodeData) <- c("&#12459;&#12521;&#12540;&#12467;&#12540;&#12489;", "&#12459;&#12521;&#12540;")
    datatable(ColCodeData, rownames = FALSE, options = list(dom = "t")) %&gt;%
      formatStyle("&#12459;&#12521;&#12540;", valueColumns = "&#12459;&#12521;&#12540;&#12467;&#12540;&#12489;",
                  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

#&#24517;&#35201;&#12497;&#12483;&#12465;&#12540;&#12472;&#12398;&#35501;&#12415;&#36796;&#12415;
if (!require("png")) {
  install.packages("png")}
if (!require("tcltk")) {
  install.packages("tcltk")}
if (!require("colorspace")) {
  install.packages("colorspace")}
if (!require("scales")) {
  install.packages("scales")}

#&#12461;&#12515;&#12521;&#21517;&#12434;&#35373;&#23450;
CharaName <- c("&#12469;&#12540;&#12496;&#12523;", "&#12461;&#12479;&#12461;&#12484;&#12493;", "&#12459;&#12521;&#12459;&#12523;", "&#12450;&#12521;&#12452;&#12464;&#12510;", "&#12501;&#12455;&#12493;&#12483;&#12463;",
                  "&#12488;&#12461;", "&#12467;&#12450;&#12521;", "&#12488;&#12521;", "&#12521;&#12452;&#12458;&#12531;", "&#12479;&#12452;&#12522;&#12463;&#12458;&#12458;&#12459;&#12511;",
                  "&#12491;&#12507;&#12531;&#12458;&#12458;&#12459;&#12511;", "&#12481;&#12540;&#12479;&#12540;", "&#12471;&#12519;&#12454;&#12472;&#12519;&#12454;&#12488;&#12461;", "&#12471;&#12532;&#12449;&#12486;&#12522;&#12454;&#12512;",
                  "&#12471;&#12525;&#12469;&#12452;", "&#12463;&#12525;&#12469;&#12452;", "&#12450;&#12521;&#12499;&#12450;&#12458;&#12522;&#12483;&#12463;&#12473;", "&#12488;&#12512;&#12477;&#12531;&#12460;&#12476;&#12523;",
                  "&#12450;&#12501;&#12522;&#12459;&#12478;&#12454;", "&#12452;&#12531;&#12489;&#12478;&#12454;", "&#12463;&#12525;&#12495;&#12466;&#12527;&#12471;", "&#12475;&#12464;&#12525;&#12472;&#12515;&#12483;&#12459;&#12523;",
                  "&#12452;&#12527;&#12495;&#12452;&#12521;&#12483;&#12463;&#12473;", "&#12450;&#12463;&#12471;&#12473;&#12472;&#12459;", "&#12479;&#12473;&#12510;&#12491;&#12450;&#12487;&#12499;&#12523;", "&#12458;&#12540;&#12473;&#12488;&#12521;&#12522;&#12450;&#12487;&#12499;&#12523;",
                  "&#12495;&#12463;&#12488;&#12454;&#12527;&#12471;", "&#12458;&#12458;&#12479;&#12459;", "&#12467;&#12454;&#12486;&#12452;&#12506;&#12531;&#12462;&#12531;", "&#12472;&#12455;&#12531;&#12484;&#12540;&#12506;&#12531;&#12462;&#12531;",
                  "&#12452;&#12527;&#12488;&#12499;&#12506;&#12531;&#12462;&#12531;", "&#12501;&#12531;&#12508;&#12523;&#12488;&#12506;&#12531;&#12462;&#12531;", "&#12525;&#12452;&#12516;&#12523;&#12506;&#12531;&#12462;&#12531;", "&#12498;&#12519;&#12454;",
                  "&#12463;&#12525;&#12498;&#12519;&#12454;", "&#12500;&#12517;&#12540;&#12510;", "&#12472;&#12515;&#12452;&#12450;&#12531;&#12488;&#12506;&#12531;&#12462;&#12531;", "&#12513;&#12461;&#12471;&#12467;&#12469;&#12521;&#12510;&#12531;&#12480;&#12540;",
                  "&#12450;&#12468;&#12498;&#12466;&#12450;&#12470;&#12521;&#12471;", "&#20154;&#38754;&#39770;", "&#12450;&#12501;&#12522;&#12459;&#12458;&#12458;&#12467;&#12494;&#12495;&#12474;&#12463;", "&#12527;&#12471;&#12511;&#12511;&#12474;&#12463;",
                  "&#12450;&#12540;&#12489;&#12454;&#12523;&#12501;", "&#12473;&#12490;&#12493;&#12467;", "&#12461;&#12531;&#12471;&#12467;&#12454;", "&#12507;&#12527;&#12452;&#12488;&#12479;&#12452;&#12460;&#12540;", "&#12468;&#12540;&#12523;&#12487;&#12531;&#12479;&#12499;&#12540;&#12479;&#12452;&#12460;&#12540;",
                  "&#12510;&#12523;&#12479;&#12479;&#12452;&#12460;&#12540;", "&#12491;&#12471;&#12484;&#12494;&#12489;&#12522;", "&#12472;&#12515;&#12452;&#12450;&#12531;&#12488;&#12497;&#12531;&#12480;", "&#12524;&#12483;&#12469;&#12540;&#12497;&#12531;&#12480;", "&#12498;&#12464;&#12510;",
                  "&#12507;&#12483;&#12461;&#12519;&#12463;&#12464;&#12510;", "&#12458;&#12459;&#12500;", "&#12456;&#12522;&#12510;&#12461;&#12488;&#12459;&#12466;", "&#12511;&#12490;&#12511;&#12467;&#12450;&#12522;&#12463;&#12452;", "&#12459;&#12496;", "&#12491;&#12507;&#12531;&#12459;&#12527;&#12454;&#12477;",
                  "&#12467;&#12484;&#12513;&#12459;&#12527;&#12454;&#12477;", "&#12450;&#12459;&#12459;&#12531;&#12460;&#12523;&#12540;", "&#12456;&#12478;&#12498;&#12464;&#12510;", "&#12459;&#12512;&#12481;&#12515;&#12483;&#12459;&#12458;&#12458;&#12498;&#12464;&#12510;", "&#12467;&#12487;&#12451;&#12450;&#12483;&#12463;&#12498;&#12464;&#12510;",
                  "&#12510;&#12540;&#12466;&#12452;", "&#12458;&#12475;&#12525;&#12483;&#12488;", "&#12462;&#12531;&#12462;&#12484;&#12493;", "&#12458;&#12452;&#12490;&#12522;&#12469;&#12510;", "&#12461;&#12517;&#12454;&#12499;&#12461;&#12484;&#12493;", "&#12488;&#12490;&#12459;&#12452;",
                  "&#12491;&#12507;&#12531;&#12472;&#12459;", "&#12504;&#12521;&#12472;&#12459;", "&#12472;&#12515;&#12460;&#12540;", "&#12502;&#12521;&#12483;&#12463;&#12472;&#12515;&#12460;&#12540;", "&#12450;&#12511;&#12513;&#12461;&#12522;&#12531;", "&#12520;&#12540;&#12525;&#12483;&#12497;&#12499;&#12540;&#12496;&#12540;",
                  "&#12450;&#12513;&#12522;&#12459;&#12499;&#12540;&#12496;&#12540;", "&#12458;&#12464;&#12525;&#12503;&#12524;&#12540;&#12522;&#12540;&#12489;&#12483;&#12464;", "&#12450;&#12523;&#12497;&#12459;&#12539;&#12473;&#12522;", "&#12484;&#12481;&#12494;&#12467;", "&#12522;&#12459;&#12458;&#12531;")

#&#12461;&#12515;&#12521;&#12539;&#21517;&#21069;&#30011;&#20687;&#12434;&#20445;&#23384;&#12377;&#12427;&#12501;&#12457;&#12523;&#12480;&#12434;&#36984;&#25246;
FoldPath <- paste(as.character(tkchooseDirectory(title = "&#12501;&#12457;&#12523;&#12480;&#12434;&#36984;&#25246;"), sep = "", collapse =""))

#&#12461;&#12515;&#12521;&#30011;&#20687;&#12434;&#21462;&#24471;
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")
}
#&#21517;&#21069;&#30011;&#20687;&#12434;&#21462;&#24471;
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")
}

#&#30011;&#20687;&#21517;&#12434;&#21462;&#24471;
ItemList <- list.files(path = FoldPath)

#&#12461;&#12515;&#12521;&#30011;&#20687;&#21517;&#12434;&#21462;&#24471;
CharaFile <- ItemList[ItemList %in% grep("chara", ItemList, value = TRUE)]

#&#21517;&#21069;&#30011;&#20687;&#21517;&#12434;&#21462;&#24471;
NameFile <- ItemList[ItemList %in% grep("name", ItemList, value = TRUE)]

#&#12487;&#12540;&#12479;&#26684;&#32013;&#29992;&#12398;&#24341;&#25968;
MasterCharaData <- MasterNameData <- NULL

for(i in seq(CharaName)){
  ###&#12461;&#12515;&#12521;&#30011;&#20687;&#12434;&#35501;&#12415;&#36796;&#12415;########
  selectChara <- paste(FoldPath, "/", CharaFile[i],
                          sep = "", collapse = "")
  
  #&#30011;&#20687;&#12434;&#12459;&#12521;&#12540;&#12467;&#12540;&#12489;&#21270;
  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))
  
  #&#12510;&#12473;&#12479;&#12540;&#12487;&#12540;&#12479;&#12398;&#12487;&#12540;&#12479;&#12501;&#12524;&#12540;&#12512;&#21270;
  CharaRGBCol <- as.data.frame(CharaRGBCol)
  
  #&#29305;&#23450;&#12398;&#33394;&#12434;&#21066;&#38500;&#12290;&#30333;&#33394;&#31995;&#12434;&#21066;&#38500;
  CharaRGBCol <- subset(CharaRGBCol, CharaRGBCol[, 4] != "#FFFFFF")
  CharaRGBCol <- subset(CharaRGBCol, !(CharaRGBCol[, 4] %in% grep("#FDF", CharaRGBCol[, 4], value = TRUE)))
  CharaRGBCol <- subset(CharaRGBCol, CharaRGBCol[, 4] != "#90B194")
  
  #&#30011;&#20687;&#12391;&#20351;&#29992;&#12373;&#12428;&#12390;&#12356;&#12427;&#12459;&#12521;&#12540;&#12467;&#12540;&#12489;&#12434;&#38598;&#35336;
  CharaRGBCol <- as.data.frame(table(CharaRGBCol[, 4]))
  
  #&#38598;&#35336;&#12487;&#12540;&#12479;&#12434;&#12459;&#12521;&#12540;&#12467;&#12540;&#12489;&#12391;&#20006;&#12403;&#26367;&#12360;
  CharaRGBCol <- CharaRGBCol[order(CharaRGBCol[, 2], decreasing = TRUE), ]
  
  #&#19978;&#20301;9&#12434;&#36984;&#25246;
  CharaRGBCol <- as.character(CharaRGBCol[1:9, 1])
  #show_col(CharaRGBCol)
  
  #&#12487;&#12540;&#12479;&#12434;&#32080;&#21512;
  CharaData <- cbind(CharaName[i], CharaRGBCol)
  MasterCharaData <- rbind(MasterCharaData, CharaData)
  ########
  
  ###&#21517;&#21069;&#30011;&#20687;&#12434;&#35501;&#12415;&#36796;&#12415;#####
  selectName <- paste(FoldPath, "/", NameFile[i],
                         sep = "", collapse = "")
  
  ###&#30011;&#20687;&#12434;&#12459;&#12521;&#12540;&#12467;&#12540;&#12489;&#21270;#####
  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))
  
  #&#12510;&#12473;&#12479;&#12540;&#12487;&#12540;&#12479;&#12398;&#12487;&#12540;&#12479;&#12501;&#12524;&#12540;&#12512;&#21270;
  NameRGBCol <- as.data.frame(NameRGBCol)
  
  #&#12364;&#12373;&#12387;&#12392;&#30333;&#33394;&#31995;&#12434;&#21066;&#38500;
  NameRGBCol <- subset(NameRGBCol, NameRGBCol[, 4] != "#FFFFFF")
  NameRGBCol <- subset(NameRGBCol, !(NameRGBCol[, 4] %in% grep("#FDF", NameRGBCol[, 4], value = TRUE)))
  NameRGBCol <- subset(NameRGBCol, NameRGBCol[, 4] != "#90B194")
  
  #&#30011;&#20687;&#12391;&#20351;&#29992;&#12373;&#12428;&#12390;&#12356;&#12427;&#12459;&#12521;&#12540;&#12467;&#12540;&#12489;&#12434;&#38598;&#35336;
  NameRGBCol <- as.data.frame(table(NameRGBCol[, 4]))
  
  #&#38598;&#35336;&#12487;&#12540;&#12479;&#12434;&#12459;&#12521;&#12540;&#12467;&#12540;&#12489;&#12391;&#20006;&#12403;&#26367;&#12360;
  NameRGBCol <- NameRGBCol[order(NameRGBCol[, 2], decreasing = TRUE), ]
  
  #&#19978;&#20301;1&#12434;&#36984;&#25246;
  NameRGBCol <- as.character(NameRGBCol[1, 1])
  #show_col(NameRGBCol)
  
  #&#12487;&#12540;&#12479;&#12434;&#32080;&#21512;
  NameData <- cbind(CharaName[i], NameRGBCol)
  MasterNameData <- rbind(MasterNameData, NameData)
  ########
}

実行例


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

タイトルとURLをコピーしました