8

我想实现以下结果:

  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) 

这是到目前为止的样子: 在此处输入图像描述

4

1 回答 1

7

当没有 ggplot、lattice 或其他高级软件包似乎在没有数小时微调的情况下完成这项工作时,我总是恢复到基本图形。下面的代码让你得到你想要的,在它之后我有另一个基于我如何绘制它的例子。

但是请注意,我已将最大半径设置为 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)

剧情建议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"))

剧情建议2

于 2012-08-16T11:44:53.957 回答