I really like to use interaction agstudy - I would probably try this first. But if you keep things unchanged, then:
4 factors can be combined with faceting and two axes. Then there are 2 x and y metrics: one option is a bubble chart with two metrics that differ in color or shape, or both (added jitter to make the figures less overlapping):
testm = melt(test, id=c('siteloc', 'modeltype', 'mth', 'yr')) # by color ggplot(testm, aes(x=siteloc, y=modeltype, size=value, colour=variable)) + geom_point(shape=21, position="jitter") + facet_grid(mth~yr) + scale_size_area(max_size=40) + scale_shape(solid=FALSE) + theme_bw()

#by shape testm$shape = as.factor(with(testm, ifelse(variable=='x', 21, 25))) ggplot(testm, aes(x=siteloc, y=modeltype, size=value, shape=shape)) + geom_point(position="jitter") + facet_grid(mth~yr) + scale_size_area(max_size=40) + scale_shape(solid=FALSE) + theme_bw()

# by shape and color ggplot(testm, aes(x=siteloc, y=modeltype, size=value, colour=variable, shape=shape)) + geom_point(position="jitter") + facet_grid(mth~yr) + scale_size_area(max_size=40) + scale_shape(solid=FALSE) + theme_bw()

UPDATE:
This is an attempt, based on Dominic’s first comment, to show that (x, y) is above or below the 1: 1 line, and how large is x / y or y / x - the blue triangle if x / y> 1, red circle otherwise (no melt needed in this case):
test$shape = as.factor(with(test, ifelse(x/y>1, 25, 21))) test$ratio = with(test, ifelse(x/y>1, x/y, y/x)) ggplot(test, aes(x=siteloc, y=modeltype, size=ratio, colour=shape, shape=shape)) + geom_point() + facet_grid(mth~yr) + scale_size_area(max_size=40) + scale_shape(solid=FALSE) + theme_bw()
