如何在ggplot2中控制多个图的宽度?

约拉希

地图数据:InputSpatialData

收益率数据:InputYieldData

Results_using viewport(): 阴谋

编辑:使用@rawr建议的使用“ multiplot”功能的结果(请参阅下面的评论)。我确实喜欢新的结果,尤其是地图更大。尽管如此,箱线图似乎仍与地图图未对齐。有没有更系统的方法来控制居中和放置?剧情1

我的问题:有没有一种方法可以控制箱形图的大小,使其大小接近并以上方的图为中心?

完整代码:

    ## Loading packages
    library(rgdal)
    library(plyr)
    library(maps)
    library(maptools)
    library(mapdata)
    library(ggplot2)
    library(RColorBrewer)
    library(foreign)  
    library(sp)
    library(ggsubplot)
    library(reshape)
    library(gridExtra)

    ## get.centroids: function to extract polygon ID and centroid from shapefile
    get.centroids = function(x){
    poly = wmap@polygons[[x]]
    ID   = poly@ID
    centroid = as.numeric(poly@labpt)
    return(c(id=ID, long=centroid[1], lat=centroid[2]))
    }

    ## read input files (shapefile and .csv file)
    wmap <- readOGR(dsn=".", layer="ne_110m_admin_0_countries")
    wyield <- read.csv(file = "F:/Purdue University/RA_Position/PhD_ResearchandDissert/PhD_Draft/GTAP-CGE/GTAP_Sims&Rests/NewFiles/RMaps_GTAP/AllWorldCountries_CCShocksGTAP.csv", header=TRUE, sep=",", na.string="NA", dec=".", strip.white=TRUE)
    wyield$ID_1 <- substr(wyield$ID_1,3,10) # Eliminate the ID_1 column

    ## re-order the shapefile
    wyield <- cbind(id=rownames(wmap@data),wyield)

    ## Build table of labels for annotation (legend).
    labs <- do.call(rbind,lapply(1:17,get.centroids)) # Call the polygon ID and centroid from shapefile
    labs <- merge(labs,wyield[,c("id","ID_1","name_long")],by="id") # merging the "labs" data with the spatial data
    labs[,2:3] <- sapply(labs[,2:3],function(x){as.numeric(as.character(x))})
    labs$sort <- as.numeric(as.character(labs$ID_1))
    labs <- cbind(labs, name_code = paste(as.character(labs[,4]), as.character(labs[,5])))
    labs <- labs[order(labs$sort),]

    ## Dataframe for boxplot plot
    boxplot.df <- wyield[c("ID_1","name_long","A1B","A1BLow","A1F","A1T","A2","B1","B1Low","B2")]
    boxplot.df[1] <- sapply(boxplot.df[1], as.numeric)
    boxplot.df <- boxplot.df[order(boxplot.df$ID_1),]
    boxplot.df <- cbind(boxplot.df, name_code = paste(as.character(boxplot.df[,1]), as.character(boxplot.df[,2])))
    boxplot.df <- melt(boxplot.df, id=c("ID_1","name_long","name_code"))
    boxplot.df <- transform(boxplot.df,name_code=factor(name_code,levels=unique(name_code)))

    ## Define new theme for map
    ## I have found this function on the website
    theme_map <- function (base_size = 14, base_family = "serif") {
    # Select a predefined theme for tweaking features
    theme_bw(base_size = base_size, base_family = base_family) %+replace% 
    theme(
    axis.line=element_blank(),
    axis.text.x=element_text(size=rel(1.2), color="grey"),
    axis.text.y=element_text(size=rel(1.2), color="grey"),
    axis.ticks=element_blank(),
    axis.ticks.length=unit(0.3, "lines"),
    axis.ticks.margin=unit(0.5, "lines"),
    axis.title.x=element_text(size=rel(1.2), color="grey"),
    axis.title.y=element_text(size=rel(1.2), color="grey"),
    legend.background=element_rect(fill="white", colour=NA),
    legend.key=element_rect(colour="white"),
    legend.key.size=unit(1.3, "lines"),
    legend.position="right",
    legend.text=element_text(size=rel(1.3)),
    legend.title=element_text(size=rel(1.4), face="bold", hjust=0),
    panel.border=element_blank(),
    panel.grid.minor=element_blank(),
    plot.title=element_text(size=rel(1.8), face="bold", hjust=0.5, vjust=2),
    plot.margin=unit(c(0.5,0.5,0.5,0.5), "lines")
    )}

    ## Transform shapefile to dataframe and merge with yield data
    wmap_df <- fortify(wmap)
    wmap_df <- merge(wmap_df,wyield, by="id") # merge the spatial data and the yield data

    ## Plot map
    mapy <- ggplot(wmap_df, aes(long,lat, group=group)) 
    mapy <- mapy + geom_polygon(aes(fill=AVG))
    mapy <- mapy + geom_path(data=wmap_df, aes(long,lat, group=group, fill=A1BLow), color="white", size=0.4) 
    mapy <- mapy + labs(title="Average yield impacts (in %) across SRES scenarios ") + scale_fill_gradient2(name = "%Change in yield",low = "red3",mid = "snow2",high = "darkgreen") 
    mapy <- mapy + coord_equal() + theme_map()
    mapy <- mapy + geom_text(data=labs, aes(x=long, y=lat, label=ID_1, group=ID_1), size=6, family="serif") 
    mapy

    ## Plot boxplot
    boxploty <- ggplot(data=boxplot.df, aes(factor(name_code),value)) + 
    geom_boxplot(stat="boxplot", 
           position="dodge", 
           fill="grey",
           outlier.colour = "blue", 
           outlier.shape = 16, 
           outlier.size = 4) +
    labs(title="Distribution of yield impacts (in %) by GTAP region", y="Yield (% Change)") + theme_bw() + coord_flip() +
    stat_summary(fun.y = "mean", geom = "point", shape=21, size= 4, color= "red") +
    theme(plot.title = element_text(size = 26,
                              hjust = 0.5,
                              vjust = 1,
                              face = 'bold',
                              family="serif")) +
    theme(axis.text.x = element_text(colour = 'black',
                               size = 18,
                               hjust = 0.5, 
                               vjust = 1,
                               family="serif"),
    axis.title.x = element_text(size = 14, 
                               hjust = 0.5,
                               vjust = 0, 
                               face = 'bold',
                               family="serif")) +  
    theme(axis.text.y = element_text(colour = 'black', 
                               size = 18, 
                               hjust = 0, 
                               vjust = 0.5,
                               family="serif"), 
    axis.title.y = element_blank())
    boxploty

    ## I found this code on the website, and tried to tweak it to achieve my desired
    result, but failed
    # Plot objects using widths and height and respect to fix aspect ratios
    grid.newpage()
    pushViewport( viewport( layout = grid.layout( 2 , 1 , widths = unit( c( 1 ) , "npc" ) ,
                                                  heights = unit( c( 0.45 ) , "npc" ) , 
                                                  respect = matrix(rep(2,1),2) ) ) ) 
    print( mapy, vp = viewport( layout.pos.row = 1, layout.pos.col = 1 ) )
    print( boxploty, vp = viewport( layout.pos.row = 2, layout.pos.col = 1 ) )
    upViewport(0)
    vp3 <- viewport( width = unit(0.5,"npc") , x = 0.9 , y = 0.5)
    pushViewport(vp3)
    #grid.draw( legend )
    popViewport()
耶洛华德

这接近您的想法了吗?

代码:

library(rgdal)
library(ggplot2)
library(RColorBrewer)
library(reshape)
library(gridExtra)

setwd("<directory with all your files...>")

get.centroids = function(x){   # extract centroids from polygon with given ID
  poly = wmap@polygons[[x]]
  ID   = poly@ID
  centroid = as.numeric(poly@labpt)
  return(c(id=ID, c.long=centroid[1], c.lat=centroid[2]))
}

wmap   <- readOGR(dsn=".", layer="ne_110m_admin_0_countries")
wyield <- read.csv(file = "AllWorldCountries_CCShocksGTAP.csv", header=TRUE)
wyield <- transform(wyield, ID_1 = substr(ID_1,3,10))  #strip leading "TR"

# wmap@data and wyield have common, unique field: name
wdata  <- data.frame(id=rownames(wmap@data),name=wmap@data$name)
wdata  <- merge(wdata,wyield, by="name")
labs   <- do.call(rbind,lapply(1:17,get.centroids)) # extract polygon IDs and centroids from shapefile
wdata  <- merge(wdata,labs,by="id")
wdata[c("c.lat","c.long")] <- sapply(wdata[c("c.lat","c.long")],function(x) as.numeric(as.character(x)))

wmap.df <- fortify(wmap)                # data frame for world map
wmap.df <- merge(wmap.df,wdata,by="id") # merge data to fill polygons

palette <- brewer.pal(11,"Spectral")    # ColorBrewewr.org spectral palette, 11 colors
ggmap   <- ggplot(wmap.df, aes(x=long, y=lat, group=group))
ggmap   <- ggmap + geom_polygon(aes(fill=AVG))
ggmap   <- ggmap + geom_path(colour="grey50", size=.1)
ggmap   <- ggmap + geom_text(aes(x=c.long, y=c.lat, label=ID_1),size=3)
ggmap   <- ggmap + scale_fill_gradientn(name="% Change",colours=rev(palette))
ggmap   <- ggmap + theme(plot.title=element_text(face="bold"),legend.position="left")
ggmap   <- ggmap + coord_fixed()
ggmap   <- ggmap + labs(x="",y="",title="Average Yield Impacts across SRES Scenarios (% Change)")
ggmap   <- ggmap + theme(plot.margin=unit(c(0,0.03,0,0.05),units="npc"))
ggmap

box.df       <- wdata[order(as.numeric(wdata$ID_1)),]    # order by ID_1
box.df$label <- with(box.df, paste0(name_long," [",ID_1,"]")) # create labels for boxplot
box.df       <- melt(box.df,id.vars="label",measure.vars=c("A1B","A1BLow","A1F","A1T","A2","B1","B1Low","B2"))
box.df$label <- factor(box.df$label,levels=unique(box.df$label)) # need this so orderin is maintained in ggplot

ggbox   <- ggplot(box.df,aes(x=label, y=value))
ggbox   <- ggbox + geom_boxplot(fill="grey", outlier.colour = "blue", outlier.shape = 16, outlier.size = 4)
ggbox   <- ggbox + stat_summary(fun.y=mean, geom="point", shape=21, size= 4, color= "red")
ggbox   <- ggbox + coord_flip()
ggbox   <- ggbox + labs(x="", y="% Change", title="Distribution of Yield Impacts by GTAP region")
ggbox   <- ggbox + theme(plot.title=element_text(face="bold"), axis.text=element_text(color="black"))
ggbox   <- ggbox + theme(plot.margin=unit(c(0,0.03,0,0.0),units="npc"))
ggbox

grid.newpage()
pushViewport(viewport(layout=grid.layout(2,1,heights=c(0.40,0.60))))
print(ggmap, vp=viewport(layout.pos.row=1,layout.pos.col=1))
print(ggbox, vp=viewport(layout.pos.row=2,layout.pos.col=1))

Explanation: The last 4 lines of code do most of the work in arranging the layout. I create a viewport layout with 2 viewports arranged as 2 rows in 1 column. The upper viewport is 40% of the height of the grid, the lower viewport is 60% of the height. Then, in the ggplot calls I create a right margin of 3% of the plot width for both the map and he boxplot, and a left margin for the map so that the map and the boxplot are aligned on the left. There's a fair amount of tweaking to get everything lined up, but these are the parameters to play with. You should also know that, since we use coord_fixed() in the map, if you change the overall size of the plot (by resizing the plot window, for example), the map's width will change..

Finally, your code to create the choropleth map is a little dicey...

## re-order the shapefile
wyield <- cbind(id=rownames(wmap@data),wyield)

这并不会重新排序shape文件。您在这里所做的只是wmap@datawyield数据中添加行名。这个作品如果行中wyield都以相同的顺序在WMAP的多边形-一个非常危险的假设。如果不是,那么您将得到一张地图,但是颜色将不正确,并且除非您非常仔细地研究输出,否则很可能会错过它。因此,上面的代码在多边形ID和区域名称之间创建了一个关联,合并了wyield基于数据name,然后将其合并到wmp.df基于多边形id

wdata  <- data.frame(id=rownames(wmap@data),name=wmap@data$name)
wdata  <- merge(wdata,wyield, by="name")
...
wmap.df <- fortify(wmap)                # data frame for world map
wmap.df <- merge(wmap.df,wdata,by="id") # merge data to fill polygons

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何使ggplot2中的图例与图的高度相同?

来自分类Dev

ggplot2如何绘制多个区域图?

来自分类Dev

如何在R中的ggplot2中的方须图中改变中间线的宽度?

来自分类Dev

控制ggplot2中多层图的图例

来自分类Dev

如何在ggplot2中控制多个图的宽度?

来自分类Dev

如何在ggplot2中的图之间保持点大小比例恒定?

来自分类Dev

如何在ggplot2中绘制裁剪的密度图而不会丢失部分

来自分类Dev

如何在ggplot2或R中绘制雷达图

来自分类Dev

如何通过ggplot2中的facet_wrap排序多个图

来自分类Dev

如何在ggplot2中使用facet_grid制作甜甜圈图?

来自分类Dev

如何在ggplot2中为grid.layout图添加标题?

来自分类Dev

对ggplot2中的多个图使用循环

来自分类Dev

如何在ggplot2中创建等效的基本R图'type = b'?

来自分类Dev

如何使用ggplot2在多个pdf页面中获取图

来自分类Dev

如何在ggplot2中正确绘制多个具有数字x值的箱形图?

来自分类Dev

如何在单个ggplot2中对齐图层(密度图和垂直线)

来自分类Dev

如何在ggplot2中组合点图和箱图图例?

来自分类Dev

如何在ggplot2中绘制组合的条形图和折线图

来自分类Dev

如何在ggplot2中做并排条形图?

来自分类Dev

在ggplot2中以不同比例绘制多个图

来自分类Dev

在ggplot2中跨多个图创建线

来自分类Dev

我如何在R ggplot2中的图上覆盖箱形图

来自分类Dev

如何在ggplot2中为树图的标签文本设置相同的大小

来自分类Dev

如何使用图例在ggplot2中创建分段图?

来自分类Dev

ggplot2如何绘制多个区域图?

来自分类Dev

如何在ggplot2中绘制裁剪的密度图而不会丢失任何部分

来自分类Dev

如何在R中从最高到最低对条形图进行排序?(ggplot2)

来自分类Dev

如何修复ggplot2中制作的动态图?

来自分类Dev

TropFishR plot.lfq 函数限制,如何在ggplot2中生成类似图

Related 相关文章

  1. 1

    如何使ggplot2中的图例与图的高度相同?

  2. 2

    ggplot2如何绘制多个区域图?

  3. 3

    如何在R中的ggplot2中的方须图中改变中间线的宽度?

  4. 4

    控制ggplot2中多层图的图例

  5. 5

    如何在ggplot2中控制多个图的宽度?

  6. 6

    如何在ggplot2中的图之间保持点大小比例恒定?

  7. 7

    如何在ggplot2中绘制裁剪的密度图而不会丢失部分

  8. 8

    如何在ggplot2或R中绘制雷达图

  9. 9

    如何通过ggplot2中的facet_wrap排序多个图

  10. 10

    如何在ggplot2中使用facet_grid制作甜甜圈图?

  11. 11

    如何在ggplot2中为grid.layout图添加标题?

  12. 12

    对ggplot2中的多个图使用循环

  13. 13

    如何在ggplot2中创建等效的基本R图'type = b'?

  14. 14

    如何使用ggplot2在多个pdf页面中获取图

  15. 15

    如何在ggplot2中正确绘制多个具有数字x值的箱形图?

  16. 16

    如何在单个ggplot2中对齐图层(密度图和垂直线)

  17. 17

    如何在ggplot2中组合点图和箱图图例?

  18. 18

    如何在ggplot2中绘制组合的条形图和折线图

  19. 19

    如何在ggplot2中做并排条形图?

  20. 20

    在ggplot2中以不同比例绘制多个图

  21. 21

    在ggplot2中跨多个图创建线

  22. 22

    我如何在R ggplot2中的图上覆盖箱形图

  23. 23

    如何在ggplot2中为树图的标签文本设置相同的大小

  24. 24

    如何使用图例在ggplot2中创建分段图?

  25. 25

    ggplot2如何绘制多个区域图?

  26. 26

    如何在ggplot2中绘制裁剪的密度图而不会丢失任何部分

  27. 27

    如何在R中从最高到最低对条形图进行排序?(ggplot2)

  28. 28

    如何修复ggplot2中制作的动态图?

  29. 29

    TropFishR plot.lfq 函数限制,如何在ggplot2中生成类似图

热门标签

归档