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

を使用して val を因子にビニングしたので、もう一度 を使用して、これらの新しいブレークを使用してカウントと合計を見つけるcutことができます。tapply例えば:

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

ただし、このタイプの場合は、plyrおよびggplot2パッケージが役立つ場合があります。完全に再現可能な例を次に示します。

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 に答える