17

次の問題に直面しています。いくつかの極端な値がgeom_rasterプロットのカラースケールを支配しています。例はおそらくより明確です (この例は最近の ggplot2 バージョンでのみ機能することに注意してください。私は 0.9.2.1 を使用しています):

library(ggplot2)
library(reshape)
theme_set(theme_bw())

m_small_sd = melt(matrix(rnorm(10000), 100, 100))
m_big_sd = melt(matrix(rnorm(100, sd = 10), 10, 10))
new_xy = m_small_sd[sample(nrow(m_small_sd), nrow(m_big_sd)), c("X1","X2")]
m_big_sd[c("X1","X2")] = new_xy
m = data.frame(rbind(m_small_sd, m_big_sd))
names(m) = c("x", "y", "fill")

ggplot(m, aes_auto(m)) + geom_raster() + scale_fill_gradient2()

ここに画像の説明を入力

現在、特定の分位点の値をその分位点に等しく設定することで、これを解決しています。

qn = quantile(m$fill, c(0.01, 0.99), na.rm = TRUE)
m = within(m, { fill = ifelse(fill < qn[1], qn[1], fill)
                fill = ifelse(fill > qn[2], qn[2], fill)})

ここに画像の説明を入力

これは、最適なソリューションとは思えません。私がやりたいのは、色を値の範囲に非線形にマッピングすることです。つまり、より多くの観測でより多くの色が領域に存在します。spplotパッケージから使用classIntervalsしてclassInt、適切なクラス境界を計算できます。

library(sp)
library(classInt)
gridded(m) = ~x+y
col = c("#EDF8B1", "#C7E9B4", "#7FCDBB", "#41B6C4", 
        "#1D91C0", "#225EA8", "#0C2C84", "#5A005A")
at = classIntervals(m$fill, n = length(col) + 1)$brks
spplot(m, at = at, col.regions = col)

ここに画像の説明を入力

私の知る限りでは、この色のクラス間隔へのマッピングを のようにハードコーディングすることはできませんspplot。軸を変換できfillますが、変数に負の値があるため、fill機能しません。

だから私の質問は: ggplot2 を使用してこの問題の解決策はありますか?

4

1 に答える 1

21

ggplot (0.9.2.1) と scales (0.2.2) が必要なものすべてをもたらすようです (元のm):

library(scales)

qn = quantile(m$fill, c(0.01, 0.99), na.rm = TRUE)
qn01 <- rescale(c(qn, range(m$fill))) 

ggplot(m, aes(x = x, y = y, fill = fill)) + 
   geom_raster() + 
   scale_fill_gradientn (
      colours = colorRampPalette(c("darkblue", "white", "darkred"))(20),
      values = c(0, seq(qn01[1], qn01[2], length.out = 18), 1)) +
   theme(legend.key.height = unit (4.5, "lines"))

結果のプロット

于 2012-10-11T11:18:30.217 に答える