Вот опция, использующая table
.«Хитрость» заключается в том, чтобы преобразовать ваш второй столбец в коэффициент с соответствующими уровнями.
df1$X2 <- factor(df1$X2, levels = 1:20)
out <- as.data.frame(table(df1))
Вот способ, которым вы можете построить свой результат.
library(ggplot2)
ggplot(out, aes(X2, X1, fill = Freq)) + geom_tile() + coord_fixed()

данные
df1 <- structure(list(X1 = c(4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L,
4L, 4L, 4L, 4L, 12L, 12L, 12L, 12L, 13L, 13L, 13L, 13L, 13L,
13L, 13L, 13L), X2 = structure(c(5L, 5L, 5L, 6L, 10L, 10L, 10L,
10L, 9L, 9L, 10L, 10L, 6L, 5L, 3L, 4L, 4L, 4L, 8L, 10L, 9L, 12L,
11L, 13L, 12L, 11L), .Label = c("1", "2", "3", "4", "5", "6",
"7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17",
"18", "19", "20"), class = "factor")), .Names = c("X1", "X2"), row.names = c(NA,
-26L), class = "data.frame")