2014-09-01 75 views
4

刪除空白行我有5列的數據幀:從geom_tile

N1 <- an integer between c(125,100,80,70,60,50,40,30,20) 

N2 <- an integer between c(1,5,10,15,20,25,30,35,40,50,60,80,100) 

Type <- Two different types 

Rang <- a number 

crit <- a character, only one value 

N1總是比N2更大。 這裏是我的數據幀的開始(Rang_final)的例子:所以我要尋找一個使用ggplot和geom_tile這樣我想擁有所有這些信息只有一個圖形

N1 N2  Type  rang  crit 
125 1 SST-T_2m 41.86395 BE_proba 
125 1 T_2m-SST 163.41217 BE_proba 
100 1 SST-T_2m 32.88181 BE_proba 
100 1 T_2m-SST 137.44479 BE_proba 
80 1 SST-T_2m 22.57176 BE_proba 
80 1 T_2m-SST 112.52334 BE_proba 
70 1 SST-T_2m 21.30066 BE_proba 
70 1 T_2m-SST 99.65523 BE_proba 
60 1 SST-T_2m 18.48731 BE_proba 
60 1 T_2m-SST 85.36945 BE_proba 
50 1 SST-T_2m 18.60074 BE_proba 
50 1 T_2m-SST 71.58960 BE_proba 
40 1 SST-T_2m 18.58180 BE_proba 
40 1 T_2m-SST 62.82670 BE_proba 
30 1 SST-T_2m 20.53982 BE_proba 
30 1 T_2m-SST 48.58923 BE_proba 
20 1 SST-T_2m 27.15737 BE_proba 
20 1 T_2m-SST 36.04175 BE_proba 
125 5 SST-T_2m 101.82300 BE_proba 
125 5 T_2m-SST 168.69954 BE_proba 
100 5 SST-T_2m 91.10644 BE_proba 
... 

p <- ggplot(Rang_final) 
p <- (p 
     + geom_tile(data=Rang_final[Rang_final$Type=="SST-T_2m",], aes(x=N1, y=N2, fill=rang)) 
     + geom_tile(data=Rang_final[Rang_final$Type=="T_2m-SST",], aes(x=N2, y=N1, fill=rang)) 
     + scale_fill_gradient2(name="Rang", low="deepskyblue",mid="yellow",high="red", midpoint=100, na.value = "grey50") 
     + theme(axis.title.x = element_text(size=14, face="bold"), 
      axis.title.y = element_text(size=14, face="bold"), 
      strip.text.x = element_text(size=14, face="bold"), 
      strip.text.y = element_text(size=14, face="bold"), 
      axis.text=element_text(size=14), 
      axis.title.y=element_text(size=14, face="bold"), 
      legend.key=element_rect(size=0.5, colour="black"), 
      legend.text=element_text(size=10), 
      legend.margin=unit(0,"lines"), 
      legend.key.size=unit(0.8,"cm"), 
      legend.text.align=0) 
    + theme_bw() 

) 

print(p) 

而這就是我得到(類N1和N2的是數字): R

但我想刪除空行,所以我試圖改變N1和N2爲Fa構造函數:

Rang_final$N1 <- factor(Rang_final$N1, levels = c("20", "30", "40", "50", "60", "70", "80", "100", "125") ,ordered = TRUE) 
Rang_final$N2 <- factor(Rang_final$N2, levels = c("1", "5", "10", "15", "20", "25", "30", "35", "40", "50", "60", "80", "100", "125") ,ordered = TRUE) 

R

但在這裏我的號碼是不是在增加的順序。

在這裏,我還使用N1和N2的因素,但我不能設法對同一個圖如此規模的兩種不同類型:

p <- ggplot(Rang_final, aes(x=N1, y=N2)) 
p <- (p 
     + geom_tile(aes(fill=rang)) 
     + facet_grid(Type ~ crit, scales="free") 
     + scale_fill_gradient2(name="Rang", low="deepskyblue",mid="yellow",high="red", midpoint=100, na.value = "grey50") 
     + theme(axis.title.x = element_text(size=14, face="bold"), 
      axis.title.y = element_text(size=14, face="bold"), 
      strip.text.x = element_text(size=14, face="bold"), 
      strip.text.y = element_text(size=14, face="bold"), 
      axis.text=element_text(size=14), 
      axis.title.y=element_text(size=14, face="bold"), 
      legend.key=element_rect(size=0.5, colour="black"), 
      legend.text=element_text(size=10), 
      legend.margin=unit(0,"lines"), 
      legend.key.size=unit(0.8,"cm"), 
      legend.text.align=0) 
     + theme_bw() 

) 

R

誰能幫我?

回答

2

這是我的建議。當您將N1和N2轉換爲因子時,您的x軸和y軸數字不正確的原因是您沒有分配所需的順序。在這裏我使用了overflow包,所以你的數據幀被稱爲mydf,這與你發佈的內容相同。我認爲你需要做兩件事。

1)重新排序因素

你需要的是重新排列你的因素在正確的道路。當您在腳本中將角色轉換爲因素時,會發生類似的情況。

#> mydf$N1 <- as.factor(mydf$N1) 
#> levels(mydf$N1) 
#[1] "20" "30" "40" "50" "60" "70" "80" "100" "125" 
#> unclass(mydf$N1) 
#[1] 9 9 8 8 7 7 6 6 5 5 4 4 3 3 2 2 1 1 9 9 
#attr(,"levels") 
#[1] "20" "30" "40" "50" "60" "70" "80" "100" "125" 

如果你看一下unclass(),您會看到「20」有你想到「20」有1 unclass()。出於這個原因,你想對你的數據框進行排序。這造成了奇怪的號碼順序。在將字符轉換爲因子之前,您需要對N1和N2進行排序,並將它們轉換爲因子。

library(dplyr) 
# Sort mydf by N1 
mydf <- arrange(mydf, N1) 

# Convert N1 to factor 
mydf$N1 <- as.factor(mydf$N1) 

在這裏你會看到「20」在unclass中有1,「125」有9個。所以這是你想要的順序。

#> levels(mydf$N1) 
#[1] "20" "30" "40" "50" "60" "70" "80" "100" "125" 
#> unclass(mydf$N1) 
#[1] 1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 9 9 
#attr(,"levels") 
#[1] "20" "30" "40" "50" "60" "70" "80" "100" "125" 

2)數據子集

這可以/可能不是必要的。但是,到目前爲止,我認爲這是必要的。以下看起來不太好。

+ geom_tile(data=Rang_final[Rang_final$Type=="SST-T_2m",], aes(x=N1, y=N2, fill=rang)) 
    + geom_tile(data=Rang_final[Rang_final$Type=="T_2m-SST",], aes(x=N2, y=N1, fill=rang)) 

所以,我做了一個技巧來安排你的數據。

# Subset data using dplyr 
america <- filter(mydf, Type == "SST-T_2m") 
brazil <- filter(mydf, Type == "T_2m-SST") 

# Reverse N1 and N2 in brazil (So N1 is actually N2, and N2 is actually N1) 
colnames(brazil) <- c("N2","N1", "Type", "rang", "crit") 
brazil[,c(2,1,3:5)] 

在對原始數據進行子集化處理後,我把它們組合到了巴西數據框中。然後,我按照前面提到的那樣安排要素順序。

canada <- rbind(america, brazil) 
canada <- arrange(canada,N1) 
canada$N1 <- as.factor(canada$N1) 

canada <- arrange(canada,N2) 
canada$N2 <- as.factor(canada$N2) 

現在我畫一個圖。我以某種方式與傳說有關的事情有問題。所以我在這裏刪除了它們。

x <- ggplot(canada) 
x <- (x 
    + geom_tile(aes(x=N1, y=N2, fill =rang)) 
    + scale_fill_gradient2(name="Rang", low="deepskyblue",mid="yellow",high="red",  midpoint=100, na.value = "grey50") 
    + theme(axis.title.x = element_text(size=14, face="bold"), 
     axis.title.y = element_text(size=14, face="bold"), 
     strip.text.x = element_text(size=14, face="bold"), 
     strip.text.y = element_text(size=14, face="bold"), 
     axis.text=element_text(size=14), 
     axis.title.y=element_text(size=14, face="bold")) 
    + theme_bw() 

) 

讓我知道這是否適合你。

enter image description here