Rでお遊び:「47都道府県の代表的なアニメ」と「キャラクターの髪の色」のまとめ

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

気になっていた「47都道府県の代表的なアニメ」と「キャラクターの髪の色」を日本地図で表現するとともに「DTパッケージ」を利用して色とリンク付きのテーブルを作成しました。結果とコードを紹介します。

代表的なアニメは「2015年版 聖地白書に掲載」またはウェブで「都道府県名 アニメ」で検索し妥当と思われるアニメを選択しています。代表的なアニメ・キャラクターの選択は個人毎で異なると思います。何卒、ご了承ください。

キャラクターの元画像は、記事内の下部テーブルにある「参考URL」で表示されるページから取得しています。なお、解析は画像全体ではなく、髪部分の代表的な箇所を画像より切り出しpngで出力した画像を対象としています。下記が画像の状態です。

スクリーンショット 2015-06-14 14.06.02

<画像の状態>

解析の結果は北関東がパステルでした。疑問が一つ解消したので満足です。
画像の取得方法や対象とするキャラクターを変更することで結果は変わると思います。結果は参考までにご覧ください。

「DTパッケージ」かなり使えるパッケージです。紹介で使用しているパッケージは2015/6/14時点でリリースされているものです。

スポンサーリンク

必要なパッケージのインストール

対象パッケージがインストールされていなければ、下記コマンドを実行してください。

#パッケージのインストール
install.packages(”png", "jpeg", "colorspace", "DT", "ggplot2", "XLConnect", "maptools")

日本地図データの準備

Global Administrative Areasへアクセスし日本を選択後Shapefileをダウンロードし、解凍します。解凍したファイルはフォルダごと任意の場所へ保存します。なお、読み込むファイルの名前はJPN_adm1.shpです。

Global Administrative Areas:http://www.gadm.org/country

過去記事:GoogleAnalyticsのアクセスデータを日本地図で表現する
https://www.karada-good.net/analyticsr/googleanalytics-2/


画像からカラーコードを取得する

スクリーンショット 2015-06-14 15.11.21

画像ファイルは”読み込み順番”_”都道府県ID”_”都道府県名”.pngとしてください。”都道府県ID”と”都道府県名”の対応は下記画像を確認してください。

参考までに使用した画像切り抜きデータのダウンロードはこちらから

詳細はコメントまたは各パッケージヘルプを確認してください。

#パッケージの読み込み
library("tcltk")
library("png")
library("jpeg")
library("colorspace")

#読み込みフォルダを選択
FoldPath <- paste(as.character(tkchooseDirectory(title = "&#35501;&#12415;&#36796;&#12415;&#12501;&#12457;&#12523;&#12480;&#12434;&#36984;&#25246;"), sep = "", collapse =""))

#&#12501;&#12457;&#12523;&#12480;&#20869;&#12398;&#12450;&#12452;&#12486;&#12512;&#12434;&#21462;&#24471;
ItemList <- list.files(path = FoldPath)

#&#12487;&#12540;&#12479;&#26684;&#32013;&#29992;&#12398;&#22793;&#25968;&#12434;&#21021;&#26399;&#21270;
MasterRGBCol <- NULL

#&#12450;&#12452;&#12486;&#12512;&#25968;&#12398;&#21462;&#24471;
ItemVol <- length(ItemList)

for(i in seq(ItemVol)){
  
  #Image&#12501;&#12449;&#12452;&#12523;&#12398;&#35501;&#12415;&#36796;&#12415;
  selectAImage <- paste(FoldPath, "/", ItemList[i],
                           sep = "", collapse = "")
  
  #jpeg/png/gif&#12501;&#12449;&#12452;&#12523;&#12398;&#21028;&#26029;
  if (unlist(strsplit(ItemList[i], "\\."))[2] == "png"){
    
    Image <- readPNG(selectAImage)
    LABCol <- as(RGB(as.vector(Image[,, 1]), as.vector(Image[,, 2]), as.vector(Image[,, 3])), "LAB")
    RGBCol <- cbind(LABCol@coords[,1:3], hex(LABCol))
    
  }else{
    
    Image <- readJPEG(selectAImage, native = FALSE)
    LABCol <- as(RGB(as.vector(Image[,, 1]), as.vector(Image[,, 2]), as.vector(Image[,, 3])), "LAB")
    RGBCol <- cbind(LABCol@coords[,1:3], hex(LABCol))
    
  }
  
  #&#12510;&#12473;&#12479;&#12540;&#12487;&#12540;&#12479;&#12398;&#12487;&#12540;&#12479;&#12501;&#12524;&#12540;&#12512;&#21270;
  RGBCol <- as.data.frame(RGBCol)
  
  #&#12459;&#12521;&#12540;&#12467;&#12540;&#12489;&#12434;&#25991;&#23383;&#21015;&#21270;
  RGBCol[, 4] <- as.character(RGBCol[, 4])
  #head(RGBCol)
  
  #&#30011;&#20687;&#12391;&#20351;&#29992;&#12373;&#12428;&#12390;&#12356;&#12427;&#12459;&#12521;&#12540;&#12467;&#12540;&#12489;&#12434;&#38598;&#35336;
  CountColor <- as.data.frame(table(RGBCol[, 4]))
  
  #&#38598;&#35336;&#12487;&#12540;&#12479;&#12434;&#12459;&#12521;&#12540;&#12467;&#12540;&#12489;&#12391;&#20006;&#12403;&#26367;&#12360;
  CountColor <- CountColor[order(CountColor[, 1], decreasing = TRUE), ]
  head(CountColor)
  
  #&#12510;&#12473;&#12479;&#12540;&#12487;&#12540;&#12479;&#12398;&#37325;&#35079;&#12434;&#21066;&#38500;
  RGBCol <- RGBCol[!duplicated(RGBCol[, 4]),]
  
  #&#12510;&#12473;&#12479;&#12540;&#12487;&#12540;&#12479;&#12434;&#12459;&#12521;&#12540;&#12467;&#12540;&#12489;&#12391;&#20006;&#12403;&#26367;&#12360;
  RGBCol <- RGBCol[order(RGBCol[, 4], decreasing = TRUE),]
  
  #&#32080;&#21512;
  RGBCol <- cbind(unlist(strsplit(ItemList[i], "_"))[2], unlist(strsplit(unlist(strsplit(ItemList[i], "_"))[3], "\\."))[1],
                     ItemList[i], RGBCol, CountColor[, 2])
  
  #&#12503;&#12525;&#12483;&#12488;&#12487;&#12540;&#12479;&#12398;&#20316;&#25104;
  MasterRGBCol <- rbind(MasterRGBCol, RGBCol)
  
  #&#24517;&#35201;&#12398;&#12394;&#12356;Image,LABCol,RGBCol&#12398;&#21066;&#38500;
  rm(Image,LABCol,RGBCol)
  
}

#&#34892;&#21517;&#12398;&#20184;&#19982;
colnames(MasterRGBCol) <- c("ID_1", "NAME_1", "&#12501;&#12449;&#12452;&#12523;&#21517;", "&#26126;&#24230;:l", "&#35036;&#33394;&#27425;&#20803;:a", "&#35036;&#33394;&#27425;&#20803;:b", "&#12459;&#12521;&#12540;&#12467;&#12540;&#12489;", "&#20986;&#29694;&#25968;")

#&#12501;&#12449;&#12452;&#12523;&#12398;&#20445;&#23384;&#12289;&#35299;&#26512;&#30011;&#20687;&#25968;&#12395;&#12424;&#12387;&#12390;&#12399;&#12501;&#12449;&#12452;&#12523;&#12469;&#12452;&#12474;&#12364;&#38750;&#24120;&#12395;&#22823;&#12365;&#12356;&#22580;&#21512;&#12364;&#12354;&#12426;&#12414;&#12377;
#&#12414;&#12383;&#12289;&#12456;&#12463;&#12475;&#12523;&#12394;&#12393;&#12391;&#35501;&#12415;&#36796;&#12417;&#12394;&#12356;&#12371;&#12392;&#12364;&#12354;&#12427;&#12398;&#12391;&#12467;&#12513;&#12531;&#12488;&#12450;&#12454;&#12488;&#12375;&#12390;&#12356;&#12414;&#12377;&#12290;
#setwd(paste(as.character(tkchooseDirectory(title = "&#20445;&#23384;&#22580;&#25152;&#12434;&#36984;&#25246;"), sep = "", collapse ="")))
#write.csv(MasterRGBCol, "&#20998;&#26512;&#32080;&#26524;.csv", fileEncoding = "CP932", eol = "\r\n")

カラーコードのプロットと日本地図プロット・HTMLテーブル用のデータを作成

日本地図プロット・HTMLテーブル用のデータを作成します。必ず実行してください。
詳細はコメントまたは各パッケージヘルプを確認してください。

#&#36600;&#12398;&#35373;&#23450;
xRange <- seq(0, 1, by = 1/ItemVol)

#&#12464;&#12521;&#12501;&#24133;&#12398;&#35373;&#23450;
xWidth <- seq(1/ItemVol, 1, by = 1/ItemVol)

#&#12503;&#12525;&#12483;&#12488;&#38936;&#22495;&#12398;&#20316;&#25104;
par(bg = "#2E2E2E")
plot(0:1, 0:1, type = "n", axes = FALSE, xlab = "", ylab = "")

#&#26085;&#26412;&#22320;&#22259;&#12503;&#12525;&#12483;&#12488;&#12487;&#12540;&#12479;&#26684;&#32013;&#29992;&#22793;&#25968;
MapDrowData <- NULL

for(k in seq(ItemVol)){
  
  #&#12487;&#12540;&#12479;&#12398;&#25277;&#20986;
  Plot <- subset(MasterRGBCol, MasterRGBCol[, 3] == ItemList[k])
  
  #&#20986;&#29694;&#25968;&#12391;&#20006;&#12403;&#26367;&#12360;&#12390;TOP1&#12434;&#25277;&#20986;
  Plot <- Plot[order(as.vector(Plot[, 8]), decreasing = TRUE),]
  Plot <- head(Plot, n = 1)
  
  #&#26085;&#26412;&#22320;&#22259;&#12503;&#12525;&#12483;&#12488;&#29992;&#12487;&#12540;&#12479;
  MapDrowData <- rbind(MapDrowData, Plot)
  
  #&#12487;&#12540;&#12479;&#12398;&#12503;&#12525;&#12483;&#12488;
  rasterImage(as.raster(Plot[, 7]),
              xRange[k], 0, xWidth[k], 1, interpolate = FALSE)
  
}

出力例

coloerTable

キャラの髪の色を日本地図で表現するコマンド

上部「日本地図データの準備」を参照して地図のデータを準備してください。
詳細はコマンド内のコメントを確認してください。

###&#12521;&#12452;&#12502;&#12521;&#12522;&#12540;&#12398;&#35501;&#12415;&#36796;&#12415;#####
library("ggplot2")
library("maptools")
########

#&#12471;&#12455;&#12452;&#12503;&#12501;&#12449;&#12452;&#12523;&#12398;&#35501;&#12415;&#36796;&#12415;
#&#12501;&#12449;&#12452;&#12523;&#12399;JPN_adm1.shp&#12391;&#12377;
ReadData <- paste(as.character(tkgetOpenFile(title = "&#12510;&#12483;&#12503;&#12487;&#12540;&#12479;&#12434;&#36984;&#25246;",
                                                filetypes = '{"shp&#12501;&#12449;&#12452;&#12523;" {".shp"}}',initialfile = "*.shp")), sep = "", collapse =" ")
MapData <- readShapeSpatial(ReadData)

#&#26085;&#26412;&#22320;&#22259;&#12503;&#12525;&#12483;&#12488;&#29992;&#12487;&#12540;&#12479;&#12434;ID&#12391;&#20006;&#12403;&#26367;&#12360;
MapDrowData <- MapDrowData[order(type.convert(as.character(MapDrowData[, 1])), decreasing = FALSE),]

#&#27798;&#32260;&#12398;&#22320;&#22259;&#12487;&#12540;&#12479;&#12434;&#28310;&#20633;
#&#27798;&#32260;&#12434;&#25277;&#20986;
OkinawaMap <- MapData[MapData$NAME_1 == "Okinawa",]
#&#12487;&#12540;&#12479;&#12501;&#12524;&#12540;&#12512;&#21270;
OkinawaMap <- fortify(OkinawaMap) 
#&#25277;&#20986;
OkinawaMapData <- subset(OkinawaMap, OkinawaMap[,1] &gt; 127.5 &amp; OkinawaMap[,1] &lt; 128.5 &amp; OkinawaMap[,2] &gt; 26 &amp; OkinawaMap[,2] &lt; 26.9)
#X&#36600;&#12398;&#25551;&#20889;&#20301;&#32622;&#12434;&#22793;&#26356;
OkinawaMapData[, 1] <- OkinawaMapData[, 1] + 6 
#y&#36600;&#12398;&#25551;&#20889;&#20301;&#32622;&#12434;&#22793;&#26356;
OkinawaMapData[, 2] <- OkinawaMapData[, 2] + 14 

#&#27798;&#32260;&#20197;&#22806;&#12398;&#22320;&#22259;&#12487;&#12540;&#12479;&#12398;&#28310;&#20633;
#&#27798;&#32260;&#12434;&#38500;&#12367;
JapanMapData <- MapData[MapData$NAME_1 != "Okinawa",]
#&#12487;&#12540;&#12479;&#12501;&#12524;&#12540;&#12512;&#21270;
JapanMapData <- fortify(JapanMapData)
#&#12487;&#12540;&#12479;&#12398;&#25277;&#20986;
JapanMapData <- subset(JapanMapData, JapanMapData[,1] &gt; 128.5 &amp; JapanMapData[,2] &gt; 30)

#&#22320;&#22259;&#12487;&#12540;&#12479;&#12398;&#32113;&#21512;
#&#12487;&#12540;&#12479;&#12398;&#32080;&#21512;
AllJapanDrow <- rbind(JapanMapData, OkinawaMapData)
#&#12362;&#12414;&#12376;&#12394;&#12356;
AllJapanDrow[, 7] <- type.convert(AllJapanDrow[, 7])

#&#22659;&#30028;&#32218;&#12487;&#12540;&#12479;&#12398;&#28310;&#20633;
BorderLine <- data.frame(DrowXaxis = c(133, 134.5, 135, 135), DrowYaxis = c(39, 39, 41, 43))

#&#26085;&#26412;&#22320;&#22259;&#12398;&#12503;&#12525;&#12483;&#12488;
#&#26178;&#38291;&#12364;&#12363;&#12363;&#12426;&#12414;&#12377;
JapanDrow <- ggplot() +
  geom_polygon(data = AllJapanDrow, aes(x = AllJapanDrow[, 1], y = AllJapanDrow[, 2], group = AllJapanDrow[, 6], fill = AllJapanDrow[, 7])) +
  geom_path(data = BorderLine, aes(x = BorderLine[, 1], y = BorderLine[, 2])) +
  scale_fill_gradientn(colours = MapDrowData[, 7], guide = FALSE) + labs(x = "", y = "") +
  theme(axis.ticks = element_blank(), axis.text = element_blank(),
        panel.grid = element_blank(), panel.background = element_rect(fill = "#2E2E2E")) 
print(JapanDrow)

出力例

JapanColor

アニメタイトルとキャラ名と参考URLをJavaScripのDataTablesで出力するコマンド

JavaScripのDataTablesを出力する「DTパッケージ」はかなり使い勝手がいいです。DTパッケージの紹介記事は下記からご覧ください。テーブル内のリンクはクリックするとアニメオフィシャルHPが開きます。

Rでウェブ解析:JavaScripのDataTablesがRから作成できます!「DTパッケージ」の紹介
https://www.karada-good.net/analyticsr/r-107/

スクリーンショット 2015-06-14 13.23.07

データテーブルに使用したエクセルファイルです。

ダウンロードはこちらから

詳細はコマンド内のコメントを確認してください。

#&#12497;&#12483;&#12465;&#12540;&#12472;&#12398;&#35501;&#12415;&#36796;&#12415;
library("DT")
library("XLConnect")

#HTML&#12501;&#12449;&#12452;&#12523;&#12398;&#20445;&#23384;&#22580;&#25152;&#12434;&#25351;&#23450;
setwd(paste(as.character(tkchooseDirectory(title = "&#20445;&#23384;&#22580;&#25152;&#12434;&#36984;&#25246;"), sep = "", collapse ="")))

#&#12456;&#12463;&#12475;&#12523;&#12487;&#12540;&#12479;&#12398;&#35501;&#12415;&#36796;&#12415;
LoadData <- loadWorkbook(paste(as.character(tkgetOpenFile(title = "xlsx&#12501;&#12449;&#12452;&#12523;&#12434;&#36984;&#25246;",
                                                             filetypes = '{"xlsx&#12501;&#12449;&#12452;&#12523;" {".xlsx"}}',
                                                             initialfile = "*.xlsx")), sep = "", collapse =" "))
#&#12471;&#12540;&#12488;&#12398;&#35501;&#12415;&#36796;&#12415;&#12290;&#35501;&#12415;&#36796;&#12435;&#12384;&#12487;&#12540;&#12479;&#12399;&#12487;&#12540;&#12479;&#12501;&#12524;&#12540;&#12512;&#12395;&#12394;&#12426;&#12414;&#12377;&#12290;
SheetData <- readWorksheet(LoadData, sheet = 1)

#&#12475;&#12523;&#29992;&#12487;&#12540;&#12479;&#12434;&#12501;&#12449;&#12452;&#12523;&#21517;&#12391;&#20006;&#12403;&#26367;&#12360;
MapDrowData <- MapDrowData[order(type.convert(as.character(MapDrowData[, 3])), decreasing = FALSE),]

#&#21442;&#32771;URL&#12434;HTML&#12479;&#12464;&#12408;&#22793;&#25563;##
SheetData[, 5] <- paste0('&lt;a href="', SheetData[, 5], '" target="_blank"&gt;', SheetData[, 5], '&lt;/a&gt;')

#&#12486;&#12540;&#12502;&#12523;&#12398;&#20316;&#25104;
DataTable <- datatable(SheetData, rownames = FALSE, options = list(pageLength = 5, lengthMenu = c(3, 10, 25, 50, 100)),
                          caption = '47&#37117;&#36947;&#24220;&#30476; &#12450;&#12491;&#12513;&#12461;&#12515;&#12521;&#39658;&#12398;&#33394;', escape = FALSE)

#&#12461;&#12515;&#12521;&#21517;&#12398;&#12475;&#12523;&#12398;&#33394;&#12434;&#12497;&#12452;&#12503;"%>%"&#12391;&#12388;&#12394;&#12370;&#12390;formatStyle&#12391;&#35373;&#23450;&#12375;&#12414;&#12377;
DataTable <- DataTable %>% formatStyle('&#12461;&#12515;&#12521;',
                                             backgroundColor = styleEqual(SheetData[, 4], MapDrowData[, 7]))
#&#20316;&#25104;&#12486;&#12540;&#12502;&#12523;&#12434;html&#12391;&#20986;&#21147;
saveWidget(DataTable, 'DataTable.html')

出力

ぐりぐり動きますので、いろいろいじってみてください。
スマホの方はこちらから:別ウィンドウで開く


少しでも、あなたの解析が楽になりますように!!

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