# Get line placements to divide dimensions
# Reverse them to match alphabetical order of dimensions top to bottom
# Get cumulative sums to space them out across graph
# Then add 0.5 to each to put them in between cells
counts <- ordered_framework %>%
group_by(dimension) %>%
summarize(count = n()) %>%
pull(count)
hline_placements <- counts %>%
rev() %>%
cumsum() %>%
{. + 0.5}
hline_placements
vline_placements <- counts %>%
cumsum() %>%
{. + 0.5}
vline_placements
# Reorder our df in proper metric order
metric_order <- ordered_framework %>%
pull(metric)
df <- df %>%
select(fips, any_of(metric_order)) %>%
select(rev(everything()))
get_str(df)
# Create matrix of values
mat <- df %>%
na.omit() %>%
select(-fips) %>%
as.matrix()
# Get correlations
cor <- rcorr(mat, type = 'spearman')
# Melt correlation values and rename columns
cor_r <- reshape::melt(cor$r) %>%
setNames(c('var_1', 'var_2', 'value'))
# Save p values
cor_p <- melt(cor$P)
p.value <- cor_p$value
# Absolute values of correlations
cor_r <- cor_r %>%
mutate(value = abs(value))
# Pulling out significant p values
cor_r <- cor_r %>%
mutate(p_value = ifelse(var_1 == var_2, 1, cor_p$value)) %>% # Make diagonal line non-significant
mutate(significant = ifelse(p_value <= 0.05, TRUE, FALSE))
# Reverse the order to use for x-axis labels (start at Economics)
reversed_metric_order <- rev(metric_order)
# Create a reversed version of the cor_r data frame for the x-axis
cor_r <- cor_r %>%
mutate(
var_1 = factor(var_1, levels = reversed_metric_order)
)
# Remove last cols []
get_str(cor_r)
cor_r <- cor_r %>%
filter(var_1 != var_2)
# filter(!(var_1 == "Average Weekly Wages" & var_2 == "Violent Crime Rate")) %>%
# filter(!(var_1 == "Violent Crime Rate" & var_2 == "Average Weekly Wages"))
get_str(cor_r)
# Only set values for lower triangle of the matrix
cor_r <- cor_r %>%
mutate(
row_idx = as.integer(factor(var_1, levels = reversed_metric_order)),
col_idx = as.integer(factor(var_2, levels = reversed_metric_order)),
value = ifelse(row_idx <= col_idx, NA, value) # Set upper triangle to NA
) %>%
select(-row_idx, -col_idx) # Remove temporary columns
# Pasting dimension colors to metrics
colored_labels <- ordered_framework %>%
mutate(
label = paste0(
"<span style='color:",
dp_text_palette[dimension],
"'>",
to_title_case(str_replace_all(metric, "_", " ")),
"</span>"
)
) %>%
select(metric, label) %>%
deframe()
## Removing topmost y axis label and rightmost x axis label
# Create modified label vectors
x_labels <- colored_labels
x_labels[metric_order[length(metric_order)]] <- "" # remove last x-axis label
y_labels <- colored_labels
y_labels[reversed_metric_order[length(reversed_metric_order)]] <- "" # Blank topmost y-axis label
# Create tick vectors (TRUE = show tick, FALSE = hide tick)
x_ticks <- rep(TRUE, length(metric_order))
x_ticks[length(metric_order)] <- FALSE # Hide rightmost x-axis tick
y_ticks <- rep(TRUE, length(reversed_metric_order))
y_ticks[length(reversed_metric_order)] <- FALSE # Hide topmost y-axis tick
# Dummy data frame for dimension legend
dimension_legend_df <- tibble(
x = -Inf,
y = -Inf,
dimension = factor(names(dp_text_palette), levels = names(dp_text_palette))
)
# Make heatmap
corplot <- ggplot(cor_r, aes(x = var_1, y = var_2)) +
# Color in significant correlations
geom_tile(
data = cor_r %>% filter(!is.na(value) & significant),
aes(fill = value)
) +
# Make non-significant correlations white
geom_tile(
data = cor_r %>% filter(!is.na(value) & !significant),
fill = "gray90"
) +
# Grid lines for lower triangle
geom_tile(
data = cor_r %>% filter(!is.na(value)),
color = "gray60",
linewidth = 0.2,
fill = NA
) +
geom_point(
data = dimension_legend_df,
aes(x = x, y = y, color = dimension),
shape = 15,
size = 5,
inherit.aes = FALSE,
show.legend = TRUE,
alpha = 0 # fully transparent points, so they don't show up
) +
scale_fill_gradient2(
low = "white",
high = "#1b7837",
midpoint = 0,
name = "Correlation",
na.value = "transparent"
) +
scale_color_manual(
values = dp_text_palette,
labels = str_to_title(names(dp_text_palette)),
name = "Dimension"
) +
# Legend overrides
guides(
fill = guide_colorbar(
title = "Correlation",
order = 1
),
color = guide_legend(
override.aes = list(shape = 15, size = 5, alpha = 1),
nrow = 2,
order = 2
)
) +
# Horizontal Lines
geom_segment(
x = 0,
xend = vline_placements[4],
y = hline_placements[1],
yend = hline_placements[1]
) +
geom_segment(
x = 0,
xend = vline_placements[3],
y = hline_placements[2],
yend = hline_placements[2]
) +
geom_segment(
x = 0,
xend = vline_placements[2],
y = hline_placements[3],
yend = hline_placements[3]
) +
geom_segment(
x = 0,
xend = vline_placements[1],
y = hline_placements[4],
yend = hline_placements[4]
) +
# Vertical Lines
geom_segment(
x = vline_placements[1],
xend = vline_placements[1],
y = 0,
yend = hline_placements[4]
) +
geom_segment(
x = vline_placements[2],
xend = vline_placements[2],
y = 0,
yend = hline_placements[3]
) +
geom_segment(
x = vline_placements[3],
xend = vline_placements[3],
y = 0,
yend = hline_placements[2]
) +
geom_segment(
x = vline_placements[4],
xend = vline_placements[4],
y = 0,
yend = hline_placements[1]
) +
# Correct x and y axis labels with the order
scale_x_discrete(
labels = x_labels,
limits = metric_order
) +
scale_y_discrete(
labels = y_labels,
limits = reversed_metric_order
) +
theme(
axis.text.x = element_markdown(angle = 45, hjust = 1),
axis.text.y = element_markdown(),
axis.text = element_text(family = "Times New Roman"),
axis.title = element_blank(),
axis.ticks.length.x = unit(ifelse(x_ticks, 0.15, 0), "cm"),
axis.ticks.length.y = unit(ifelse(y_ticks, 0.15, 0), "cm"),
plot.title = element_text(hjust = 0),
legend.position = "top",
legend.title.position = "top",
legend.justification = "center",
legend.title = element_text(
size = 10,
family = "Times New Roman",
hjust = 0.5
),
legend.text = element_text(size = 9, family = "Times New Roman"),
legend.key = element_rect(fill = "transparent", colour = NA),
legend.background = element_rect(fill = "transparent", colour = NA),
plot.background = element_rect(fill = "transparent", colour = NA),
panel.background = element_rect(fill = "transparent", colour = NA)
)
ggsave(
plot = corplot,
filename = 'outputs/fig_corplot.png',
height = 9,
width = 9,
dpi = 300,
bg = 'white'
)