R语言 ggplot2中具有共享轴的两个水平条形图(类似于人口金字塔)[重复]

5ktev3wc  于 2023-10-13  发布在  其他
关注(0)|答案(1)|浏览(106)

此问题已在此处有答案

Drawing a pyramid plot(5个答案)
去年就关门了。
我想在一个图上绘制两个变量,类似于人口金字塔,类似于这样:

这个情节是 * 几乎 * 有,但不完全,原因我将在下面列出。
我用以下代码生成了这个图:

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"])

我想将两个图背靠背地“粘合”在一起,所以我使用了http://www.cookbook-r.com/Graphs/Multiple_graphs_on_one_page_%28ggplot2%29/中的multiplot()函数
(为了简洁明了,我不会在这里重复该函数的代码)
最后一个plot的代码是:

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)

好吧。那么这个情节有什么问题?

  • 我需要得到左图右轴上的刻度线。我不知道该怎么做。
  • 这两个图的宽度不同。这是因为中间的状态是右侧图中的轴标签,并使用了该图的一些空间。

我在把这个地块变成“生产质量”的过程中遇到了困难。我开始怀疑我是不是用了错误的方法,因为我认为下一步将是在两个图之间绘制轴标签作为单独的第三列。(我还不知道该怎么做)。这将解决“大小相等”的问题,并允许我添加一个“州”的标题,所以它可能仍然是要走的路。但我还是忍不住想有没有更简单的方法...
任何建议或帮助赞赏!

vaj7vani

vaj7vani1#

这是一个很长的解决方案。我们的想法是创建一个新的图,它只包含两边的州名和刻度,然后将其用作中间图。
对于这个图,我添加了没有名称的标题来获得空间,并添加了ylab(NULL)来删除空间。对于左右边距值为-1,以使图更接近其他图。应在打印前添加grid库,以使用unit()函数进行打印边距。

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()连接图。在绘制之前,所有的地块都是作为grobs。

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))

相关问题