gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 12:44:39 25 4
gpt4 key购买 nike

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

由于我将在下面列出原因,该图几乎存在,但并不完全。

我使用以下代码生成了该图:

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()函数

(为了简洁起见,我不会在此处复制该函数的代码)

我的最终情节代码是:
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)

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

  • 为了使该图达到“生产质量”,我遇到了麻烦。我开始怀疑我是否会以错误的方式进行操作,因为我认为下一步将是在两个图之间将轴标签绘制为单独的第三列。 (我尚不知道该怎么做)。这将解决“大小相等”的问题,并允许我添加“州”标题,因此它仍然是可行的方法。但是我不禁想知道是否有更简单的方法...

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

    最佳答案

    这是您的情节非常长的解决方法。想法是创建一个新的图,该图仅在两侧包含状态名称和刻度,然后将其用作中间图。

    对于此情节,我添加了没有名称的标题来获取空间,并添加了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()合并图。在绘制之前,所有地块均作成小样。
    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))

    关于r - ggplot2中具有共享轴的两个水平条形图(类似于人口金字塔),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18265941/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com