使用annotation_raster和geom_raster的彩色光栅的位置不精确

时间:2013-01-18 10:29:19

标签: r ggplot2

使用geom_raster生成背景后,许多使用annotation_raster创建的评估者会附加在背景上。但是,新栅格的位置并不总是正确的 - 虽然annotation_raster的位置代码是正确的,但某些栅格并未正确定位在理想位置或目标位置。

经过一些测试后,PlotMargin的调整和背景网格中栅格的位置会使栅格倾斜。

我希望让光栅的位置正确。

以下是光栅偏斜的3个示例:
栅格位于背景的中间网格中

PlotMargin (0,0,0.2,0):  

http://i.imgur.com/aS7OC.png

使用

位于背景的上部和底部网格中的栅格
PlotMargin (0,0,0.2,0):  

http://i.imgur.com/FJdOw.png
栅格位于背景的上部和底部网格中

PlotMargin (0.2,0,0.2,0): 
http://i.imgur.com/uFX0G.png

.csv数据:

https://www.dropbox.com/s/ik3q8ppo5qgahx1/CubicLateralRootLengthDensityPlantLayerOrder_4Layer.csv

示例代码:

library(ggplot2)
library(grid)
require("gridExtra")
require("reshape")

setwd("F:\\Code\\R\\viRoot_R\\RLD")

###### png("RLD_Lateral_10cm_LayerAndOrder_rasterUpAndBottom_200.png",height=1300,width=1840, res = 200)
png("RLD_Lateral_10cm_LayerAndOrder_rasterUpAndBottom_100.png",height=650,width=920, res = 100)


dataLateralAll = read.csv("CubicLateralRootLengthDensityPlantLayerOrder_4Layer.csv", header = TRUE) 


dataLateralAll$LinkLengthSumCM = ifelse(dataLateralAll$Layer < 4 | dataLateralAll$Layer > 8 , 0, dataLateralAll$LinkLengthSumCM)
# write.csv(dataLateralAll, "dataLateralAll.csv", row.names=FALSE)

subDataLayerAll = data.frame(dataLateralAll[c('YCenter', 'ZCenter','XCenter','Layer','LinkLengthSumCM')])
mSubDataLayerAll = melt(subDataLayerAll, measure.var = 'LinkLengthSumCM')
castMSubDataLayerAll = cast(mSubDataLayerAll, YCenter + ZCenter + XCenter ~ variable, sum )

df <- expand.grid(x = seq(-40,40,10), y =seq(-30,30,10) )
df <- data.frame(df, YCenter = castMSubDataLayerAll$YCenter)
#df$YCenter <- factor(df$YCenter, levels = seq(-2.5,-37.5,-5))

df2 <- df

df2$Length = castMSubDataLayerAll$LinkLengthSumCM / 1000
# write.csv(df2, "dataNewSum.csv", row.names=FALSE)

df2$YCenter <- as.character(df2$YCenter)
df2$YCenter[df2$YCenter == "-5"] <- "0 - 10 cm"
df2$YCenter[df2$YCenter == "-15"] <- "10 - 20 cm"
df2$YCenter[df2$YCenter == "-25"] <- "20 - 30 cm"
df2$YCenter[df2$YCenter == "-35"] <- "30 - 40 cm"

df2$YCenter <- as.factor(df2$YCenter)
# To change plot order of facet wrap,
# change the order of varible levels with factor()
df2$YCenter <- factor(df2$YCenter, levels = c("0 - 10 cm","10 - 20 cm","20 - 30 cm","30 - 40 cm"))

# temp = annotation_raster(colorOrder, 5,15, 11.66, 15) + annotation_raster(colorType, 5,15, 5, 8.33)

p1 <- ggplot(subset(df2, YCenter == "0 - 10 cm"), aes(x, y)) + geom_raster(aes(fill = Length)) + facet_wrap(~YCenter) +
  coord_fixed(ratio = 1) + xlab(NULL) + ylab(NULL) + 
  ylim(-35,35) + xlim(-45, 45) + 
  scale_fill_continuous(name = expression( paste ("RLD \n(cm ", cm^-3, ")"  )), limits=c(0.0001, 13),trans = "log", low = "white", high = "blue", breaks=c(0.0001,0.001,0.01,0.1,1,12),labels=c("0.0001","0.001","0.01","0.1","1","12"), na.value = "white") + 
  scale_x_continuous(breaks = seq(-45, 45, by = 10), expand=c(0.03, 0.03)) + scale_y_continuous(breaks = seq(-35, 35, by = 10), expand=c(0.03, 0.03)) +
  theme(plot.margin = unit(c(0,0,0.2,0.2), "lines") ) + theme(panel.margin = unit(0, "lines") ) + theme(legend.margin = unit(0, "cm")) + 
  ######   theme(plot.margin = unit(c(0,0,0.2,0), "lines") ) + theme(panel.margin = unit(0, "lines") ) + theme(legend.margin = unit(0, "cm")) + 
  theme(axis.title.x=element_text(size=15), axis.title.y=element_text(size=15), axis.text.x=element_text(size=13, colour = "white"), axis.text.y=element_text(size=13) ) +
  theme(legend.title = element_text(size = 13), legend.text = element_text(size=11),  legend.key.height=unit(1.2, "cm")  ) +
  theme(strip.text.x = element_text(size = 13), strip.background=element_rect(fill="white"))+
  theme(panel.background=element_rect(colour="white") )
#   theme(panel.grid.minor = element_line(colour = NULL, linetype = NULL, size = NULL), panel.grid.major = element_line(colour = NULL, linetype = NULL, size = NULL)) + 
#   theme(panel.grid.minor = element_blank(), panel.grid.major = element_blank(), panel.grid.minor.x = element_blank(), panel.grid.minor.y = element_blank(),panel.grid.major.x = element_blank(), panel.grid.major.y = element_blank()) + 
#   
# + theme(legend.position="none")


p2 <- ggplot(subset(df2, YCenter == "10 - 20 cm"), aes(x, y)) + geom_raster(aes(fill = Length)) + facet_wrap(~YCenter) +
  coord_fixed(ratio = 1) + xlab(NULL) + ylab(NULL) + 
  ylim(-45,45) + xlim(-45, 45) + 
  scale_fill_continuous(name = expression( paste ("RLD \n(cm ", cm^-3, ")"  )), limits=c(0.0001, 13),trans = "log", low = "white", high = "blue", breaks=c(0.0001,0.001,0.01,0.1,1,12),labels=c("0.0001","0.001","0.01","0.1","1","12"), na.value = "white") + 
  scale_x_continuous(breaks = seq(-45, 45, by = 10), expand=c(0.03, 0.03)) + scale_y_continuous(breaks = seq(-35, 35, by = 10), expand=c(0.03, 0.03)) +
  theme(plot.margin = unit(c(0,0.2,0.2,0), "lines") ) + theme(panel.margin = unit(0, "lines")) + theme(legend.margin = unit(0, "cm")) + 
  ######   theme(plot.margin = unit(c(0,0,0.2,0), "lines") ) + theme(panel.margin = unit(0, "lines")) + theme(legend.margin = unit(0, "cm")) + 
  theme(axis.title.x=element_text(size=15), axis.title.y=element_text(size=15), axis.text.x=element_text(size=13, colour = "white"), axis.text.y=element_text(size=13, colour = "white"), legend.title = element_text(size = 13), legend.text = element_text(size=11),  legend.key.height=unit(1, "cm")  ) +
  theme(strip.text.x = element_text(size = 13), strip.background=element_rect(fill="white")) 
#   annotate("point", x = -15, y = 0, size = 7, colour = "deeppink")+ annotate("point", x = 15, y = 0, size = 7, colour = "deeppink")
# + theme(legend.position="none")

p3 <- ggplot(subset(df2, YCenter == "20 - 30 cm"), aes(x, y)) + geom_raster(aes(fill = Length)) + facet_wrap(~YCenter) +
  coord_fixed(ratio = 1) + xlab(NULL) + ylab(NULL) + 
  ylim(-45,45) + xlim(-45, 45) + 
  scale_fill_continuous(name = expression( paste ("RLD \n(cm ", cm^-3, ")"  )), limits=c(0.0001, 13),trans = "log", low = "white", high = "blue", breaks=c(0.0001,0.001,0.01,0.1,1,12),labels=c("0.0001","0.001","0.01","0.1","1","12"), na.value = "white") + 
  scale_x_continuous(breaks = seq(-45, 45, by = 10), expand=c(0.03, 0.03)) + scale_y_continuous(breaks = seq(-35, 35, by = 10), expand=c(0.03, 0.03)) +
  theme(plot.margin = unit(c(0,0,0.2,0.2), "lines") ) + theme(panel.margin = unit(0, "lines")) + theme(legend.margin = unit(0, "cm")) + 
  ######   theme(plot.margin = unit(c(0,0,0.2,0), "lines") ) + theme(panel.margin = unit(0, "lines")) + theme(legend.margin = unit(0, "cm")) + 
  theme(axis.title.x=element_text(size=15), axis.title.y=element_text(size=15), axis.text.x=element_text(size=13), axis.text.y=element_text(size=13), legend.title = element_text(size = 13), legend.text = element_text(size=11),  legend.key.height=unit(1, "cm")  ) +
  theme(strip.text.x = element_text(size = 13), strip.background=element_rect(fill="white"))+ 
  annotate("point", x = -15, y = 0, size = 2, colour = "deeppink")+ annotate("point", x = 15, y = 0, size = 2, colour = "deeppink")
# + theme(legend.position="none")

p4 <- ggplot(subset(df2, YCenter == "30 - 40 cm"), aes(x, y)) + geom_raster(aes(fill = Length)) + facet_wrap(~YCenter) +
  coord_fixed(ratio = 1) + xlab(NULL) + ylab(NULL) + 
  ylim(-45,45) + xlim(-45, 45) + 
  scale_fill_continuous(name = expression( paste ("RLD \n(cm ", cm^-3, ")"  )), limits=c(0.0001, 13),trans = "log", low = "white", high = "blue", breaks=c(0.0001,0.001,0.01,0.1,1,12),labels=c("0.0001","0.001","0.01","0.1","1","12"), na.value = "white") + 
  scale_x_continuous(breaks = seq(-45, 45, by = 10), expand=c(0.03, 0.03)) + scale_y_continuous(breaks = seq(-35, 35, by = 10), expand=c(0.03, 0.03)) +
  theme(plot.margin = unit(c(0,0.2,0.2,0), "lines") ) + theme(panel.margin = unit(0, "lines")) + theme(legend.margin = unit(0, "cm")) + 
  ######   theme(plot.margin = unit(c(0,0,0.2,0), "lines") ) + theme(panel.margin = unit(0, "lines")) + theme(legend.margin = unit(0, "cm")) + 
  theme(axis.title.x=element_text(size=15), axis.title.y=element_text(size=15), axis.text.x=element_text(size=13), axis.text.y=element_text(size=13, colour = "white"), legend.title = element_text(size = 13), legend.text = element_text(size=11),  legend.key.height=unit(1, "cm")  ) +
  theme(strip.text.x = element_text(size = 13, colour = "black"), strip.background=element_rect(fill="white") ) + 
  annotate("point", x = -15, y = 0, size = 2, colour = "deeppink")+ annotate("point", x = 15, y = 0, size = 2, colour = "deeppink")



dataLateralLayerOrder = read.csv("CubicLateralRootLengthDensityPlantLayerOrder_4Layer.csv", header = TRUE) 
colnames(dataLateralLayerOrder)[9] = "Len"

# Layer;
subDataLayer = data.frame(dataLateralLayerOrder[c('YCenter', 'ZCenter','XCenter','Layer','Len')])
mSubDataLayer = melt(subDataLayer, measure.var = 'Len')
castMSubDataLayer = cast(mSubDataLayer, YCenter + ZCenter + XCenter ~ Layer + variable, sum )
# write.csv(castMSubDataLayer, "dataLayer.csv", row.names=FALSE)

# Order;
# subDataLayerOrder = dataLateralLayerOrder[!(dataLateralLayerOrder$Layer == 1 & dataLateralLayerOrder$Layer == 100 ), ]

# subDataLayerOrder = subset(dataLateralLayerOrder, Layer >=4 & Layer <100 & Layer ==0 )
subDataLayerOrder = subset(dataLateralLayerOrder, Layer == 0 | Layer == 4 | Layer == 5 | Layer == 6  | Layer == 7  | Layer == 8 )
subDataOrder = data.frame(subDataLayerOrder[c('YCenter', 'ZCenter','XCenter','OrderRank','Len')])
mSubDataOrder = melt(subDataOrder, measure.var = 'Len')
castMSubDataOrder = cast(mSubDataOrder, YCenter + ZCenter + XCenter ~ OrderRank + variable, sum )
# write.csv(castMSubDataOrder, "dataOrder.csv", row.names=FALSE)

# write.csv(dataLateralLayerOrder, "dataLateralLayerOrder.csv", row.names=FALSE)

sumRowOrder = apply(castMSubDataOrder[5: length(castMSubDataOrder)], 1, sum)
sweptOrder = round(sweep(castMSubDataOrder[5: length(castMSubDataOrder)], 1, sumRowOrder, "/"), 3) * 1000
sweptXYZOrder = data.frame(castMSubDataOrder[1:3], sweptOrder)
sweptXYZOrderNoNaN = na.omit(sweptXYZOrder)
sweptXYZOrderNoNaN5 = subset(sweptXYZOrderNoNaN, YCenter == -5)
sweptXYZOrderNoNaN15 = subset(sweptXYZOrderNoNaN, YCenter == -15)


### the background of the band is white;
# for(i in 1:nrow(sweptXYZOrderNoNaN5)) {
#   row <- sweptXYZOrderNoNaN5[i,]
#   xMinBackground = row[[3]] - 5
#   xMaxBackground = row[[3]] + 5
#   yMinBackground = row[[2]] - 1.5
#   yMaxBackground = row[[2]] + 1.5
#   colorBackground = matrix(c(rep("white",10)), nrow = 1)
#   p1 = p1 + annotation_raster(colorBackground, xMinBackground,xMaxBackground, yMinBackground, yMaxBackground)
# }
# 
# for(i in 1:nrow(sweptXYZOrderNoNaN15)) {
#   row <- sweptXYZOrderNoNaN15[i,]
#   xMinBackground = row[[3]] - 5.5
#   xMaxBackground = row[[3]] + 5.5
#   yMinBackground = row[[2]] - 1.5
#   yMaxBackground = row[[2]] + 1.5
#   colorBackground = matrix(c(rep("white",10)), nrow = 1)
#   p2 = p2 + annotation_raster(colorBackground, xMinBackground,xMaxBackground, yMinBackground, yMaxBackground)
# }


##########################################################
for(i in 1:nrow(sweptXYZOrderNoNaN5)) {
  row <- sweptXYZOrderNoNaN5[i,]
  xMin = row[[3]] - 5
  xMax = row[[3]] + 5
  yMin = row[[2]] - 5 
  yMax = row[[2]] - 3.5
#   colorOrder = matrix(c(rep("#FF0000FF",row[[4]]), rep("#FF9900FF",row[[5]]), rep("papayawhip",row[[6]]),rep("hotpink",row[[7]])), nrow = 1)
  colorOrder = matrix(c(rep("#FF0000FF",row[[4]]), rep("#FF9900FF",row[[5]]), rep("black",row[[6]]),rep("chartreuse",row[[7]])), nrow = 1)
  p1 = p1 + annotation_raster(colorOrder, xMin,xMax, yMin, yMax)
}
for(i in 1:nrow(sweptXYZOrderNoNaN15)) {
  row <- sweptXYZOrderNoNaN15[i,]
  xMin = row[[3]] - 5
  xMax = row[[3]] + 5
  yMin = row[[2]] - 5 
  yMax = row[[2]] - 3.5
#   colorOrder = matrix(c(rep("#FF0000FF",row[[4]]), rep("#FF9900FF",row[[5]]), rep("papayawhip",row[[6]]),rep("hotpink",row[[7]])), nrow = 1)
  colorOrder = matrix(c(rep("#FF0000FF",row[[4]]), rep("#FF9900FF",row[[5]]), rep("black",row[[6]]),rep("chartreuse",row[[7]])), nrow = 1)
  p2 = p2 + annotation_raster(colorOrder, xMin,xMax, yMin, yMax)
}

sumRowLayer = apply(castMSubDataLayer[8: 12], 1, sum)
sweptLayer = round(sweep(castMSubDataLayer[8: 12], 1, sumRowLayer, "/"), 3) * 1000
sweptXYZLayer = data.frame(castMSubDataLayer[1:3], sweptLayer)
sweptXYZLayerNoNaN = na.omit(sweptXYZLayer)
sweptXYZLayerNoNaN5 = subset(sweptXYZLayerNoNaN, YCenter == -5)
sweptXYZLayerNoNaN15 = subset(sweptXYZLayerNoNaN, YCenter == -15)

for(i in 1:nrow(sweptXYZLayerNoNaN5)) {
  row <- sweptXYZLayerNoNaN5[i,]
  xMin = row[[3]] - 5
  xMax = row[[3]] + 5
  yMin = row[[2]] + 3.5
  yMax = row[[2]] + 5
  #cadetblue1 cyan turquoise1 lightcyan

#   colorType = matrix(c(rep("grey0",row[[4]]), rep("paleturquoise",row[[5]]), rep("darkgreen",row[[6]]),rep("green2",row[[7]]), rep("yellow",row[[8]])), nrow = 1)
  colorType = matrix(c(rep("blue",row[[4]]), rep("turquoise1",row[[5]]), rep("darkgreen",row[[6]]),rep("green2",row[[7]]), rep("darkmagenta",row[[8]])), nrow = 1)
  p1 = p1 + annotation_raster(colorType, xMin,xMax, yMin, yMax)
}

for(i in 1:nrow(sweptXYZLayerNoNaN15)) {
  row <- sweptXYZLayerNoNaN15[i,]
  xMin = row[[3]] - 5
  xMax = row[[3]] + 5
  yMin = row[[2]] + 3.5
  yMax = row[[2]] + 5
#   colorType = matrix(c(rep("grey0",row[[4]]), rep("paleturquoise",row[[5]]), rep("darkgreen",row[[6]]),rep("green2",row[[7]]), rep("yellow",row[[8]])), nrow = 1)
  colorType = matrix(c(rep("blue",row[[4]]), rep("turquoise1",row[[5]]), rep("darkgreen",row[[6]]),rep("green2",row[[7]]), rep("darkmagenta",row[[8]])), nrow = 1)
  p2 = p2 + annotation_raster(colorType, xMin,xMax, yMin, yMax)
}


p1 + annotate("point", x = -15, y = 0, size = 2, colour = "deeppink") + annotate("point", x = 15, y = 0, size = 2, colour = "deeppink")
p2 + annotate("point", x = -15, y = 0, size = 2, colour = "deeppink") + annotate("point", x = 15, y = 0, size = 2, colour = "deeppink")



tmp <- ggplot_gtable(ggplot_build(p1)) 
leg <- which(sapply(tmp$grobs, function(x) x$name) == "guide-box") 
legend <- tmp$grobs[[leg]] 

#grid.arrange(arrangeGrob(p1, p2, p3, p4, nrow = 2))

grid.arrange(arrangeGrob(p1 + theme(legend.position="none"), p2 + theme(legend.position="none"), p3 + theme(legend.position="none"), p4 + theme(legend.position="none"), 
                         left = textGrob("Perpendicular to the row (cm)", x = unit(0.5, "npc"), y = unit(0.5, "npc"), rot = 90, gp=gpar(font=2)), sub = textGrob("Parallel to the row (cm)", x = unit(0.5, "npc"), y = unit(0.7, "npc"), gp=gpar(font=2))), 
             Legend = legend,  
             widths=c(7/8, 1/8), 
             nrow=1
)

dev.off()

0 个答案:

没有答案