3

警告:对 R 来说还是新手。

我正在尝试在 R 中构建一些图表(特别是气泡图),以显示对竞选活动的政治捐款。这个想法是 x 轴将显示贡献的数量,y 轴将显示贡献的数量,以及在此级别贡献的总金额的圆圈面积。

数据如下所示:

CTRIB_NAML    CTRIB_NAMF    CTRIB_AMT    FILER_ID
John          Smith         $49          123456789

FILER_ID字段用于过滤特定候选人的数据。

我使用以下函数将此数据框转换为气泡图(感谢此处此处的帮助)。

vals<-sort(unique(dfr$CTRIB_AMT))
sums<-tapply( dfr$CTRIB_AMT, dfr$CTRIB_AMT, sum)
counts<-tapply( dfr$CTRIB_AMT, dfr$CTRIB_AMT, length)

symbols(vals,counts, circles=sums, fg="white", bg="red", xlab="Amount of Contribution", ylab="Number of Contributions")
text(vals, counts, sums, cex=0.75)

但是,这会导致 x 轴上的间隔过多。总共有几百万条记录,为一些候选人划分仍然可能导致大量数据。如何将绝对贡献转换为范围?例如,我如何将它们分组vals为范围,例如 0-10、11-20、21-30 等?

- - 编辑 - -

在评论之后,我可以转换vals为数字,然后分割成间隔,但我不确定我如何将它组合回气泡图语法。

new_vals <- as.numeric(as.character(sub("\\$","",vals)))
new_vals <- cut(new_vals,100)

但重新绘制:

symbols(new_vals,counts, circles=sums)

是荒谬的 - 所有值在 x 轴上排列为零。

4

1 回答 1

1

既然您已经将 vals 合并为一个因子cut,您可以tapply再次使用这些新的中断来查找计数和总和。例如:

counts = tapply(dfr$CTRIB_AMT, new_vals, length)
sums   = tapply(dfr$CTRIB_AMT, new_vals, sum)

但是,对于这种类型的事情,您可能会发现plyrandggplot2包很有帮助。这是一个完整的可重现示例:

require(ggplot2)

# Options
n = 1000
breaks = 10

# Generate data
set.seed(12345)
CTRIB_NAML = replicate(n, paste(letters[sample(10)], collapse=''))
CTRIB_NAMF = replicate(n, paste(letters[sample(10)], collapse=''))
CTRIB_AMT  = paste('$', round(runif(n, 0, 100), 2), sep='')
FILER_ID   = replicate(10, paste(as.character((0:9)[sample(9)]), collapse=''))[sample(10, n, replace=T)]

dfr = data.frame(CTRIB_NAML, CTRIB_NAMF, CTRIB_AMT, FILER_ID)

# Format data
dfr$CTRIB_AMT = as.numeric(sub('\\$', '', dfr$CTRIB_AMT))
dfr$CTRIB_AMT_cut = cut(dfr$CTRIB_AMT, breaks)

# Summarize data for plotting
plot_data = ddply(dfr, 'CTRIB_AMT_cut', function(x) data.frame(count=nrow(x), total=sum(x$CTRIB_AMT)))

# Make plot
dev.new(width=4, height=4)
qplot(CTRIB_AMT_cut, count, data=plot_data, geom='point', size=total) + opts(axis.text.x=theme_text(angle=90, hjust=1))

在此处输入图像描述

于 2011-10-13T22:31:08.897 回答