R语言 ggplot条形图中的恒定宽度

7bsow1i6  于 2023-07-31  发布在  其他
关注(0)|答案(3)|浏览(95)

如何使用ggplot使几个条形图的条形宽度和间距固定,每个图上有不同数量的条形?
下面是一个失败的尝试:

m <- data.frame(x=1:10,y=runif(10))
ggplot(m, aes(x,y)) + geom_bar(stat="identity")

字符串


的数据

ggplot(m[1:3,], aes(x,y)) + geom_bar(stat="identity")

width=1添加到geom_bar(...)也没有帮助。我需要第二个情节自动有更少的宽度和相同的酒吧宽度和空间作为第一个。

b4lqfgs4

b4lqfgs41#

编辑:

看起来OP只是想要这个:

library(gridExtra)
grid.arrange(p1,arrangeGrob(p2,widths=c(1,2),ncol=2), ncol=1)

字符串
我不确定是否可以将绝对宽度传递给geom_bar。这是一个丑陋的hack:

set.seed(42)
m <- data.frame(x=1:10,y=runif(10))
p1 <- ggplot(m, aes(x,y)) + geom_bar(stat="identity")
p2 <- ggplot(m[1:3,], aes(x,y)) + geom_bar(stat="identity")
g1 <- ggplotGrob(p1)
g2 <- ggplotGrob(p2)


我使用str来找到正确的grob和child。如果需要的话,可以使用更复杂的方法来概括这一点。

#store the old widths
old.unit <- g2$grobs[[4]]$children[[2]]$width[[1]]

#change the widths
g2$grobs[[4]]$children[[2]]$width <- rep(g1$grobs[[4]]$children[[2]]$width[[1]],
                                         length(g2$grobs[[4]]$children[[2]]$width))

#copy the attributes (units)
attributes(g2$grobs[[4]]$children[[2]]$width) <- attributes(g1$grobs[[4]]$children[[2]]$width)

#position adjustment (why are the bars justified left???)
d <- (old.unit-g2$grobs[[4]]$children[[2]]$width[[1]])/2
attributes(d) <- attributes(g2$grobs[[4]]$children[[2]]$x)
g2$grobs[[4]]$children[[2]]$x <- g2$grobs[[4]]$children[[2]]$x+d

#plot
grid.arrange(g1,g2)


的数据

mo49yndu

mo49yndu2#

将其他建议 Package 在一个只需要一个图形的函数中。

fixedWidth <- function(graph, width=0.1) {
  g2 <- graph

  #store the old widths
  old.unit <- g2$grobs[[4]]$children[[2]]$width[[1]]
  original.attibutes <- attributes(g2$grobs[[4]]$children[[2]]$width)

  #change the widths
  g2$grobs[[4]]$children[[2]]$width <- rep(width,
                                           length(g2$grobs[[4]]$children[[2]]$width))

  #copy the attributes (units)
  attributes(g2$grobs[[4]]$children[[2]]$width) <- original.attibutes

  #position adjustment (why are the bars justified left???)
  d <- (old.unit-g2$grobs[[4]]$children[[2]]$width[[1]])/2
  attributes(d) <- attributes(g2$grobs[[4]]$children[[2]]$x)
  g2$grobs[[4]]$children[[2]]$x <- g2$grobs[[4]]$children[[2]]$x+d

  return(g2)
}

字符串

niwlg2el

niwlg2el3#

我解决了一个类似的问题:

mywidth = .5
ggplot(m, aes(x,y)) + 
    geom_col(width=log(1 + length(unique(m$x))) * mywidth)

字符串
由于geom_bar()试图根据x轴变量的唯一值数量来调整条形宽度,log()会随着x的唯一值数量的增加而快速增加,从而将累积的geom_bar()+自定义宽度“展平”为一个常数值,从而“撤消”此操作。
1 +是用来处理log(1)=0的。
您可以根据需要调整mywidth的值。

相关问题