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

気になっていた「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')

出力

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


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

Prices and shipping availability may change. Please refer to the product page at time of purchase.
Content displayed on this site is provided by Amazon and may be updated or removed.
Amazon Associate, karada-good earns income through qualifying sales.
タイトルとURLをコピーしました