ggplot2 geom_bar位置失败

stu*_*ngr 4 r histogram stacked ggplot2

我正在使用..count..转换,geom_bar并且当我的某些类别计数较少时,得到警告 position_stack要求不重叠x间隔

最好使用一些模拟数据来解释(我的数据涉及方向和风速,我保留与此相关的名称)

#make data
set.seed(12345)
FF=rweibull(100,1.7,1)*20  #mock speeds
FF[FF>60]=59
dir=sample.int(10,size=100,replace=TRUE) # mock directions

#group into speed classes
FFcut=cut(FF,breaks=seq(0,60,by=20),ordered_result=TRUE,right=FALSE,drop=FALSE)

# stuff into data frame & plot
df=data.frame(dir=dir,grp=FFcut)
ggplot(data=df,aes(x=dir,y=(..count..)/sum(..count..),fill=grp)) + geom_bar()
Run Code Online (Sandbox Code Playgroud)

这可以很好地工作,并且结果图显示了根据速度分组的方向频率。与此相关的是,计数最少的速度类(此处为“ [40,60]”)将有5个计数。 三个类别,每个类别的大小为20

但是,更多的速度等级会导致警告。例如,

FFcut=cut(FF,breaks=seq(0,60,by=15),ordered_result=TRUE,right=FALSE,drop=FALSE)
Run Code Online (Sandbox Code Playgroud)

计数最少的速度类(现在为[[45,60)“)将只有3个计数,并且ggplot2会警告

position_stack需要不重叠的x间隔

并且该图将显示沿x轴分布的该类别的数据。 四个类别,每个类别的大小为15。 现在,最后一个包含三个元素的元素未添加到相应栏的顶部 似乎5是一个小组要正常工作的最小人数。

我很高兴知道这是stat_bingeom_bar正在使用的)功能或错误,还是我只是在滥用geom_bar

此外,任何建议如何解决此问题将不胜感激。

真诚的

Z.L*_*Lin 9

发生这种情况是因为df$dir是数字,因此ggplot对象假定了连续的x轴,并且美观参数group基于唯一已知的离散变量(fill = grp)。

结果,当根本没有太多dir值时grp = [45,60),ggplot会混淆每个条形图的宽度。如果将图分成不同的方面,则在视觉上会变得更加明显:

ggplot(data=df,
            aes(x=dir,y=(..count..)/sum(..count..),
                fill = grp)) + 
  geom_bar() + 
  facet_wrap(~ grp)
Run Code Online (Sandbox Code Playgroud)

方面视图

> for(l in levels(df$grp)) print(sort(unique(df$dir[df$grp == l])))
[1]  1  2  3  4  6  7  8  9 10
[1]  1  2  3  4  5  6  7  8  9 10
[1]  2  3  4  5  7  9 10
[1] 2 4 7
Run Code Online (Sandbox Code Playgroud)

我们还可以手动检查排序的df$dir值之间的最小差异,前三个grp值是1,最后一个值是2。因此,默认的条形宽度更宽。

以下解决方案都应达到相同的结果:

1.明确为所有组指定相同的钢筋宽度geom_bar()

ggplot(data=df,
       aes(x=dir,y=(..count..)/sum(..count..),
           fill = grp)) + 
  geom_bar(width = 0.9)
Run Code Online (Sandbox Code Playgroud)

2.转换dir到它传递给前一个分类变量aes(x = ...)

ggplot(data=df,
       aes(x=factor(dir), y=(..count..)/sum(..count..),
           fill = grp)) + 
  geom_bar()
Run Code Online (Sandbox Code Playgroud)

3.指定group参数应基于df$dirdf$grp

ggplot(data=df,
       aes(x=dir,
           y=(..count..)/sum(..count..),
           group = interaction(dir, grp),
           fill = grp)) + 
  geom_bar()
Run Code Online (Sandbox Code Playgroud)

情节