web-dev-qa-db-ja.com

ggplot geom_point()特定の離散値に基づいた色で

3つの値の範囲に対して3つの異なる色でデータポイントをプロットしようとしています。例えば:

_library(ggplot2)
ggplot(mtcars, aes(wt, mpg)) + geom_point(aes(colour = qsec))
_

上記の結果:

enter image description here

次に、qseq値<17が黒、17〜19の値が黄色、19を超える値が赤になるように、これを変更したいと思います。私はさまざまなアプローチを試しましたが、どれもうまくいかないようです:

  • here から取得

    _ggplot(mtcars, aes(wt, mpg)) + geom_point(aes(fill = qsec)) + 
    scale_fill_gradientn(colours=c("black","yellow","red"), 
    breaks=c(0,17,19), labels=format(c("0","17","19")))
    _

    これにより、以下が生成されます。

    enter image description here

    そのため、カラーバーは正しいように見えますが、色は実際には適用されません。

  • 範囲値の色付きggplot2ヒートマップ で与えられた解決策は有望に思えますが、geom_point()で動作させることはできません。

  • サイドバーにリストされているものなど、同様のさまざまな投稿についても同様です。

私はおそらく_scale_fill_gradientn_の代わりに何らかの種類の離散スケールを使用する必要があることを理解していますが、scale_color_manual()を使用しようとすると失敗します。

_ggplot(mtcars, aes(wt, mpg)) + geom_point(aes(color = factor(qsec))) + 
scale_color_manual(values=c("black", "yellow","red")
Error: Insufficient values in manual scale. 30 needed but only 4 provided.
_

私はどういうわけかcut()またはfactor()を使用しなければならないだろうと推測していますが、その方法がわからないようです。助言がありますか?

19
terdon

値を間隔にcutする必要があります。

library(ggplot2)
ggplot(mtcars, aes(wt, mpg)) + 
  geom_point(aes(colour = cut(qsec, c(-Inf, 17, 19, Inf))),
             size = 5) +
  scale_color_manual(name = "qsec",
                     values = c("(-Inf,17]" = "black",
                                  "(17,19]" = "yellow",
                                  "(19, Inf]" = "red"),
                     labels = c("<= 17", "17 < qsec <= 19", "> 19"))

resulting plot

29
Roland