Game of Thrones: Construire des infographies sur les meurtres, le sexe, voyager Westeros et plus




Message d'origine + Fonctions de support et données source

Table des matières


Relations avec les personnages
- Qui a donné naissance à qui?
- Qui à qui frère ou sœur
- Qui a tué qui?
- Qui sert qui?
- Qui est marié à quelqu'un ou fiancé
- Qui a couché avec qui?
- Toutes les relations sur une colonne
Lier des personnages par scène
Quel est le personnage le plus «populaire» de Game of Thrones?
- La quantité de temps d'écran pour les personnages
- Combien de personnages étaient dans la série?
- Lequel des personnages était dans le plus grand nombre d'épisodes de Game of Thrones?
Les emplacements les plus populaires "Game of Thrones"
- Carte des emplacements "Game of Thrones"
- Déplacement des personnages de Game of Thrones de série en série
- Qui a le plus «voyagé» des personnages de «Game of Thrones»?
- Les lieux les plus populaires "Game of Thrones" (à l'écran)
Dans quels films les acteurs de Game of Thrones ont-ils joué et dans quelle mesure sont-ils familiers?
- Films dans lesquels les acteurs les plus populaires de Game of Thrones ont joué:
- Acteurs de Game of Thrones dans Harry Potter
- Acteurs de Game of Thrones dans Star Wars
- Acteurs de Game of Thrones dans Pirates des Caraïbes
- Dans quels films / séries il y a beaucoup d'acteurs du "Game of Thrones"
- Dans quelle mesure les acteurs de Game of Thrones sont-ils interconnectés
Conversations dans Game of Thrones
Sexe des personnages de Game of Thrones: qui est le plus, hommes ou femmes?
Dans cet article, je parlerai de l'utilisation du langage Wolfram Languge dans l'analyse et la visualisation de données en utilisant la base de données de Game of Thrones comme exemple. Cet article ne prête pas beaucoup d'attention à l'analyse des données; j'en parlerai séparément. Au lieu de cela, le poste est entièrement consacré à des infographies intéressantes et à sa création.

J'espère que les visualisations construites intéresseront ceux qui aiment cette merveilleuse série).

L'infographie créée pour la publication est interactive dans le document Mathematica, qui peut être téléchargée à partir du lien dans l'en-tête.

Relations avec les personnages


Un ensemble d'arêtes dans un graphique de relations de caractères par type:

$GOTCharacterLinks= Module[{parser}, parser= Flatten[ Thread/@ DeleteCases[ Lookup[ GOTRawData["characters.json"][ "characters" ], {"characterName",#} ], {_,_Missing} ], 1 ]&; <| "" -> Union[ DirectedEdge[#[[2]],#[[1]]]&/@parser["parents"], DirectedEdge[#[[1]],#[[2]]]&/@parser["parentOf"] ], "" -> DeleteDuplicates[ UndirectedEdge[#[[2]],#[[1]]]&/@parser["siblings"], #1===Reverse[#2]& ], ""-> Union[ DirectedEdge[#[[2]],#[[1]]]&/@parser["killedBy"], DirectedEdge[#[[1]],#[[2]]]&/@parser["killed"] ], ""->(DirectedEdge[#[[1]],#[[2]]]&/@parser["serves"]), "" -> DeleteDuplicates[ UndirectedEdge[#[[1]],#[[2]]]&/@parser["marriedEngaged"], #1===Reverse[#2]& ], ""-> DeleteDuplicates[ Flatten[ Map[ Thread@UndirectedEdge[#[[1]],#[[2]]["with"]]&, Lookup[#,{"name","sex"}]&/@ Select[ Select[ Flatten[ Lookup[ Flatten[ GOTRawData[ "episodes.json" ][ "episodes" ][ [;;,"scenes"] ], 1 ], "characters" ] ], Keys[#]=!={"name"}& ], MemberQ[Keys[#],"sex"]& ] ] ], #1===Reverse[#2]& ]|> ]; 

Fonction GOTCharacterLinksGraph pour représenter graphiquement les relations entre les personnages de Game of Thrones.

 ClearAll[GOTCharacterLinksGraph]; GOTCharacterLinksGraph[ data_, OptionsPattern[ { "ImageSize"->1500, "VertexSize"->Automatic, "GraphLayout"->"GravityEmbedding" } ] ]:= Module[{vertexList}, vertexList= DeleteDuplicates[Flatten[data[[;;,1]]/._[x_,y_]:>{x,y}]]; Graph[ data, VertexLabels-> Map[ Rule[ #, Placed[ Tooltip[ If[ Head[#]===Image, Image[#,ImageSize->60], (* else *) Style[ StringReplace[#," "->"\n"], LineSpacing->{0.8,0,0}, FontFamily->"Open Sans Light", Bold, 12 ] ]&[ #/.$characterImage ], #/.$characterCardFull ], {1/2,1/2} ] ]&, vertexList ], VertexShapeFunction->"Circle", VertexSize->OptionValue["VertexSize"], VertexStyle-> Directive[ {White,EdgeForm[{LightGray,AbsoluteThickness[2]}]} ], ImageSize->OptionValue["ImageSize"], Background->GrayLevel[0.95], AspectRatio->1, GraphLayout->OptionValue["GraphLayout"] ] ]; 

Nous découvrons qui a donné naissance à qui dans Game of Thrones:

 GOTInfographicsPoster[ #, "     \" \"", "ImageSize" -> 1500 ] &@ GOTCharacterLinksGraph[ Property[ #, { EdgeStyle -> Directive[ { AbsoluteThickness[2], Blue, Arrowheads[{0, {0.01, 0.5}}] } ] } ] & /@ $GOTCharacterLinks[""], "VertexSize" -> 3 ] 


image

Voyons maintenant qui est un frère ou une soeur à qui dans Game of Thrones:

 GOTInfographicsPoster[ #,"    \" \"","ImageSize"->1500 ]&@ GOTCharacterLinksGraph[ Property[ #, {EdgeStyle->Directive[{AbsoluteThickness[2],Darker@Green}]} ]&/@ $GOTCharacterLinks[""], "VertexSize"->0.7, "GraphLayout"->Automatic ] 


image

L'un des plus intéressants: le nombre de meurtres dans Game of Thrones:

 GOTInfographicsPoster[ #,"    \" \"","ImageSize"->2500 ]&@ GOTCharacterLinksGraph[ Property[ #, { EdgeStyle-> Directive[ { AbsoluteThickness[2], Black, Arrowheads[{0,{0.0075,0.5}}] } ] } ]&/@ $GOTCharacterLinks[""], "VertexSize"->1.1, "ImageSize"->2500 ] 


image
( original )

Pas si intéressant, mais néanmoins - qui sert qui dans Game of Thrones:

 GOTInfographicsPoster[ #,"    \" \"","ImageSize"->1000 ]&@ GOTCharacterLinksGraph[ Property[ #, { EdgeStyle-> Directive[ { AbsoluteThickness[2], Magenta, Arrowheads[{0,{0.02,0.5}}] } ] } ]&/@ $GOTCharacterLinks[""], "VertexSize"->0.5, "ImageSize"->1000, "GraphLayout"->Automatic ] 


image

Les personnages fiancés et mariés de Game of Thrones:

 GOTInfographicsPoster[ #, "       \" \"", "ImageSize"->1000 ]&@ GOTCharacterLinksGraph[ Property[ #,{EdgeStyle->Directive[{AbsoluteThickness[2],Orange}]} ]&/@ $GOTCharacterLinks[""], "VertexSize"->0.5, "ImageSize"->1000, "GraphLayout"->Automatic ] 


image

Un peu plus chaud - qui a eu des relations sexuelles avec qui dans "Game of Thrones" (le nombre de lignes, je pense, n'est pas difficile à deviner ce que cela signifie;)).

 GOTInfographicsPoster[#, "  \" \"", "ImageSize" -> 1300] &@ GOTCharacterLinksGraph[ Property[#, {EdgeStyle -> Directive[{AbsoluteThickness[2], Red}]}] & /@ $GOTCharacterLinks[""], "VertexSize" -> 0.9, "ImageSize" -> 1300, "GraphLayout" -> "LayeredDigraphEmbedding" ] 


image

Maintenant, nous allons réduire tous les graphiques en un seul grand graphique de la relation des personnages dans "Game of Thrones":

 GOTInfographicsPoster[ #, "   \" \"", "ImageSize"->3000 ]&@ Legended[ GOTCharacterLinksGraph[ Join[ Property[ #, { EdgeStyle-> Directive[ { AbsoluteThickness[3], Blue, Arrowheads[{0,{0.005,0.5}}] } ] } ]&/@ $GOTCharacterLinks[""], Property[ #, { EdgeStyle-> Directive[ {AbsoluteThickness[3],Darker@Green} ] } ]&/@ $GOTCharacterLinks[""], Property[ #, { EdgeStyle-> Directive[ { AbsoluteThickness[3], Black, Arrowheads[{0,{0.005,0.5}}] } ] } ]&/@ $GOTCharacterLinks[""], Property[ #, { EdgeStyle-> Directive[ { AbsoluteThickness[1], Magenta, Arrowheads[{0,{0.005,0.5}}] } ] } ]&/@ $GOTCharacterLinks[""], Property[ #, { EdgeStyle-> Directive[{AbsoluteThickness[2],Orange}] } ]&/@ $GOTCharacterLinks[""], Property[ #, {EdgeStyle->Directive[{AbsoluteThickness[3],Red}]} ]&/@ DeleteDuplicates[$GOTCharacterLinks[""]] ], "ImageSize"->3000, "VertexSize"->0.9 ], Placed[ LineLegend[ {Blue,Darker@Green,Black,Magenta,Orange,Red}, { "  ", "  ", "", "", "  ", "" }, LegendLayout->"Row" ], Top ] ] 


image
( original )

Lier des personnages par scène



Voyons quels personnages sont apparus dans la même scène. Chaque bord entre les personnages signifie qu'ils étaient dans la même scène. Plus la côte est épaisse et rouge, plus les scènes sont courantes.

Construisons plusieurs graphiques: le premier montre les connexions avec un nombre minimum de scènes 2. Ensuite, 5, 10 et 20.

 Table[ Print[ GOTInfographicsPoster[ GOTGraphPlot[ #, min, "ImageSize"->Which[min==1,5000,min==4,3000,True,2000], "MaxThickness"->25 ], "  \" \"      " <> ToString[min+1] <> " ", "ImageSize"->Which[min==1,5000,min==4,3000,True,2000] ]&@ Tally[ UndirectedEdge@@@ Map[ Sort, Flatten[ Map[ Subsets[#,{2}]&, Map[ #[[;;,"name"]]&, Flatten[ Lookup[ GOTRawData[ "episodes.json" ][ "episodes" ], "scenes" ] ][ [;;,"characters"] ] ] ], 1 ] ] ] ], {min,{1,4,9,19}} ]; 


image
( original )

image

image

image

Quel est le personnage le plus «populaire» de Game of Thrones?



Pour répondre à cette question, créez une variable $ GOTEpisodeData dans laquelle nous placerons un ensemble de données de scène effacées pour chaque épisode de Game of Thrones.

 $GOTEpisodeData= With[{data=#}, <| "EpisodeN"->#[[1]], "ScreenTime"-> SortBy[ GroupBy[ Flatten[ ReplaceAll[ Thread/@ Transpose[ { Map[ Lookup[#[[1]],"name"]&, #[[2]] ], Round@ Map[ QuantityMagnitude[ UnitConvert[ Subtract@@ ( TimeObject/@ #[ [ { 3, 2 } ] ] ), "Seconds" ] ]&, #[[2]] ] } ], {Missing["KeyAbsent","name"],x_} :> {{"",x}} ]&@ data, 1 ], First, #[[;;,2]]& ], -Total[#]& ], "LocationTime" -> SortBy[ GroupBy[ Flatten[ ReplaceAll[ Thread/@ Transpose[ { Map[{#[[{4,5}]]}&,#[[2]]] /. Missing["KeyAbsent","subLocation"]-> Nothing, Round@ Map[ QuantityMagnitude[ UnitConvert[ Subtract@@ ( TimeObject/@ #[ [ { 3, 2 } ] ] ), "Seconds" ] ]&, #[[2]] ] } ], {Missing["KeyAbsent","name"],x_} :> {{"",x}} ]&@ data, 1 ], First, #[[;;,2]]& ], -Total[#]& ], "CharacterLocations"-> GroupBy[ DeleteCases[ #/.Missing["KeyAbsent","subLocation"]->Nothing, _Missing ]&@ Flatten[ Map[ With[{location=#[[2]]}, {#,location}&/@#[[1]] ]&, Transpose[ { Map[Lookup[#[[1]],"name"]&,#[[2]]], #[[2,;;,{4,5}]] } ] ], 1 ], First, #[[;;,2]]& ]|> ]&/@ DeleteCases[ Map[ { #[[{1,2}]], Lookup[ #[[3]], { "characters", "sceneStart", "sceneEnd", "location", "subLocation" } ] }&, Lookup[ GOTRawData["episodes.json"]["episodes"], {"seasonNum","episodeNum","scenes"} ] ], {_,{_Missing...}} ]; 


Exemples de données pour le premier épisode de la première saison:

image

La quantité de temps d'écran pour les personnages



30 personnages de Game of Thrones avec le plus de temps d'écran:

 GOTInfographicsPoster[ #, "30 ,       ", "ImageSize"->1500 ]&@ circleInfographics[ { Tooltip[ Row[ { #[[1]]/.$characterImage, Style[#[[1]],14,White,Bold], Style[ UnitConvert[ Quantity[#[[2]],"Seconds"], MixedUnit[ {"Hours","Minutes","Seconds"} ] ], 14, White ] }, "\n" ], #[[1]]/.$characterCardFull ], #[[2]] }&/@ KeyValueMap[ {#1,#2}&, SortBy[ Merge[ $GOTEpisodeData[[All,"ScreenTime"]], Total[Flatten[#]]& ], -#& ] ][ [1;;30] ], "Precision"->10^-6, "StepDecrease"->0.99, "ShapeFunction"->Disk, "ColorFunction"->ColorData["Rainbow"], "ImageSize"->1500 ] 


image
( original )

Nous ne priverons pas les autres non plus et construirons une grande table:

 GOTInfographicsPoster[ #, "550+     ", "ImageSize"->1500, "ImageResolution"->150 ]&@ Multicolumn[ Style[ Row[{#[[1]]," \[LongDash] ",#[[2]]," c"}],FontFamily->"Myriad Pro",8 ]&/@ KeyValueMap[ {#1,#2}&, SortBy[ Merge[ $GOTEpisodeData[[All,"ScreenTime"]], Total[Flatten[#]]& ], -#& ] ], 6 ] 


image
( original )

Combien de personnages étaient dans la série?



$ GOTEpisodeN - Convertit une série du format {saison, numéro de série d'une série dans une saison} en seulement le numéro de série d'une série dans la série entière.

 $GOTEpisodeN= <| Thread[ Rule[#,Range[Length[#]]]&@$GOTEpisodeData[[All,"EpisodeN"]] ]|>; 


$ GOTEpisodeID est l'opération inverse de $ GOTEpisodeN .

 $GOTEpisodeID= <| Thread[ Rule[Range[Length[#]],#]&@$GOTEpisodeData[[All,"EpisodeN"]] ]|>; 


Construisons un histogramme du nombre de personnages impliqués dans chacune des séries Game of Thrones

 GOTInfographicsPoster[ #, "    \" \"", "ImageSize"->1000 ]&@ BarChart[ #, BarSpacing->{0.05,2}, AspectRatio->1/2, ImageSize->1000, ChartLabels->{Keys[#],Range[10]}, ColorFunction->Function[{x},ColorData["Rainbow"][x]], GridLines->{None,Range[0,100,5]}, FrameLabel-> Map[ Style[#,FontFamily->"Open Sans",20,Bold]&, { "    ", "  " } ], Frame->True, Background->GrayLevel[0.95] ]&@ GroupBy[ Map[ {#["EpisodeN"],Length[#["ScreenTime"]]}&, $GOTEpisodeData[[All,{"EpisodeN","ScreenTime"}]] ], #[[1,1]]&, #[[;;,2]]& ] 


image

Lequel des personnages était dans le plus grand nombre d'épisodes de Game of Thrones?



Une liste de personnages de Game of Thrones, triés par le nombre d'épisodes dans lesquels ils se sont rencontrés:

 $GOTCharacters= DeleteCases[ Reverse[ SortBy[ Tally[ Flatten[Keys@$GOTEpisodeData[[All,"ScreenTime"]]] ], Last ] ][ [;;,1] ], "" ]; 


Nombre d'épisodes dans une saison:

 $GOTSeriesInSeason= <| KeyValueMap[#1->Length@#2&,GroupBy[$GOTEpisodeData[[;;,1]],First]]|>; 


«Masque» de la saison (symbole officiel):

 $GOTSeasonsMask=KeyValueMap[ConstantArray[#1,#2]&,$GOTSeriesInSeason]; 


GOTCharacterBySeason calcule dans quelle série de quelles saisons le personnage de Game of Thrones était impliqué:

 GOTCharacterBySeason[name_]:= Module[{initialData,empty}, initialData= Map[ #[[;;,2]]&, GroupBy[ Cases[ {#[[1]],Keys[#[[2]]]}&/@ Lookup[ $GOTEpisodeData, {"EpisodeN","ScreenTime"} ], {number_,episode_/;Not[FreeQ[episode,name]]}:> number ], First ] ]; empty=Complement[Range[1,8],Keys[initialData]]; If[ Length[empty]===0, initialData, (* else *) KeySort@<|initialData,<|#->{}&/@empty|>|> ] ] 


GOTCharacterBySeasonPlot visualise les données reçues par GOTCharacterBySeason .

 GOTCharacterBySeasonPlot[name_]:= Flatten@ KeyValueMap[ ReplacePart[ $GOTSeasonsMask[[#1]], Thread[ Complement[Range[1,$GOTSeriesInSeason[#1]],#2]->0 ] ]&, GOTCharacterBySeason[name] ] 


$ GOTSeasonColors ensemble de couleurs, afin d'afficher visuellement un ensemble de séries de saisons.

 $GOTSeasonColors= {0->White} ~ Join ~ Thread[Range[1,8]->ColorData[54,"ColorList"][[1;;8]]]; 


Enfin, nous allons construire un tableau dans lequel il est clairement visible lequel des personnages dans quelle série de "Game of Thrones" était et dans lequel ne l'était pas)

 GOTInfographicsPoster[ #, "100  \" \",     ", "ImageSize"->2500 ]&@ Grid[ { { " \\   ", SpanFromLeft, Style["% \n \n",12] } ~ Join ~ Map[ Style[ "S"<>ToString[#[[1]]]<>"\nE"<>ToString[#[[2]]],10 ]&, Keys[$GOTEpisodeN] ] } ~ Join ~ ( ( { ImageResize[#/.$characterImage,{Automatic,25}], #, PercentForm[ N@Total[Length/@GOTCharacterBySeason[#]] / Last[$GOTEpisodeN] ] } ~ Join ~ ReplaceAll[ GOTCharacterBySeasonPlot[#], x_Integer:>Item["",Background->x/.$GOTSeasonColors] ]&/@ DeleteCases[ $GOTCharacters[[1;;100]],"" ] ) ), ItemSize->{{2,10,5,{1.2}},{4,{1}}}, Background->White, Dividers->Gray, ItemStyle -> Directive[ FontFamily->"Open Sans",14,Bold,LineSpacing->{0.8,0,0} ], Alignment->{Center,Center} ] 


image
( original )

Les emplacements les plus populaires "Game of Thrones"



Carte des emplacements "Game of Thrones"



Nous construisons une carte à partir de primitives géométriques. Créons leur set:

 index=1; $GOTLakesIDs= { 11, 8, 9, 10, 2, 529, 530, 522, 523, 533, 532, 526, 521, 525, 531, 524, 528, 527, 7, 3, 4, 5, 6 }; 


 $GOTMapPolygons= { FaceForm@If[MemberQ[$GOTLakesIDs,index],LightBlue,LightOrange], EdgeForm[AbsoluteThickness[1]], index++;Polygon[Accumulate[#]] }&/@ GOTRawData["lands-of-ice-and-fire.json"]["arcs"]; 


Créez un ensemble de lieux sur la carte Game of Thrones:

 $GOTMapPlaces= Lookup[ GOTRawData["lands-of-ice-and-fire.json"]["objects"]["places"][ "geometries" ], {"coordinates","properties"} ]; 


 $GOTMapPlaceCoordinates=Map[#[[2,"name"]]->#[[1]]&,$GOTMapPlaces]; 


La fonction GOTMap permet de construire toutes sortes de lieux et de trajectoires «géographiques» sur la carte «Game of Thrones»:

 GOTMap[additinals_,OptionsPattern[{"ImageSize"->1500}]]:= Legended[ Graphics[ { $GOTMapPolygons, ( { { AbsolutePointSize[10], Black, Point[#1[[1]]], AbsolutePointSize[5], White, Point[#1[[1]]] }, Inset[ With[{placeType=#1[[2]]["type"]}, ( Framed[ #1, Background -> ( placeType /. Thread[ { "city", "castle", "ruin", "town" } -> ( Lighter[ RGBColor[ #1/255 ], 0.5 ]& )/@ { {254,92,7}, {254,252,9}, {138,182,7}, {2,130,237} } ] ), RoundingRadius->6, FrameStyle->None, FrameMargins->2 ]& )[ Style[ #1[[2]]["name"], LineSpacing->{0.8,0,0}, FontFamily->"Open Sans", Bold, 12 ] ] ], #1[[1]], If[ MemberQ[ { "Eastwatch", "The Dreadfort", "White Harbor", "Storm's End", "Ghoyan Drohe", "Qohor" }, #1[[2]]["name"] ], Scaled[{-0.1,1/2}], (* else *) Scaled[{1.1,1/2}] ] ] }& )/@ $GOTMapPlaces, additinals }, ImageSize->OptionValue["ImageSize"], Background->LightBlue, PlotRangePadding->0 ], (Placed[#1,"Bottom"]&)[ SwatchLegend[ (RGBColor[#1/255]&)/@ {{254,92,7},{254,252,9},{138,182,7},{2,130,237}}, {"city","castle","ruin","town"}, LegendLayout->"Row" ] ] ] 


Construisez la carte elle-même:

 GOTInfographicsPoster[ #,"   \" \"","ImageSize"->1500 ]&@ GOTMap[{}] 


image

Déplacer les personnages de Game of Thrones de série en série



La fonction GOTCharacterLocationNamesSequence calcule les mouvements du personnage entre les emplacements de Game of Thrones:

 GOTCharacterLocationNamesSequence[name_]:= Merge[$GOTEpisodeData[[;;,"CharacterLocations"]],Identity][name]; 


La fonction GOTCharacterLocationSequence traduit les noms de lieux en leurs coordonnées «géographiques»:

 GOTCharacterLocationSequence[name_]:= DeleteCases[ Partition[ Flatten[ DeleteCases[ GOTCharacterLocationNamesSequence[name] /. {{x_String,y_String}:>y,{x_String}:>x} /. $GOTMapPlaceCoordinates, _String, Infinity ], 1 ], 2, 1 ], {x_,x_} ]; 


La fonction GOTMapTraectory construit une trajectoire sur la carte Game of Thrones:

 ClearAll[GOTMapTraectory]; GOTMapTraectory[path_,colorFunction_:ColorData["Rainbow"]]:= Module[{kol}, kol=Length[path]; Table[ { Opacity[0.5], colorFunction[(i-1)/(kol-1)], AbsoluteThickness[10i/kol+1], CapForm["Round"], Arrow[ BSplineCurve[ { path[[i,1]], Mean[path[[i]]] + RandomInteger[{5000,20000}] Function[#/Norm[#]][ RandomChoice[{1,1}] {-1,1} * Reverse[path[[i,2]]-path[[i,1]]] ], path[[i,2]] } ] ] }, {i,1,kol} ] ]; 


Enfin, nous pouvons construire une carte du mouvement de n'importe quel personnage de Game of Thrones. Construisez-les pour les 10 héros les plus populaires.

 ( Print[ With[{track=#1,name=#1[[1]]}, ( GOTInfographicsPoster[ #1, Row[ { " ", Style[name,Bold], "  \" \"", "\n", Style[ "(      )", 25 ] } ], "ImageSize"->1500 ]& )[ GOTMap[ { Arrowheads[{0,0.01}], ( With[{color=#1[[2]]}, GOTMapTraectory[ GOTCharacterLocationSequence[name] ] ]& )[ track ], Inset[ track[[1]]/.$characterCardFull, Scaled[{0.99,0.99}], Scaled[{1,1}] ] } ] ] ] ]& )/@ ({#1,RGBColor[{200,42,102}/255]}&)/@$GOTCharacters[[1;;10]]; 


image

image
(autres cartes voir ici )

Qui est le plus "voyagé" des personnages de "Game of Thrones"?



Nous trouverons la longueur du chemin parcouru par chaque personnage du Game of Thrones en unités arbitraires et verrons qui a le plus voyagé selon Westeros:

 GOTInfographicsPoster[ #1, "   \"\"  \" \"?", "ImageSize"->1500 ]&@ ( ( BarChart[ #1[[1;;All,1]], PlotRangePadding->0, BarSpacing->0.25, BarOrigin->Left, AspectRatio->1.8, ImageSize->1500, ChartLabels->#1[[1;;All,2]], Frame->True, GridLines->{Range[0,10^6,10^4],None}, ColorFunction->ColorData["Rainbow"], FrameLabel-> { {None,None}, Style[#,FontFamily->"Open Sans Light",16]&/@ { "    ", "    " } }, Background->GrayLevel[0.95] ]& )[ Cases[ SortBy[ ( { Total[ (Norm[Subtract@@#1]&)/@ GOTCharacterLocationSequence[#1] ], #1/.$characterCardShortSmall }& )/@ DeleteCases[ $GOTCharacters, Alternatives@@ { "", "Musician #1", "Musician #2", "Musician #3" } ], First[#1]& ], {x_/;x>0,_} ][ [-50;;-1] ] ] ) 


image

Les lieux les plus populaires "Game of Thrones" (à l'écran)



Nous calculons pour chaque emplacement (et région) sur la carte Game of Thrones le temps d'écran total et affichons le résultat sous plusieurs formes. Vous verrez immédiatement les emplacements les plus populaires.

Données sous forme de graphique à barres:

 GOTInfographicsPoster[ #1, " \" \"    ( 1)", "ImageSize"->2000 ]&@ ( BarChart[ #[[;;,1]], PlotRangePadding->0, BarSpacing->{0.5,3}, BarOrigin->Left, AspectRatio->1.5, ImageSize->2000, ChartLabels->{#[[;;,2]],None}, ColorFunction-> Function[ {x},If[x>4000,Red,ColorData["Rainbow"][x/4000]] ], ColorFunctionScaling->False, PlotRange->{0,55000}, Frame->True, GridLines->{Range[0,60000,1000],None}, GridLinesStyle->LightGray, FrameTicks->{All,Automatic}, FrameLabel-> { {None,None}, Style[#,FontFamily->"Open Sans Light",16]&/@ { " , ", " , " } }, Background->GrayLevel[0.95] ]&@ KeyValueMap[ { Callout[ #[[1]], #[[2]], If[#[[1]]>20000,Bottom,Right], If[#[[1]]>4000,Scaled[1/2],Automatic] ]&/@ Transpose[{#2[[;;,2]],#2[[;;,1]]}], #1 }&, SortBy[ GroupBy[ KeyValueMap[ {#1,#2}&, Merge[ $GOTEpisodeData[[All,"LocationTime"]], Total[Flatten[#]]& ] ], #[[1,1]]&, SortBy[ Transpose[ { #[[;;,1]] /. { {x_String,y_String}:>y, {x_String}:>x }, #[[;;,2]] } ] /. {"",_}:>Nothing, Last[#]& ]& ], Total[#[[;;,2]]]& ] ] ) 


image
( original )

Données sous forme de graphique à secteurs:

 { Print[ GOTInfographicsPoster[ #1, " \" \"    ( 2)", "ImageSize"->1500 ]&@ stripLineInfographics[ #, "Reverse"->False, "Gaps"->{75,50}, "ColorFunctionRight"->ColorData["Rainbow"] ] ], Print[ GOTInfographicsPoster[ #1, " \" \"   \n(   )", "ImageSize"->1500 ]&@ stripLineInfographics[ #, "Reverse"->True, "Gaps"->{50,75}, "ColorFunctionRight"->ColorData["Rainbow"] ] ] }&@ SortBy[ GroupBy[ KeyValueMap[ {#1,#2}&, Merge[ $GOTEpisodeData[[All,"LocationTime"]], Total[Flatten[#]]& ] ], #[[1,1]]&, SortBy[ Transpose[ { #[[;;,1]] /. {{x_String,y_String}:>y,{x_String}:>x}, #[[;;,2]] } ] /. {"",_}:>Nothing, Last[#]& ]& ], -Total[#[[;;,2]]]& ]; 


image
( original )

image
( original )

Dans quels films les acteurs de Game of Thrones ont-ils joué et dans quelle mesure sont-ils familiers?



Bien sûr, les acteurs de Game of Thrones jouaient encore beaucoup. Nous calculons et mettons dans la variable $ GOTCharactersInAnotherFilms des données sur quels films les acteurs ont joué.

 $GOTCharactersInAnotherFilms= SortBy[ Map[ { #[[1]], #[[2]][[;;,"characterName"]], If[ Head[#[[3]]]===Missing, 0, (* else *) StringCases[#[[3]],DigitCharacter..] /. x_/;Length[x]>0:>ToExpression[x] ] /. {{x_}:>x,{}->0} }&, Lookup[ Values[GOTRawData["costars.json"]], {"title","actors","year"} ] ], -Length[#[[2]]]& ]; 


Nous allons maintenant calculer pour chaque acteur dans quels films il a joué et mettre le résultat dans la variable $ GOTCharactersFilmography .

 $GOTCharactersFilmography= Association@ SortBy[ Select[ #-> SortBy[ Cases[ $GOTCharactersInAnotherFilms, {film_,list_/;MemberQ[list,#],year_}:> {film,year} ], -Last[#]& ]&/@ $GOTCharacters, Length[#[[2]]]>0& ], -Length[#[[2]]]& ]; 


Voyons dans les films quelles années de sortie les acteurs de «Game of Thrones» ont joué:

 GOTInfographicsPoster[ #1, "      ,     \" \"", "ImageSize"->800 ]&@ DateHistogram[ DeleteMissing@ Lookup[Values[GOTRawData["costars.json"]],"year"], ColorFunction->"Rainbow", ImageSize->800, Background->GrayLevel[0.95] ] 


image

Films dans lesquels les acteurs les plus populaires de Game of Thrones ont joué:



 GOTInfographicsPoster[ #1, "    20  \"\"  \" \"", "ImageSize"->1500 ]&@ Grid[ { #/.$characterCardFull, TextCell[ Grid[ KeyValueMap[ {#1/.{0->"."},Row[#2," - "]}&, GroupBy[#,Last,#[[;;,1]]&] ], Alignment->{{Center,Left},{Top,Top}} ], FontFamily->"Open Sans Light", FontSize->14, TextAlignment->Left, LineSpacing->{0.9,0,0} ]&@ $GOTCharactersFilmography[#] }&/@ $GOTCharacters[[1;;20]], Alignment->{{Center,Left},Center}, ItemSize->{{20,70},Automatic}, Background->GrayLevel[0.95], Dividers->{None,{None,{Gray},None}} ] 


image
( original )

Acteurs de Game of Thrones dans Harry Potter



 GOTInfographicsPoster[ #," \" \"  \" \"","ImageSize"->1500 ]&@ Grid[ { Style[#[[1]],FontFamily->"Open Sans Light",16,Bold], Row[Magnify[#,0.75]&/@(#[[2]]/.$characterCardFull)," "] }&/@ SortBy[ Select[ $GOTCharactersInAnotherFilms, StringMatchQ[ ToLowerCase@#[[1]],___~~"harry potter"~~___ ]& ], -Last[#]& ][ [{1,-1,2,3,4,5,6,7}] ], Background->GrayLevel[0.95], ItemSize->{{25,70},Automatic}, Dividers->{None,{None,{LightGray},None}}, Alignment->{{Center,Left},Center} ] 


image

Acteurs de Game of Thrones dans Star Wars



 GOTInfographicsPoster[ #, " \" \"  \" \"", "ImageSize"->1100 ]&@ Grid[ { Style[#[[1]],FontFamily->"Open Sans Light",16,Bold], Row[Magnify[#,0.75]&/@(#[[2]]/.$characterCardFull)," "] }&/@ SortBy[ Select[ $GOTCharactersInAnotherFilms, StringMatchQ[ ToLowerCase@#[[1]],___~~"star wars"~~___ ]& ], -Last[#]& ], Background->GrayLevel[0.95], ItemSize->{{25,45},Automatic}, Dividers->{None,{None,{LightGray},None}}, Alignment->{{Center,Left},Center} ] 


image

Acteurs de Game of Thrones dans Pirates des Caraïbes



 GOTInfographicsPoster[ #, " \" \"  \"  \"", "ImageSize"->1300 ]&@ Grid[ { Style[#[[1]],FontFamily->"Open Sans Light",16,Bold], Row[Magnify[#,0.75]&/@(#[[2]]/.$characterCardFull)," "] }&/@ SortBy[ Select[ $GOTCharactersInAnotherFilms, StringMatchQ[ ToLowerCase@#[[1]],___~~"pirates of the"~~___ ]& ], -Last[#]& ], Background->GrayLevel[0.95], ItemSize->{{25,50},Automatic}, Dividers->{None,{None,{LightGray},None}}, Alignment->{{Center,Left},Center} ] 


image

Dans quels films / séries y a-t-il de nombreux acteurs de Game of Thrones



 GOTInfographicsPoster[ #, " ()       \" \"", "ImageSize"->2000 ]&@ Grid[ { Style[#[[1]],FontFamily->"Open Sans Light",16,Bold], Row[Magnify[#,0.75]&/@(#[[2]]/.$characterCardFull)," "] }&/@ SortBy[ Select[$GOTCharactersInAnotherFilms,Length[#[[2]]]>5&], -Length[#[[2]]]& ], Background->GrayLevel[0.95], ItemSize->{{20,100},Automatic}, Dividers->{None,{None,{LightGray},None}}, Alignment->{{Center,Left},Center} ] 


image
( original )

Les acteurs de Game of Thrones sont-ils étroitement liés



Nous allons construire un graphique montrant dans combien d'images (films, séries, etc.) les acteurs de Game of Thrones ont joué ensemble. Plus la ligne est épaisse et rouge, plus les images de cette paire d'acteurs sont courantes. ( Original )

 GOTInfographicsPoster[ #, "      \" \"", "ImageSize"->2500 ]&@ ( ConnectedGraphComponents[ GOTGraphPlot[#,1,"ImageSize"->2500,"MaxThickness"->20] ][ [1] ]&@ Tally[ UndirectedEdge@@@ Map[ Sort, Flatten[ Map[ Subsets[#,{2}]&, Select[ Values[GOTRawData["costars.json"]][ [ ;;, "actors", All, "characterName" ] ], Length[#]>1& ] ], 1 ] ] ] ) 


image

Conversations dans Game of Thrones



Beaucoup aiment The Game of Thrones pour le dialogue. Voyons dans quelle série d'entre eux le plus:

 GOTInfographicsPoster[ #, " ,    \" \"", "ImageSize"->1000 ]&@ BarChart[ #, BarSpacing->{0.05,1}, AspectRatio->1/2, ImageSize->1000, ChartLabels->{Keys[#],Range[10]}, ColorFunction->Function[{x},ColorData["Rainbow"][x]], GridLines->{None,Range[0,10000,500]}, FrameLabel-> Map[ Style[#,FontFamily->"Open Sans",20,Bold]&, {"    ","  "} ], Frame->True, Background->GrayLevel[0.95], PlotRangePadding->0, PlotRange->All ]&@ GroupBy[ Map[ {#[[1;;2]],Total[#[[3]][[;;,"count"]]]}&, Lookup[ GOTRawData["wordcount.json"]["count"], {"seasonNum","episodeNum","text"} ] ], #[[1,1]]&, #[[;;,2]]& ] 


image

Nous découvrirons qui est le plus «bavardeur» dans «Game of Thrones» - la réponse est tout à fait prévisible, mais la séparation de Tyrion est presque 2 fois supérieure au personnage le plus proche de lui.

 GOTInfographicsPoster[ #1, "     \" \"?", "ImageSize"->1500 ]&@ ( ( BarChart[ #1[[1;;All,1]], PlotRangePadding->0, BarSpacing->0.25, BarOrigin->Left, AspectRatio->1.9, ImageSize->1500, ChartLabels->#1[[1;;All,2]], Frame->True, GridLines->{Range[0,10^5,10^3],None}, ColorFunction->ColorData["Rainbow"], FrameLabel-> { {None,None}, Style[#,FontFamily->"Open Sans Light",16]&/@ { "  ", "  " } }, FrameTicks->{Automatic,{All,All}}, Background->GrayLevel[0.95] ]& )[ KeyValueMap[ {#2,#1/.$characterCardShortSmall}&, Select[ SortBy[ GroupBy[ Flatten[ GOTRawData["wordcount.json"]["count"][ [;;,"text"] ] ], #[["name"]]&, Total[#[[;;,"count"]]]& ], #& ], #>1000& ] ] ] ) 


image

Enfin, construisez un diagramme montrant la durée de l'écran et le nombre de mots prononcés ensemble par le personnage:

 GOTInfographicsPoster[ #1, "         \" \"\n( )", "ImageSize"->2000 ]&@ Module[{data1,data2,intersection}, data1= Merge[ $GOTEpisodeData[[;;,"ScreenTime"]],Total[Flatten[#]]& ]; data2= GroupBy[ Flatten[ GOTRawData["wordcount.json"]["count"][[;;,"text"]] ], #[["name"]]&, Total[#[[;;,"count"]]]& ]; intersection=Intersection[Keys@data1,Keys@data2]; ListPlot[ Callout[{data1[#],data2[#]},#/.$characterCardShortSmall]&/@ intersection, AspectRatio->1, ImageSize->2000, PlotRange->All, ScalingFunctions->{"Log10","Log10"}, GridLines-> { {10,100}~Join~Range[0,10^5,1000], {10,100}~Join~Range[0,10^5,1000] }, Frame->True, FrameTicks->All, FrameLabel-> ReplaceAll[ { {1,1}"  ", {1,1}"  , " }, x_String:>Style[x,FontFamily->"Open Sans",20,Bold] ], Background->GrayLevel[0.95], PlotMarkers->{Automatic,Small}, GridLinesStyle->GrayLevel[0.85] ] ] 


image
( original )

Sexe des personnages de Game of Thrones: qui est le plus, hommes ou femmes?



Sexe par nom de personnage:

 $gender= <| Flatten[ KeyValueMap[ Thread[#2->#1]&,GOTRawData["characters-gender-all.json"] ] ] ~ Join ~ { "Aegon Targaryen"->"male", "Aerys II Targaryen"->"male", "Archmaester Marwyn"->"male", "Baratheon Guard"->"male", "Brandon Stark"->"male", "Child of the Forest"->"male", "Elia Martell"->"female", "Eon Hunter"->"male", "Goldcloak #1"->"male", "Goldcloak #2"->"male", "Knight of House Frey"->"male", "Knight of House Lynderly"->"male", "Kurleket"->"male", "Lannister Guardsman"->"male", "Lord Galbart Glover"->"male", "Male Prostitute"->"male", "Masha Heddle"->"female", "Meereen Slave Master"->"male", "Mikken"->"male", "Night's Watch Deserter"->"male", "Night's Watch Messenger"->"male", "Night's Watch Officer"->"male", "Pentoshi Servant"->"male", "Rhaella Targaryen"->"female", "Rhaenys Targaryen"->"female", "Stark Bannerman"->"male", "Stark Guard"->"male", "Wedding Band"->"male", "White Walker #2"->"male", "Willis Wode"->"male", "Young Ned"->"male" }|> 


Le ratio des personnages de «Game of Thrones» par sexe - il est clair qu'il y a 3 hommes par femme. Il semble parfois que les personnages masculins ne soient entourés que de personnages féminins puissants).

 GOTInfographicsPoster[ #,"       " ]&@ Module[{labels,counts,percents}, {labels,counts}=Transpose[Tally[Values[$gender]]]; percents=PercentForm/@N[counts/Total[counts]]; PieChart[ counts, ChartLabels-> Map[ Style[ Row[#,"\n"], 20, Bold, Black, FontFamily->"Open Sans" ]&, Transpose[{labels,counts,percents}] ], ChartStyle->{LightRed,LightBlue}, ImageSize->600, Background->GrayLevel[0.95] ] ] 

image

Je vous rappelle qu'ici, vous pouvez télécharger l'article d'origine avec toutes les fonctions auxiliaires et les données source.

Pour la coopération - écrivez un message personnel sur Habré ou dans mon groupe VKontakte .
Chaîne YouTube - webinaires et vidéos de formation.
Inscription aux nouveaux cours . Cours en ligne prêt .

Source: https://habr.com/ru/post/fr451640/


All Articles