web-dev-qa-db-ja.com

R:ggplot2のスケールカラーグラデーションを調整します

まず、mydata(121315 * 4)の一部です。

_     LONGITUDE LATITUDE NUM_PICKUPS TOTAL_REVENUE
 1   121.6177  38.9124          21         337.0
 2   121.8069  39.0210          16         454.7
 3   121.5723  38.9645          38         696.9
 4   121.6423  38.9258         622       13609.7
 5   121.5647  38.9129         116        2016.7
 6   121.6429  38.8846         120        2417.3
 7   121.5852  38.9279         117        1975.0
 8   121.6616  38.9189          94        1712.4
 9   121.5812  38.9828          50         981.6
 10  121.6411  38.9255         225        4696.2
_

それを見て、1列目と2列目は経度と緯度です。

_mydata[1,3]=21_は、palce _(121.6177, 38.9124)_に21個のピックアップがあることを意味します。

次に、mydataを_NUM_PICKUPS_ descで再利用します。

_LONGITUDE   LATITUDE    NUM_PICKUPS TOTAL_REVENUE
121.6019    39.0181        14243    514716
121.5382    38.9609        13244    443754.7
121.5381    38.9609         9645    325056
121.5382    38.9608         8846    294345.6
121.602     39.0181         6556    232254.5
121.5383    38.9609         6152    208967.6
121.5383    38.9608         6014    207677.8
121.5381    38.9608         5544    185398.3
121.6018    39.018          4546    167662.1
121.5382    38.9607         4260    143088.9
121.5827    38.8948         4133    72202.8
121.6303    38.9183         3837    67683.6
121.5966    38.9665         3747    56378.7
_

そして、mydataの要約があります:

_summary(mydata)


 LONGITUDE        LATITUDE      NUM_PICKUPS       TOTAL_REVENUE     
  Min.   :121.1   Min.   :38.76   Min.   :   10.00   Min.   :    92.9  
  1st Qu.:121.6   1st Qu.:38.91   1st Qu.:   15.00   1st Qu.:   289.7  
  Median :121.6   Median :38.92   Median :   27.00   Median :   515.1  
  Mean   :121.6   Mean   :38.93   Mean   :   57.03   Mean   :  1067.6  
  3rd Qu.:121.6   3rd Qu.:38.96   3rd Qu.:   59.00   3rd Qu.:  1089.5  
  Max.   :122.0   Max.   :39.32   Max.   :14243.00   Max.   :514716.0
_

さて、_NUM_PICKUPS_で色付けされた地図を描きたいのですが、コードを見てください。

_g1 <- ggplot() + geom_point(data = mydata,aes(x = LONGITUDE,y = LATITUDE,color=NUM_PICKUPS))
_

enter image description here

ええ、コードとグラフはどちらも正しいですが、colorを見てください。_num_pickups_が高い場所を特定するのは難しいですか?そして、どこが少ないのですか?

scale_colour_gradient()でコードを変更しようとしています。

_g1 + scale_colour_gradient(low = "red",high = "white")
_

enter image description here

しかし、写真を見てください、colorも分類するのが難しいです。

回目の試行:今回は、alpha=I(1/100)およびbreaks()のパラメーターを追加します:

_g1 <- ggplot() + geom_point(data = mydata,aes(x = LONGITUDE,y = LATITUDE,color=NUM_PICKUPS),alpha=I(1/100))
g1 + scale_colour_gradient(low = "red",high = "white", breaks=c(0,2000,4000))
_

enter image description here

しかし、それでも無力です!

4回目の試行:

_ggplot(data = mydata, aes(x = LONGITUDE,y = LATITUDE, color = NUM_PICKUPS)) + geom_point() + scale_colour_gradient(limits = c(0, 60))
_

enter image description here

5回目の試行: 3年前の投稿によると、 ggplot2カラースケールが外れ値の影響を受けています 、コードを再度変更しようとしています:

_mydata$NUM_PICKUPS1 <- "> 2000"
mydata$NUM_PICKUPS1[mydata$NUM_PICKUPS <= 2000] <- NA

g2 <- ggplot() + geom_point(data = subset(mydata,NUM_PICKUPS <= 2000),
      aes(x = LONGITUDE,y = LATITUDE,color=NUM_PICKUPS),size=2) +    geom_point(data = subset(mydata,NUM_PICKUPS > 2000),aes(x = LONGITUDE,y = LATITUDE,fill=NUM_PICKUPS1))
_

enter image description here

outliersで何かが変更されましたが、カラースケールはまだ分類が困難です。

それで、私の質問は、_NUM_PICKUPS_の色を簡単に識別できるようにコードを変更する方法です。

8
Ling Zhang

私のコメントとあなたの回答によると、問題は、それらに対応するためにスケールを拡大することを余儀なくされているいくつかの外れ値があることだと思います。

summary()から、_NUM_PICKUPS_のケースの75%は10から59の間です。残りの25%は14243に増加し、3桁大きくなります。

要約すると、_NUM_PICKUPS_の値の範囲は広すぎて、約1,000未満の変動を示すことはできません。

選択するソリューションは、データとそのデータで何をしたいかによって異なります。 1つのオプションは、75%までの値のみを表示し、最も高い25%を外れ値として除外することです。手動で制限を設定することで、データを変更せずにこれを行うことができると思います。

_g1 + scale_colour_gradient(limits = c(0, 60))
_

もう1つのオプションは、データを変換することです(おそらく、log()またはlog10()を使用します)。たとえば、mydata$LOG_PICKUPS <- log10(mydata$NUM_PICKUPS)は、プロットするのに十分な範囲を縮小するのに役立つ場合があります。

7
Phil

ブレークがスケール全体に不均一に分布している(図3、NUM_PICKUPSの値4000が中央にある必要があります)を調整するには、制限とブレークのログを計算して、スケールの凡例の中心に配置する値:

scale_fill_gradient(
    limits=c(lower, upper)^abs(log(0.5,mid)),
    breaks=c(lower, mid, upper)^abs(log(0.5,mid)),
)

また、次のようにその式をデータに適用する必要があります。

ggplot(df, aes(x= x, y = y fill = z^abs(log(0.5,mid))))
0
user3548751