Bubble chart for integer variables where the largest bubble has a diameter of 1 (on the x or y axis scale)?

Viewed 1640

I want to achieve the following outcomes:

  1. Rescale the size of the bubbles such that the largest bubble has a diameter of 1 (on whichever has the more compressed scale of the x and y axes).
  2. Rescale the size of the bubbles such that the smallest bubble has a diameter of 1 mm
  3. Have a legend with the first and last points the minimum non-zero frequency and the maximum frequency.

The best I have been able to do is as follows, but I need a more general solution where the value of maxSize is computed rather than hard-coded. If I was doing it in the traditional R plots I would use par("pin") to work out the size of plot area and work backwards, but I cannot figure out how to access this information with ggplot2. Any suggestions?

library(ggplot2)
agData = data.frame(
  class=rep(1:7,3),
  drv = rep(1:3,rep(7,3)),
  freq = as.numeric(xtabs(~class+drv,data = mpg))
)

agData = agData[agData$freq != 0,]
rng = range(agData$freq)
mn = rng[1]
mx = rng[2]
minimumArea = mx - mn
maxSize = 20
minSize = max(1,maxSize * sqrt(mn/mx))
qplot(class,drv,data = agData, size = freq) + theme_bw() + 
  scale_area(range = c(minSize,maxSize), 
             breaks = seq(mn,mx,minimumArea/4), limits = rng) 

Here is what it looks like so far: enter image description here

1 Answers
Related