2017-03-22 2 views
2

1つのヒートマップに2つの列を配置するにはどうすればよいですか? は、私はこのデータは、値の5列があり、次のデータ2列の数値の間にマージされたヒートマップを作成する方法

data<- structure(list(names = structure(c(5L, 1L, 10L, 2L, 6L, 4L, 9L, 
7L, 11L, 3L, 8L), .Label = c("Bin", "Dari", "Down", "How", "India", 
"Karachi", "Left", "middle", "Right", "Trash", "Up"), class = "factor"), 
    X1Huor = c(1.555555556, 5.2555556, 2.256544, 2.3654225, 1.2665545, 
    0, 1.889822365, 2.1, -1, -1.885618083, 1.128576187 
    ), X2Hour = c(1.36558854, 2.254887, 2.3333333, 0.22255444, 
    2.256588, 5.66666, -0.377964473, 0.107211253, -1, 0, 0), 
    X3Hour = c(0, 1.222222222, 5.336666, 1.179323788, 0.832050294, 
    -0.397359707, 0.185695338, 1.393746295, -1, -2.121320344, 
    1.523019248), X4Hour = c(3.988620176, 3.544745039, -2.365555, 
    2.366666, 1.000000225, -0.662266179, -0.557086015, 0.862662186, 
    0, -1.305459824, 1.929157714), X5Hour = c(2.366666, 2.333365, 
    4.22222, 0.823333333, 0.980196059, -2.516611478, 2.267786838, 
    0.32163376, 0, -2.592724864, 0.816496581)), .Names = c("names", 
"X1Huor", "X2Hour", "X3Hour", "X4Hour", "X5Hour"), class = "data.frame", row.names = c(NA, 
-11L)) 

を考えてみましょう。私はそれの半分が最初の列からの値であり、各セルの残りの半分が第2列からのヒートマップを作成したい。

第五及び第六(何第六には存在しないが、私は空のままにすることができる)、これは私が探しているものを示す一例で

ため

同じ3列について同じと第ために。私は多くのことを検索しましたが、私はこの

enter image description here

赤から緑に色の範囲のような何かを見つけることができませんでした、値が2以上である場合は赤い色をし、値が-2よりも低い場合色は緑色です。

どのようにこれを行うには?

+0

これはおそらくgeom_polygonを使用して実現できます。これらは基本的にポリゴンなので、ポリゴンを作成するには、データの形状を変更し、ポリゴンの位置を手動で追加する必要があります。 – yeedle

+0

@yeedle解決策を教えていただけたら、私はそれを受け入れるでしょう – nik

+0

私はプログラム的な解決策はありませんが、始める方法を教えてください – yeedle

答えて

2

これはややハックな解決策ですが、それはあなたのために働くかもしれないので、これをチェックしてください。

考え方は、geom_polygonを利用して三角形を作成し、それらを積み重ねることです。我々は最初の三角形が

library(dplyr) 
library(tidyr) 
library(stringr) 

# the following two line create the triangle coordinates 
x = rep(c(1,2,2, 1, 1, 2),nrow(data)) 
y = rep(c(1,1,2, 1, 2, 2),nrow(data)) + rep(0:10, each=6) 

を座標生成する必要があることを行うために今、私たちは私たちの座標を持っていることを、我々は名でそのIDを生成する必要があります。しかし、我々はそれぞれの三角形が一意になりたいので、私たちは、それぞれの名前の2つのユニークなバージョンを作成する必要があります。

names <- data %>% 
    select(names, X1Huor, X2Hour) %>% 
    gather("key", "value", X1Huor, X2Hour) %>% 
    arrange(names, key) %>% 
    mutate(name = str_c(names, key)) %>% 
    .$name %>% 
    rep(each = 3) 

をそして今、我々は時間と同じ操作を行います。

hour <- data %>% 
    select(names, X1Huor, X2Hour) %>% 
    gather("key", "value", X1Huor, X2Hour) %>% 
    arrange(names, key) %>% 
    .$value %>% 
    rep(each = 3) 

datapoly <- data.frame(x = x, y = y , hour = hour, names = names) 

全く適切ではありませんので、私たちのdatapoly DFのプロットのラベル、我々は1を作成する必要があります。

name_labels <- data %>% 
    select(names) %>% 
    arrange(names) %>% 
    .$names 

シーンは、今私たちのグラフのために設定されている:

ggplot(datapoly, aes(x = x, y = y)) + 
    geom_polygon(aes(group = names, fill = hour), color = "black") + 
    scale_fill_continuous(low = "green", high = "red") + 
    scale_y_continuous(breaks = 1:nrow(data), labels = name_labels) + 
    theme(axis.text.y = element_text(vjust = -2), 
     axis.ticks = element_blank(), 
     axis.text.x = element_blank(), 
     axis.title = element_blank()) 

出力は次のようになります。心に留めておくために

plot

いくつかのポイント:これは本当にあなたが作成して使用することにしたいプロットですか?これはあなたの目的に本当に便利ですか?おそらく、他のより伝統的な視覚化方法がより適切であろう。また、他の時間欄でも同じことをするのは面倒ではありませんでしたが、それを達成する方法ははっきりしていなければなりません。

+0

他の誰かがいくつかの入力を入れれば私はまだ待っている、いいえ、私はあなたの答えを受け入れる – nik

関連する問題