我有一个包含5列的数据框:
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
):
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
...
我想在一个图表中包含所有这些信息,所以我正在寻找使用ggplot和geom_tile
这样的:
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的类是数字):
但我想删除空行,所以我试图将N1和N2转换为因子:
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)
但在这里,我的数字并没有增加。
在这里,我也使用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()
)
有人可以帮助我吗?
答案 0 :(得分: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()
,就会发现&#34; 20&#34;有9.你想要&#34; 20&#34;在unclass()
中有1个。因此,您需要对数据框进行排序。这导致了奇怪的数字顺序。在将字符转换为因子之前,您需要对N1和N2进行排序,并将它们转换为因子。
library(dplyr)
# Sort mydf by N1
mydf <- arrange(mydf, N1)
# Convert N1 to factor
mydf$N1 <- as.factor(mydf$N1)
在这里你可以看到&#34; 20&#34;有一个在unclass和&#34; 125&#34;这是你想要的订单。
#> 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()
)
请告诉我这是否适合您。