Visualize Personality of Your Favourite Fictional Character
Introduction
The dataset I have used is from TidyTuesday by courtesy of tanya shapiro
Project collecting and analyzing data from the Open-Source Psychometrics Project. The datasets include information about characters from different universes and their respective personality traits.
About the Open-Source Psychometrics Project (excerpt from website):
This website provides a collection of interactive personality tests with detailed results that can be taken for personal entertainment or to learn more about personality assessment. These tests range from very serious and widely used scientific instruments popular psychology to self produced quizzes. A special focus is given to the strengths, weaknesses and validity of the various systems
Data set includes information on 890 characters total. Information for the entire project can also be downloaded directly from opensychometrics.org. Note, the full zip files are codified — i.e. characters and questions are expressed as varchar IDs and require lookups.
Let’s get started,
Code
p_stat <- readr::read_csv('https://raw.githubusercontent.com/rfordatascience/tidytuesday/master/data/2022/2022-08-16/psych_stats.csv')
Rows: 356489 Columns: 10
── Column specification ────────────────────────────────────────────────────────
Delimiter: ","
chr (6): char_id, char_name, uni_id, uni_name, question, personality
dbl (4): avg_rating, rank, rating_sd, number_ratings
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
There are total 100 tv shows and movies. You can choose your favorite show or a movie. In this post I am analyzing the personality traits of characters from the famous tv show “Friends”.
Filter data for Friends
# A tibble: 6 × 10
char_id char_name uni_id uni_name question personality avg_rating rank
<chr> <chr> <chr> <chr> <chr> <chr> <dbl> <dbl>
1 F2 Monica Geller F Friends messy/neat neat 95.7 9
2 F2 Monica Geller F Friends disorganiz… self-disci… 95.2 27
3 F2 Monica Geller F Friends diligent/l… diligent 93.9 87
4 F2 Monica Geller F Friends on-time/ta… on-time 93.8 34
5 F2 Monica Geller F Friends competitiv… competitive 93.6 56
6 F2 Monica Geller F Friends scheduled/… scheduled 93.4 23
# ℹ 2 more variables: rating_sd <dbl>, number_ratings <dbl>
We are focusing on the variables personality
and avg_rating.
There is total 727 types of personalities. I have chosen the most common ones. Let’s make new tidy data frame.
Code
df1 <- fri |>
select(-char_id, -uni_id, -uni_name, -question, -rank, -rating_sd, -number_ratings) |>
filter(personality %in% c("expressive","emotional","opinionated","soft","awkward","bold","dramatic","playful","warm","spontaneous")) |>
pivot_wider(names_from = personality, values_from = avg_rating,values_fn = list(avg_rating = mean))
head(df1)
# A tibble: 6 × 11
char_name opinionated emotional bold expressive dramatic playful warm
<chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 Monica Geller 81 72.7 71.8 70.0 60.6 64.7 54.2
2 Rachel Green 64.6 85.7 75.3 83.1 78.3 75.9 64.9
3 Chandler Bing 64.9 56.4 59.6 75.7 72.2 80.2 60.6
4 Joey Tribbiani 58 82.4 87.9 86.7 76.9 93.8 85.2
5 Phoebe Buffay 77.5 80.9 88.5 90.8 73.5 91.4 79.4
6 Ross Geller 84.2 66.7 NA 60.6 77.0 NA 53.3
# ℹ 3 more variables: awkward <dbl>, spontaneous <dbl>, soft <dbl>
Now, lets add images to this dataframe and make the data longer again.
Code
df1$image <- c("https://openpsychometrics.org/tests/characters/test-resources/pics/F/2.jpg",
"https://openpsychometrics.org/tests/characters/test-resources/pics/F/1.jpg",
"https://openpsychometrics.org/tests/characters/test-resources/pics/F/5.jpg",
"https://openpsychometrics.org/tests/characters/test-resources/pics/F/4.jpg",
"https://openpsychometrics.org/tests/characters/test-resources/pics/F/3.jpg",
"https://openpsychometrics.org/tests/characters/test-resources/pics/F/6.jpg")
Code
d1 <- df1 |>
mutate(image = circle_crop(image)) |>
pivot_longer(cols = c("expressive","emotional","opinionated","soft","awkward","bold","dramatic","playful","warm","spontaneous"),
names_to = 'personality',
values_to = 'value')
Now the plotting of graph.
Code
p1 <- d1 %>%
ggplot(aes(x=as.factor(personality), y=value, fill=personality)) +
geom_bar(stat="identity")+
ylim(-50,100) +
geom_image(mapping=aes(y=-50,x=1,image=image), size=0.25)+
scale_fill_manual(values = met.brewer("Johnson",10))+
coord_curvedpolar()+
facet_wrap(~char_name)+
theme_light()+
theme(panel.background = element_rect(fill="black", color="black")) +
theme(plot.background = element_rect(fill="black", color="black")) +
theme(panel.border = element_rect(color="black")) +
theme(strip.background = element_rect(fill="black", color="black"))+
theme(strip.background = element_rect(color="black", fill="#00CDCD", size=1, linetype="solid"))+
theme(strip.text.x = element_text(size = 20, color = "black", family = "Roboto"))+
theme(axis.text.x = element_text(size = 15, color = "white", family = "Roboto"))+
theme(axis.title.x = element_blank())+
theme(axis.title.y = element_blank())+
theme(axis.text.y = element_text(size=15, color = "#FFFFFF", family = 'Roboto'))+
theme(plot.title = element_text(color="#FFFFFF", size=60, face = "bold", hjust = 0.5, family = 'Roboto'))+
theme(plot.subtitle = element_text(color="#FFFFFF", size=30,hjust = 0.5, family = 'Roboto', face = "bold"))+
theme(legend.position = "none")+
theme(plot.margin = unit(c(1.5, 0.2, 3, 0.35), "cm"))+
labs(title = "F.R.I.E.N.D.S",
subtitle= "Personality Traits Scaled from 0-100")
p1
Game of Thrones Plot
There are 890 characters. You can visualize your favorite characters.
Happy Visualizing 📊📊