2012-07-25 68 views
8

我想达到以下结果:整数变量的气泡图,其中最大气泡的直径为1(在x或y轴刻度上)?

  1. 重新调节气泡的大小,使得所述最大气泡具有直径为1的 (上取具有在x 轴和y轴的多个压缩级)。
  2. 重新调节气泡的大小,使得最小气泡的直径为1毫米
  3. 具有与第一和最后一个点的最小非零 频率和最大频率的图例。

我已经能够做的最好的如下,但我需要一个更通用的解决方案,其中计算maxSize的值而不是硬编码。如果我是在传统的R图中做的话,我会使用par(“pin”)来计算出绘图区域的大小并向后工作,但我无法弄清楚如何使用ggplot2来访问这些信息。有什么建议么?

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) 

这里是什么样子至今: enter image description here

+0

你是如何在你的榜样到达 “20” 为'maxSize'? – A5C1D2H2I1M1N2O1R2T1 2012-08-16 08:02:09

回答

7

当没有ggplot,格子或其他的高级包,似乎没有做微调小时的工作中,我总是回复到基本图形。下面的代码为你提供了你想要的,并且之后我有另一个基于我如何绘制它的例子。

但请注意,我已将最大半径设置为1厘米,但只是将size.range/2分开以获得直径。我只是认为半径给了我更好的情节,你可能会想调整的东西无论如何。

size.range <- c(.1, 1) # Min and max radius of circles, in cm 

# Calculate the relative radius of each circle 
radii <- sqrt(agData$freq) 
radii <- diff(size.range)*(radii - min(radii))/diff(range(radii)) + size.range[1] 

# Plot in two panels 
mar0 <- par("mar") 
layout(t(1:2), widths=c(4,1)) 

# Panel 1: The circles 
par(mar=c(mar0[1:3],.5)) 
symbols(agData$class, agData$drv, radii, inches=size.range[2]/cm(1), bg="black") 

# Panel 2: The legend 
par(mar=c(mar0[1],.5,mar0[3:4])) 
symbols(c(0,0), 1:2, size.range, xlim=c(-4, 4), ylim=c(-2,4), 
     inches=1/cm(1), bg="black", axes=FALSE, xlab="", ylab="") 
text(0, 3, "Freq") 
text(c(2,0), 1:2, range(agData$freq), col=c("black", "white")) 

# Reset par settings 
par(mar=mar0) 

Plot suggestion 1

现在如下我的建议。最大的圆的半径为1厘米,圆的面积与agData$freq成正比,而不强制最小圆的大小。我个人认为这是更容易阅读(代码和数字),看起来更好。

with(agData, symbols(class, drv, sqrt(freq), 
    inches=size.range[2]/cm(1), bg="black")) 
with(agData, text(class, drv, freq, col="white")) 

Plot suggestion 2