ggplot:相同的条形宽度,不同的条形数量

问题描述 投票:0回答:2

我想要条形图,其中不同图中的条形图具有相同的宽度,无论显示多少个条形图。我不想在同一页面上显示这些图,或者用小平面、

grid.arrange
或类似的东西排列它们,而只是有两个具有相同宽度的条形图。

我可以通过将宽度乘以图中的条形数量除以图中条形最多的条形数量来实现此目的(请参见示例)。但如果我可以在 ggplot 调用之前不进行任何计算就可以做到这一点,那么代码会更方便、更干净。

有没有办法以线、em、厘米等单位指定条形宽度?

或者我可以在调用

geom_col
时访问映射到 x 美学的变量的级别数吗? (注意映射到图之间 x 美学变化的变量)

或者还有其他简单的解决方案吗?

ggplot(data.frame(x=factor(1:2), y=4:5), aes(x=x, y=y)) + 
  geom_col(width=0.7*2/3)

ggplot(data.frame(A=factor(1:3), y=3:5), aes(x=A, y=y)) + 
  geom_col(width=0.7*3/3)
r ggplot2 bar-chart
2个回答
2
投票

AFAIK,您不能将绝对宽度设置为

geom_col()
/
geom_bar()
,因此您要么必须预先计算条形的比例和纵横比,要么使用
geom_segment()
接受绝对的
size
参数。这些不是内部参数化为矩形,并且不采用单独的
colour
fill
参数。

library(ggplot2)
library(patchwork)

g1 <- ggplot(data.frame(x=factor(1:2), y=4:5), aes(x=x, y=y, xend = x, yend = 0)) + 
  geom_segment(size = 20)

g2 <- ggplot(data.frame(A=factor(1:3), y=3:5), aes(x=A, y=y, xend=A, yend = 0)) + 
  geom_segment(size = 20)

g1 + g2


0
投票

如果您只想保持不同

geom_col()
geom_bar()
图中条形的宽度,请考虑以下示例:

library(ggplot2)
library(patchwork)
    
wr <- 0.08 # width rate 
    
nc <- 10 # number of x categories
    
df1 <- data.frame(
   category = factor(letters[1:nc]),
   value = runif(nc,5,20)
   )
    
g1 <- ggplot(df1, aes(x=category, y=value)) +
   geom_col(width=nc*wr) +
   labs(x="category", y="value")
      
nc <- 4 # number of x categories
    
df2 <- data.frame(
   category = factor(letters[1:nc]),
   value = runif(nc,5,20)
   )

g2 <- ggplot(df2, aes(x=category, y=value)) +
   geom_col(width=nc*wr) +
   labs(x="category", y="value")

g1 + g2

尺寸率越小,条形就会越细且间距更大。我通常通过观察类别数最多的图来调整该值,以确保不会重叠。

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.