web-dev-qa-db-ja.com

viridisカラースケールの範囲を制限するにはどうすればよいですか?

2セットのデータがあり、viridisカラースケールのヒートマップを使用して提示したいと思います。最初のデータセットの場合、値の範囲は0〜1.2であり、見たい違いを簡単に確認できます。ただし、2番目のデータセットにはいくつかの外れ値があり、0から2の範囲になります。0と1の間の興味深い範囲の違いを確認するのが難しくなり、2つの画像を直接比較するのが難しくなりました。黄色(ビリディススケールの「最高」の色)でより高い値を表示しながら、ビリディスカラースケールを使用して0から1.2までのデータを表示する可能性はありますか?次に例を示します。

library(viridis)

#Create Data
DataSet1 <- expand.grid(x = 0:5, y = 0:5)
DataSet1$z <- runif(36, 0, 1.2)

DataSet2 <- expand.grid(x = 0:5, y = 0:5)
DataSet2$z <- runif(36, 0, 2)

#Plot Data
ggplot(DataSet1, aes(x, y, fill = z)) + 
  geom_tile() +
  scale_fill_viridis() +
  geom_text(aes(label = round(z, 2)), size = 2)

DataSet1:0.5と0.7の違いは簡単にわかります

enter image description here

ggplot(DataSet2, aes(x, y, fill = z)) + 
  geom_tile() +
  scale_fill_viridis() +
  geom_text(aes(label = round(z, 2)), size = 2)

DataSet2:0.5と0.7の違いを確認するのは困難です

enter image description here

6
Martin B.

任意の再スケーリング関数を定義できます。これが見栄えがよいかどうかはわかりませんが、凡例を使用して作業する必要がありますが、原則として、このメカニズムを使用すると、データ値を任意の方法でスケールにマッピングできます。

ggplot(DataSet2, aes(x, y, fill = z)) + 
  geom_tile() +
  scale_fill_viridis(rescaler = function(x, to = c(0, 1), from = NULL) {
    ifelse(x<1.2, 
           scales::rescale(x,
                           to = to,
                           from = c(min(x, na.rm = TRUE), 1.2)),
           1)}) +
  geom_text(aes(label = round(z, 2)), size = 2)

enter image description here

4
Claus Wilke

このようなものをお探しですか?

ggplot(DataSet2, aes(x, y, fill = z)) + 
  geom_tile() +
  scale_fill_gradient(low="green", high="red", limits=c(0, 1.2), 
                      na.value = "yellow") +
  geom_text(aes(label = round(z, 2)), size = 2)

enter image description here

viridisの色を使用して、ジャズーロの推奨事項に従ってください。

ggplot(DataSet2, aes(x, y, fill = z)) + 
  geom_tile() + 
  scale_fill_gradientn(colors = viridis_pal()(9), limits=c(0, 1.2), 
                       na.value = "#FDE725FF") + 
  geom_text(aes(label = round(z, 2)), size = 2)

enter image description here

2
Prradep

@ClausWilkeのソリューションは、凡例に示されているため優れていますが、特定のコードをあまり記述せずに、簡単なソリューションが必要な場合もあります。これもscalesパッケージに依存しています

ggplot(DataSet2, aes(x, y, fill = z)) + 
  geom_tile() +
  scale_fill_viridis(limits = c(0.2, 1), oob = scales::squish) +
  geom_text(aes(label = round(z, 2)), size = 2)

enter image description here

2
Mikko

これは必ずしも改善ではありませんが、次のようにして、より高い値を黄色で表示することができます。

DataSet2A <- DataSet2 %>% filter(z <= 1.2)
DataSet2B <- DataSet2 %>% filter(z > 1.2)

ggplot(DataSet2A, aes(x, y, fill = z)) +
  geom_tile() +
  scale_fill_viridis(begin = 0, end = .75) +
  geom_text(aes(label = round(z, 2)), size = 2) +
  geom_tile(data = DataSet2B, aes(x, y), fill = "yellow")

enter image description here

おそらく、使用しているviridisスケールの部分を制御する、スケールのbegin=パラメーターとend=パラメーターだけでなく、カットオフを試してみると、達成できます。あなたが望む結果。 (プロットごとに1つの塗りつぶしスケールしか設定できないことに注意してください。ただし、ここで黄色を使用して行ったように、追加の定数塗りつぶしを設定できます。)

0
jtr13