39

これはウィッシュ リストのようなものかもしれませんが、確かではありません (つまり、これが発生するには の作成が必要になるかもしれませんgeom_pie)。今日見た地図 ( LINK ) には、ここに見られるような円グラフが表示されています。 ここに画像の説明を入力

円グラフのメリットについて議論したくありません。

以下に、ニューヨーク州の地図を作成するためのマッピング データと、郡ごとの人種のパーセンテージに関する純粋に作成されたデータを含むデータ セット (ドロップ ボックスからロード) を提供しました。この人種構成は、メイン データ セットとのマージとして、およびキーと呼ばれる別のデータ セットとして与えました。また、郡名の中央揃えに関する別の投稿 (ここ) での Bryan Goodrich の回答も、この概念に役立つと思います。

上記のマップをggplot2で作成するにはどうすればよいですか?

円グラフのないデータセットとマップ:

load(url("http://dl.dropbox.com/u/61803503/nycounty.RData"))
head(ny); head(key)  #view the data set from my drop box
library(ggplot2)
ggplot(ny, aes(long, lat, group=group)) +  geom_polygon(colour='black', fill=NA)

#  Now how can we plot a pie chart of race on each county 
#  (sizing of the pie would also be controllable via a size 
#  parameter like other `geom_` functions).

あなたのアイデアを前もってありがとう。

編集:ジャンクチャートで、このタイプの機能を叫ぶ 別のケースを見ました:ここに画像の説明を入力

4

5 に答える 5

31

3年後、これは解決されます。私はいくつかのプロセスをまとめました。@Guangchuang Yu の優れたggtreeパッケージのおかげで、これはかなり簡単に実行できます。(2015 年 9 月 3 日) の時点で、バージョン 1.0.18 のggtreeをインストールする必要がありますが、これらは最終的にそれぞれのリポジトリに細分化されます。

ここに画像の説明を入力

これを作成するために、次のリソースを使用しました (リンクから詳細が得られます)。

  1. ggtree ブログ
  2. ggplot の凡例を移動する
  3. 正しい ggtree バージョン
  4. 多角形のセンタリング

コードは次のとおりです。

load(url("http://dl.dropbox.com/u/61803503/nycounty.RData"))
head(ny); head(key)  #view the data set from my drop box

if (!require("pacman")) install.packages("pacman")
p_load(ggplot2, ggtree, dplyr, tidyr, sp, maps, pipeR, grid, XML, gtable)

getLabelPoint <- function(county) {Polygon(county[c('long', 'lat')])@labpt}

df <- map_data('county', 'new york')                 # NY region county data
centroids <- by(df, df$subregion, getLabelPoint)     # Returns list
centroids <- do.call("rbind.data.frame", centroids)  # Convert to Data Frame
names(centroids) <- c('long', 'lat')                 # Appropriate Header

pops <-  "http://data.newsday.com/long-island/data/census/county-population-estimates-2012/" %>%
     readHTMLTable(which=1) %>%
     tbl_df() %>%
     select(1:2) %>%
     setNames(c("region", "population")) %>%
     mutate(
         population = {as.numeric(gsub("\\D", "", population))},
         region = tolower(gsub("\\s+[Cc]ounty|\\.", "", region)),
         #weight = ((1 - (1/(1 + exp(population/sum(population)))))/11) 
         weight = exp(population/sum(population)),
         weight = sqrt(weight/sum(weight))/3
     )


race_data_long <- add_rownames(centroids, "region") %>>%
    left_join({distinct(select(ny, region:other))}) %>>%
    left_join(pops) %>>%
    (~ race_data) %>>%
    gather(race, prop, white:other) %>%
    split(., .$region)

pies <- setNames(lapply(1:length(race_data_long), function(i){
    ggplot(race_data_long[[i]], aes(x=1, prop, fill=race)) +
        geom_bar(stat="identity", width=1) + 
        coord_polar(theta="y") + 
        theme_tree() + 
        xlab(NULL) + 
        ylab(NULL) + 
        theme_transparent() +
        theme(plot.margin=unit(c(0,0,0,0),"mm"))
}), names(race_data_long))


e1 <- ggplot(race_data_long[[1]], aes(x=1, prop, fill=race)) +
        geom_bar(stat="identity", width=1) + 
        coord_polar(theta="y") 

leg1 <- gtable_filter(ggplot_gtable(ggplot_build(e1)), "guide-box") 


p <- ggplot(ny, aes(long, lat, group=group)) +  
    geom_polygon(colour='black', fill=NA) +
    theme_bw() +
    annotation_custom(grob = leg1, xmin = -77.5, xmax = -78.5, ymin = 44, ymax = 45) 



n <- length(pies)

for (i in 1:n) {

    nms <- names(pies)[i]
    dat <- race_data[which(race_data$region == nms)[1], ]
    p <- subview(p, pies[[i]], x=unlist(dat[["long"]])[1], y=unlist(dat[["lat"]])[1], dat[["weight"]], dat[["weight"]])

}

print(p)
于 2015-09-03T15:58:11.940 に答える
15

この機能は ggplot にあるはずです。すぐに ggplot に来ると思いますが、現在はベース プロットで利用できます。比較のためにこれを投稿しようと思いました。

load(url("http://dl.dropbox.com/u/61803503/nycounty.RData"))

library(plotrix)
e=10^-5
myglyff=function(gi) {
floating.pie(mean(gi$long),
             mean(gi$lat),
             x=c(gi[1,"white"]+e,
                 gi[1,"black"]+e,
                 gi[1,"hispanic"]+e,
                 gi[1,"asian"]+e,
                 gi[1,"other"]+e),
              radius=.1) #insert size variable here
}

g1=ny[which(ny$group==1),]
plot(g1$long,
     g1$lat,
     type='l',
     xlim=c(-80,-71.5),
     ylim=c(40.5,45.1))

myglyff(g1)

for(i in 2:62)
  {gi=ny[which(ny$group==i),]
    lines(gi$long,gi$lat)
    myglyff(gi)
  }

また、基本グラフィックスでこれを行うより洗練された方法があるかもしれません (おそらくあります)。

ニューヨークパイです!!

ご覧のとおり、これには解決する必要のある問題がかなりあります。郡の塗りつぶしの色。円グラフが小さすぎるか、重なり合う傾向があります。緯度と経度は投影をとらないため、郡のサイズは歪んでいます。

いずれにせよ、私は他の人が何を考え出すことができるかに興味があります。

于 2012-07-31T20:37:27.760 に答える