2017-07-26 5 views
3

に基づいてRでggmap介して空間ヒートマップを生成する:経度Iは、次のデータ点を用いchoroplethマップを生成したい値

  • 緯度
  • 価格

データセットはhttps://www.dropbox.com/s/0s05cl34bko7ggm/sample_data.csv?dl=0です。

私は、価格が高い地域と価格が低い地域を地図で表示したいと思います。ここに私のコードです

enter image description here

library(ggmap) 

map <- get_map(location = "austin", zoom = 9) 
data <- read.csv(file.choose(), stringsAsFactors = FALSE) 
data$average_rate_per_night <- as.numeric(gsub("[\\$,]", "", 
data$average_rate_per_night)) 
ggmap(map, extent = "device") + 
stat_contour(data = data, geom="polygon", 
      aes(x = longitude, y = latitude, z = average_rate_per_night, 
fill = ..level..)) + 
scale_fill_continuous(name = "Price", low = "yellow", high = "red") 

私は次のエラーメッセージになっている:

2: Computation failed in `stat_contour()`: 
Contour requires single `z` at each combination of `x` and `y`. 

を、私はそれはおそらく、この(サンプル画像)のようになります。これがどのように修正されるか、このタイプのヒートマップを生成するための他の方法についての助けを本当に感謝しています。私はの値段で、レコードの密度ではなく、に興味がありますのでご注意ください。

+0

あなたはコレラを探していますか?私が知っている限り、ほとんどのコレオラントは、経度/経度ではなく行政地域を使用します。 –

+0

私は同意します。私は正しい言葉が等高線マップでなければならないと思う。 – user709413

+0

1泊あたりの料金を平均化することで、「各組み合わせでの単一のエラー」エラーメッセージを取り除くことができました(いくつかのxとyの組み合わせには複数の平均レートがありました。しかし輪郭はまだ描かれませんでした。なぜかわからないし、それは言わなかった。等高線プロットはラスタのために機能するので、データフレームをラスタに変更したり欠損値を置き換えたりすることで、動作させることができます。私は今はあきらめて... –

答えて

2

あなたは輪郭アプローチを使用して主張なら、あなたは、yは、あなたのデータを持っている組み合わせを座標、あらゆる可能なxの値を提供する必要があります。これを達成するには、スペースをグリッドにしてビンごとの要約統計を生成することを強くお勧めします。

私はあなたが提供されたデータに基づいて、下の実施例を添付して:あなたはその後、目的の結果を得るためにビン幅ビンのサイズと輪郭で遊ぶことができます

library(ggmap) 
library(data.table) 

map <- get_map(location = "austin", zoom = 12) 
data <- setDT(read.csv(file.choose(), stringsAsFactors = FALSE)) 

# convert the rate from string into numbers 
data[, average_rate_per_night := as.numeric(gsub(",", "", 
     substr(average_rate_per_night, 2, nchar(average_rate_per_night))))] 

# generate bins for the x, y coordinates 
xbreaks <- seq(floor(min(data$latitude)), ceiling(max(data$latitude)), by = 0.01) 
ybreaks <- seq(floor(min(data$longitude)), ceiling(max(data$longitude)), by = 0.01) 

# allocate the data points into the bins 
data$latbin <- xbreaks[cut(data$latitude, breaks = xbreaks, labels=F)] 
data$longbin <- ybreaks[cut(data$longitude, breaks = ybreaks, labels=F)] 

# Summarise the data for each bin 
datamat <- data[, list(average_rate_per_night = mean(average_rate_per_night)), 
       by = c("latbin", "longbin")] 

# Merge the summarised data with all possible x, y coordinate combinations to get 
# a value for every bin 
datamat <- merge(setDT(expand.grid(latbin = xbreaks, longbin = ybreaks)), datamat, 
       by = c("latbin", "longbin"), all.x = TRUE, all.y = FALSE) 

# Fill up the empty bins 0 to smooth the contour plot 
datamat[is.na(average_rate_per_night), ]$average_rate_per_night <- 0 

# Plot the contours 
ggmap(map, extent = "device") + 
    stat_contour(data = datamat, aes(x = longbin, y = latbin, z = average_rate_per_night, 
       fill = ..level.., alpha = ..level..), geom = 'polygon', binwidth = 100) + 
    scale_fill_gradient(name = "Price", low = "green", high = "red") + 
    guides(alpha = FALSE) 

enter image description here

が、さらに滑らかな等高線プロットを得るためにグリッドに平滑化関数を適用することもできます。

+0

これはうまくいきます。私は 'binwidth'とbinのサイズで遊びます。 – user709413

+0

私は1つの質問があります - xbreaksとybreaksを経度と緯度として使用すべきですか?説明していただけますか? – user709413

+1

あなたのデータは一様に全領域をカバーしているわけではありません。つまり、サイズが不揃いのバケツになってしまうため、例のように等高線図が滑らかにならないことがあります。さらに、提案された手法を使用すると、すべてのx、yの組み合わせについて等高線プロットデータを確実に提供できます。 – gcons

0

あなたは同様の結果を達成するためにstat_summary_2d()またはstat_summary_hex()機能を使用することができます。これらの関数は、データをビン(xとyで定義)に分割し、各ビンのz値を与えられた関数に基づいて要約します。下の例では平均値を集計関数として選択し、マップは基本的に各ビンの平均価格を示しています。

注:average_rate_per_night変数を適切に扱い、数値に変換する必要がありました($記号とカンマを削除しました)。

library(ggmap) 
library(data.table) 

map <- get_map(location = "austin", zoom = 12) 
data <- setDT(read.csv(file.choose(), stringsAsFactors = FALSE)) 
data[, average_rate_per_night := as.numeric(gsub(",", "", 
    substr(average_rate_per_night, 2, nchar(average_rate_per_night))))] 

ggmap(map, extent = "device") + 
    stat_summary_2d(data = data, aes(x = longitude, y = latitude, 
     z = average_rate_per_night), fun = mean, alpha = 0.6, bins = 30) + 
    scale_fill_gradient(name = "Price", low = "green", high = "red") 

enter image description here

+0

助けてくれてありがとうが、このようなものを探している - https://sromalewski.files.wordpress.com/2011/09/bike-share-station-suggestions-091911- 913x1024.png – user709413

関連する問題