首页 文章

ggplot2中共享轴的两个水平条形图(类似于人口金字塔)

提问于
浏览
18

我想在一个类似于人口金字塔的图上绘制两个变量:

plot

由于我将在下面列出的原因,这个情节几乎存在但不完全 .

我使用以下代码制作了这个图:

DATA <- data.frame(
    state = c("AK", "TX", "CA", "MT", "NM", "AZ", "NV", "CO", "OR", "WY", "MI", "MN", "UT", "ID", "KS", "NE", "SD", "WA", "ND", "OK"),
    sales_staff = c(20,30,40,10,15,35,18,25,22,7,12,22,3,4,5,8,14,28,24,32)
)

set.seed(1)
DATA$sales <- DATA$sales_staff * 50 + (runif(nrow(DATA)) * 1000)

# Order the state factor by number of sales staff so that it is plotted in that order
DATA$state <- factor(DATA$state, levels = DATA[order(DATA$sales_staff),"state"])

我想"glue"两个地块背靠背,所以我使用multiplot()函数从http://www.cookbook-r.com/Graphs/Multiple_graphs_on_one_page_%28ggplot2%29/逐字

(为简洁起见,我不会在这里重现该功能的代码)

我的最终情节代码是:

library(ggplot2)

g1 <- ggplot(data = DATA, aes(x = state, y = sales_staff)) +
  geom_bar(stat = "identity") + ggtitle("Number of sales staff") +
  theme(axis.title.x = element_blank(), axis.title.y = element_blank(), axis.text.y = element_blank(), axis.ticks.y = element_blank(), plot.margin = unit(c(1,0,1,0), "mm")) +
  scale_y_reverse() + coord_flip()

g2 <- ggplot(data = DATA, aes(x = state, y = sales)) +
  geom_bar(stat = "identity") + ggtitle("Sales (x $1000)") +
  theme(axis.title.x = element_blank(), axis.title.y = element_blank(), plot.margin = unit(c(1,5,1,0), "mm")) +
  coord_flip()

multiplot(g1, g2, cols = 2)

好 . 那么情节怎么了?

  • 我需要在左图的右轴上得到刻度线 . 我无法弄清楚如何做到这一点 .

  • 这两个图是不同的宽度 . 这是因为中间的状态是右图中的轴标签,并使用该图的一些空间 .

为了让这个情节达到“ 生产环境 质量”,我已经打了一堵砖墙 . 我开始怀疑我是否会以错误的方式解决这个问题,因为我认为下一步是将轴标签绘制为两个图之间的第三列 . (我还不知道该怎么做) . 这将解决“相同大小”问题并允许我添加“状态” Headers ,因此它可能仍然是要走的路 . 但我不禁想知道是否有更简单的方法......

任何建议或帮助表示赞赏!

1 回答

  • 25

    这是你的情节很长的解决方法 . 想法是创建新的图,其中仅包含两侧的州名和刻度,然后将其用作中间图 .

    对于这个情节,我添加了没有名称的 Headers 以获得空间,并且 ylab(NULL) 删除空间 . 对于左边距和右边距值,为-1以使绘图更接近其他图 . 在绘制使用函数 unit() 作为绘图边距之前,应添加库 grid .

    library(grid)
    g.mid<-ggplot(DATA,aes(x=1,y=state))+geom_text(aes(label=state))+
      geom_segment(aes(x=0.94,xend=0.96,yend=state))+
      geom_segment(aes(x=1.04,xend=1.065,yend=state))+
      ggtitle("")+
      ylab(NULL)+
      scale_x_continuous(expand=c(0,0),limits=c(0.94,1.065))+
      theme(axis.title=element_blank(),
            panel.grid=element_blank(),
            axis.text.y=element_blank(),
            axis.ticks.y=element_blank(),
            panel.background=element_blank(),
            axis.text.x=element_text(color=NA),
            axis.ticks.x=element_line(color=NA),
            plot.margin = unit(c(1,-1,1,-1), "mm"))
    

    两个原始图都被修改 . 首先,删除第二个绘图的y轴,并使左/右边距为-1 .

    g1 <- ggplot(data = DATA, aes(x = state, y = sales_staff)) +
      geom_bar(stat = "identity") + ggtitle("Number of sales staff") +
      theme(axis.title.x = element_blank(), 
            axis.title.y = element_blank(), 
            axis.text.y = element_blank(), 
            axis.ticks.y = element_blank(), 
            plot.margin = unit(c(1,-1,1,0), "mm")) +
      scale_y_reverse() + coord_flip()
    
    g2 <- ggplot(data = DATA, aes(x = state, y = sales)) +xlab(NULL)+
      geom_bar(stat = "identity") + ggtitle("Sales (x $1000)") +
      theme(axis.title.x = element_blank(), axis.title.y = element_blank(), 
            axis.text.y = element_blank(), axis.ticks.y = element_blank(),
            plot.margin = unit(c(1,0,1,-1), "mm")) +
      coord_flip()
    

    现在使用库 gridExtra 和函数d grid.arrange() 来连接图 . 在绘制之前,所有绘图都是作为凹陷 .

    library(gridExtra)
    gg1 <- ggplot_gtable(ggplot_build(g1))
    gg2 <- ggplot_gtable(ggplot_build(g2))
    gg.mid <- ggplot_gtable(ggplot_build(g.mid))
    
    grid.arrange(gg1,gg.mid,gg2,ncol=3,widths=c(4/9,1/9,4/9))
    

    enter image description here

相关问题