2016-05-30 4 views
3

とChoroplethは、次のコードは、(hclust()cutree()を使用して)階層的クラスタリングに応じて階級区分図を作成します。R:カスタマイズされた伝説と国の名前の常設展示

library(plotly) 
library(cluster) 

hc <- hclust(dist(df), method = "complete") 
df$member <- cutree(hc, 5) 

cluster.means = (as.data.frame(aggregate(df[,-1], list(cluster= df$member), mean)))[,-4] 

g = list(
    scope = 'africa', 
    showframe = T, 
    showland = T, 
    landcolor = toRGB("white") 
) 

plot_ly(df, z = member, type = 'choropleth', locations = Country, 
       locationmode = 'country names', text = Country, hoverinfo = "text") %>% 
     layout(geo = g, title = "Energy markets in Africa") 

今、私は二つのことを変更したいです

  1. パーマネント国名の表示、つまり、RStudioのインタラクティブチャート上でホバーオーバーするときだけでなく、私はthis postの答えを私のところに、成功せずに適用しようとしました。
  2. 非連続スケール。理想的には、私はスケールを一切持たずに、それぞれ1つのクラスターに対して5つのボックスをつけたいと思っています。 (1)ボックスの色は、それぞれの色に合わせてください。 (2)それぞれのクラスタ にすなわち、それに割り当てられた国の数は、(3)それぞれのクラスタが含まれている必要があり、各ボックスには、私は、そのような付属しているcluster.means

に含まれている2つの変数(X1、X2)するための手段私が心に留めていることの模範的なプロット(ちょうどアイデアを伝えるためにちょうど同じものを見なければならない)。

An exemplary choroplot containing only 2, instead of 5 boxes

すべてのヘルプ、アドバイスは、ティップが高く評価されます!

次のようにデータが見えます(スケーリング):

df <- structure(list(Country = structure(1:50, .Label = c("Angola", 
"Benin", "Botswana", "Burkina Faso", "Burundi", "Cabo Verde", 
"Cameroon", "Central African Republic", "Chad", "Comoros", "Congo", 
"Cote d'Ivoire", "Democratic Republic of Congo", "Djibouti", 
"Equatorial Guinea", "Eritrea", "Ethiopia", "Gabon", "Gambia", 
"Ghana", "Guinea", "Guinea-Bissau", "Kenya", "Lesotho", "Liberia", 
"Madagascar", "Malawi", "Mali", "Mauritania", "Mauritius", "Mozambique", 
"Namibia", "Niger", "Nigeria", "Reunion", "Rwanda", "Sao Tome and Principe", 
"Senegal", "Seychelles", "Sierra Leone", "Somalia", "South Africa", 
"South Sudan", "Sudan", "Swaziland", "Tanzania", "Togo", "Uganda", 
"Zambia", "Zimbabwe"), class = "factor"), X1 = c(-0.18, -1.03, 
0.6, 1.55, 0.22, 0.26, 0.76, 2.15, -1.43, 0.99, 1.79, -0.39, 
1.73, 1.57, 1.11, -0.09, -1.49, -0.46, -0.48, -1.22, -0.78, -1.46, 
-1.22, 0.35, 0.45, 1.29, -1.37, -0.61, 0.92, -1.3, 0.42, -1.18, 
1.4, -0.83, 0.06, -0.76, -0.19, -0.37, -0.63, 0.64, 0.93, 0.33, 
-0.76, -0.21, -0.59, -0.41, -0.74, 0.39, -1.1, 1.35), X2 = c(-0.22, 
-0.42, 0.72, -0.59, -1.27, 0.64, -1.35, -1.4, -0.35, -1.43, 1.07, 
-0.01, -0.51, 0.11, 1.14, -0.89, 0.77, 1.45, -1.67, -0.83, 0.71, 
0.92, 1.63, 1.68, 0.23, -0.18, 0.07, 0.8, -0.02, 0.82, -0.72, 
-0.41, -0.26, 0.02, -1.68, 1.67, 0.18, 0.98, 1.45, 0.31, -1.23, 
-1.38, -0.63, 1.41, -0.12, 0, -1.3, -1.64, 0.21, 1.52)), .Names = c("Country", 
"X1", "X2"), row.names = c(NA, -50L), class = "data.frame") 

答えて

5

「理想的には、私はまったくのスケールを持っていないしたいと思います」:これはplot_ly()に引数showscale=Fを加えることによって達成されます。 this postで説明したように、これは小さな違いで、scattergeoプロット層を追加することによって行われる:

「国名の常設表示」。あなたのデータフレームは、国の名前の列が含まれているためではなく、国コードのいずれか、あなたはあなたが効果的にクラスタを示してものを見つけるために、様々なカラースキームを試してみる必要があります。引数locationmode = 'country names'

p <- plot_ly(df, z = member, type = 'choropleth', 
      locations = Country, locationmode = 'country names', 
      text = Country, hoverinfo = "text", 
      showscale=F, inherit =F) %>% 
    layout(geo = g, title = "Energy markets in Africa") %>% 
    add_trace(type="scattergeo", 
      locationmode = 'country names', locations = Country, 
      text = Country, mode="text", 
      textfont = list(color=rgb(1,0.5,0.3), size =12)) 

を追加する必要があり、しばらく対照的に恒久的な国名ラベルが見えるようにします。おそらく、マップがズームアウトされたときに恒久的な国名ラベルが重なり合うという事実はほとんどありません。余分な努力を払って、デフォルトの位置に頼るのではなく、ラベルごとに緯度経度の位置を指定することができます。これにより、ラベルをより良く分離してマップの外観を改善できます。あなたが恒久的なラベルを要求して以来、あなたは大丈夫と思われる適切なズームで地図を使用するつもりです。

テキストボックスを追加するには、注釈レイアウト(クラスタごとに1つの注釈)を使用できます。紫色のボーダーと2番目のターコイズ色を追加する方法をここに示します。これを使用して終わる配色に調整する必要があります。

box1 <- list(
    x = 0.3, 
    y = 0.5, 
    yanchor = "top", 
    borderpad = 2, 
    bordercolor = rgb(0.5,0.1,0.5),  # set this same as color of cluster 1 
    borderwidth = 5, 
    text = paste("1. Cluster, ", 
       sum(df$member==1),  # number of countries in cluster 
       " Countries<br>X1 = ", # use <br> for line breaks 
       format(round(cluster.means[1,]$X1, 2), nsmall = 2), 
       "<br>X2 = ", 
       format(round(cluster.means[1,]$X2, 2), nsmall = 2)), 
    align = "left", 
    showarrow = F) 

box2 <- list(
    x = 0.3, 
    y = 0.4, 
    yanchor = "top", 
    borderpad = 2, 
    bordercolor = rgb(0.1,0.5,0.5), 
    borderwidth = 5, 
    text = paste("2. Cluster, ", 
       sum(df$member==2), 
       " Countries<br>X1 = ", 
       format(round(cluster.means[2,]$X1, 2), nsmall = 2), 
       "<br>X2 = ", 
       format(round(cluster.means[2,]$X2, 2), nsmall = 2)), 
    align = "left", 
    showarrow = F) 

p %>% layout(annotations = list(box1, box2)) 

enter image description here

+0

うわー! thats素晴らしい、ありがとう:-)私は1つの質問がある:私は他のボックスを追加して、各ボックスの 'y値0.1以上を上記より小さくする。最後に、この 'box = list(box1、box2、box3、box4、box5)'のようにまとめて、 'box'を' annotations'に割り当てます。しかし残念ながら、ボックス間の距離は常に同じではありません...なぜですか? – Joni

+0

注釈のデフォルトアンカーは「自動」です。残念なことに、これは、指定されたy座標に最も近いアンカーポイントに応じて、各ボックスをx、y位置に異なる方法でアンカーすることを選択します。治療法は簡単です。アノテーションリストのそれぞれに 'yanchor =" top "'行を追加します。私はこれで答えを編集しました。 – dww

+0

また、paste()ステートメントの誤った配置されたかっこを修正しました(修正済み)。 – dww