I am using a strategy to plot summary (totals) rows in a heatmap using geom_tile, which involves creating extra rows in the data_frame for row and
The problem here is that in ggplot, in principle, an aesthetic can only have one scale. So fill can only have one scale. However, there are some ways to avoid this, for example by using color for a second scale. Alternatively, you could mess around with grobs to get the job done, as per shayaa's comment.
Here are some possible examples, using geom_point to display the totals:
base_plot <-
ggplot(df_foo_aug, aes(x = Right, y = Left)) +
geom_tile(data = filter(df_foo_aug, Right != 'Total', Left != 'Total'),
aes(fill = Value)) +
coord_equal() +
facet_wrap(~ Group1) +
scale_y_discrete(limits = rev(sort(unique(df_foo_aug$Left)))) +
theme_classic() + theme(strip.background = element_blank())
A fairly standard approach:
base_plot +
geom_point(data = filter(df_foo_aug, Right == 'Total' | Left == 'Total'),
aes(col = Value), size = 9.2, shape = 15) +
scale_color_gradient('Total', low = 'black', high = 'red')
Using color scales with a wider perceptual range:
base_plot +
geom_point(data = filter(df_foo_aug, Right == 'Total' | Left == 'Total'),
aes(col = Value), size = 9.2, shape = 15) +
viridis::scale_fill_viridis(option = 'B') +
viridis::scale_color_viridis('Total', option = 'D')
Also mapping size to the total Value:
base_plot +
geom_point(data = filter(df_foo_aug, Right == 'Total' | Left == 'Total'),
aes(col = Value, size = Value)) +
scale_size_area(max_size = 8, guide = 'none') +
viridis::scale_fill_viridis(option = 'B') +
viridis::scale_color_viridis('Total', option = 'D')
Personally, I quite like the last one.
One final improvement would be to move the y-axis up, for which I would recommend the cowplot package.