Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 带组的减淡条形图的自定义条形宽度_R_Ggplot2 - Fatal编程技术网

R 带组的减淡条形图的自定义条形宽度

R 带组的减淡条形图的自定义条形宽度,r,ggplot2,R,Ggplot2,绘制可变宽度的条形图是一个常见的要求,我在这里找到了许多解决方案,但它们似乎只有在绘图由单个条形图组成时才起作用,而我将它们分组: set.seed(1) dat <- data.frame(group=c('foo', 'foo', 'foo', 'bar', 'xyz', 'xyz'), indiv=c('foA', 'foB', 'foC', 'baD', 'xyE', 'xyF'), val=sample(3

绘制可变宽度的条形图是一个常见的要求,我在这里找到了许多解决方案,但它们似乎只有在绘图由单个条形图组成时才起作用,而我将它们分组:

set.seed(1)
dat <- data.frame(group=c('foo', 'foo', 'foo', 'bar', 'xyz', 'xyz'), 
                  indiv=c('foA', 'foB', 'foC', 'baD', 'xyE', 'xyF'),
                  val=sample(30:90, 6),
                  wid=sample(2:8, 6)
                  )

ggplot(dat, aes(x=group, y=val)) + 
  geom_bar(aes(fill=indiv), stat="identity", position="dodge") +
  theme_bw() # btw this also doesn't work as expected but that's another question
set.seed(1)

dat我会把我的解决方案放在这里,但我觉得它很难看,如果有人能提出更好的解决方案,我会很高兴

# convert to data.table -
# just because I'm more familiar with it, otherwise just use `plyr`
dat <- data.table(dat)

# assign number to each group:
dat[, grp:=.GRP, by=group]

gap <- 2 # gap width

# coordinate of each bar:
dat$pos <- dat$grp*gap + 0.5 * (cumsum(dat$wid) + cumsum(c(0, dat$wid[-length(dat$wid)])))

#coordinate of each group's label:
grppos <- dat[, (min(pos-wid/2)+max(pos+wid/2))/2, by=group]

# draw plot
ggplot(dat, aes(x=pos, y=val)) + 
  geom_bar(aes(width=wid), stat="identity", col='black') +
  scale_x_continuous(labels=grppos$group, breaks=grppos$V1)
#转换为data.table-
#只是因为我更熟悉它,否则就用'plyr'`

dat您需要将数据分组到不同的存储箱中。请参阅:。请看:@Jean-Paul,谢谢你的回答,但目前我不明白如何将这些例子应用到我的情况中。我想知道第一篇文章的想法是什么(第二篇,你认为是重复的,我以前读过,它肯定对我没有帮助——这不是关于小组的)。(我添加了图片以更清楚地说明)我误读了第二篇文章的答案。你是对的,你面临着一个不同的问题。让我试着帮你。我已经提交了答案。我是背诵的(没有检查任何结果),所以可能会有一些错误。不管怎么说,你应该知道大概的意思。祝你好运:)你能在这里加张照片吗?不用运行任何代码就可以看一看。