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个计数。

但是,更多的速度等级会导致警告。例如,
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轴分布的该类别的数据。
似乎5是一个小组要正常工作的最小人数。
我很高兴知道这是stat_bin(geom_bar正在使用的)功能或错误,还是我只是在滥用geom_bar。
此外,任何建议如何解决此问题将不胜感激。
真诚的
发生这种情况是因为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$dir&df$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)