R中有4个分类变量的堆叠条形图

R中有4个分类变量的堆叠条形图,r,plot,ggplot2,bar-chart,R,Plot,Ggplot2,Bar Chart,我的问题是能够在R中的条形图中显示4个分类变量 4个分类变量各有2个或更多级别。我的想法是使用ggplot为3个类别中的每一个类别创建单独的条形图,每个级别的计数将被叠加。然后,我会使用facet\u wrap将其划分为第四类 数据如下所示: Species Crown_Class Life_class Stem_Category E. obliqua Suppressed Standing live Large stems E. rubida In

我的问题是能够在R中的条形图中显示4个分类变量

4个分类变量各有2个或更多级别。我的想法是使用
ggplot
为3个类别中的每一个类别创建单独的条形图,每个级别的计数将被叠加。然后,我会使用
facet\u wrap
将其划分为第四类

数据如下所示:

Species     Crown_Class     Life_class      Stem_Category
E. obliqua  Suppressed      Standing live   Large stems
E. rubida   Intermediate    Standing live   Large stems
E. obliqua  Suppressed      Standing live   Small stems
E. obliqua  Suppressed      Standing live   Small stems
E. rubida   Suppressed      Standing live   Large stems
E. radiata  Suppressed      Standing live   Small stems
E. obliqua  Dominant        Standing live   Small stems
E. obliqua  Suppressed      Standing live   Small stems
E. radiata  Suppressed      Standing live   Large stems
E. rubida   NA              Standing dead   Large stems
E. rubida   Intermediate    Standing live   Large stems
ggplot()+
  geom_bar(data= cc, aes(x = Species, fill = Crown_Class), 
      position='stack') +
  geom_bar(data=lc, aes(x = Species, fill = Life_class), 
      position ='dodge')+
  facet_wrap(~Species)
我脑海中的图表显示了三个类别中的每一个类别都有一个堆叠的条形图,然后按第三个类别进行分组。对于给出的数据,将为每个物种显示冠类、生命类和茎类的单独条形图

我已经尝试了几个小时,可以使用这段代码进行单独的绘图(我将数据分为3个单独的数据帧进行绘制:

ggplot(data= cc, aes(x= Species, fill = Crown_Class))+
geom_bar(position='stack')

ggplot(data=lc, aes(x = Species, fill = Life_class))+
geom_bar(position ='stack')

ggplot(data=sc, aes(x = Species, fill = Stem_Category))+
geom_bar(position ='stack')
我们的想法是这样做:

Species     Crown_Class     Life_class      Stem_Category
E. obliqua  Suppressed      Standing live   Large stems
E. rubida   Intermediate    Standing live   Large stems
E. obliqua  Suppressed      Standing live   Small stems
E. obliqua  Suppressed      Standing live   Small stems
E. rubida   Suppressed      Standing live   Large stems
E. radiata  Suppressed      Standing live   Small stems
E. obliqua  Dominant        Standing live   Small stems
E. obliqua  Suppressed      Standing live   Small stems
E. radiata  Suppressed      Standing live   Large stems
E. rubida   NA              Standing dead   Large stems
E. rubida   Intermediate    Standing live   Large stems
ggplot()+
  geom_bar(data= cc, aes(x = Species, fill = Crown_Class), 
      position='stack') +
  geom_bar(data=lc, aes(x = Species, fill = Life_class), 
      position ='dodge')+
  facet_wrap(~Species)
但结果并不是我想的那样,第二个情节实际上覆盖了第一个情节


如果有任何帮助,我将不胜感激。

以下是一个示例,说明如何使用
facet\u grid
将所有4个变量包含在同一绘图上

请注意,我生成了一些虚拟数据,因为我在将数据集导入
R
时遇到了问题

生成数据

如果以这种方式进行操作,则应明确注意x轴上的值来自三个不同的变量

IMHO:虽然我不是这方面的专家,但我确实认为在同一个轴上创建三个不同变量的可视化有点可疑,
ggplot2
为您提供了大量选项,以避免以这种方式继续

使用
facet\u网格进行绘图

使用
交互
facet\u wrap
现在,假设您不希望将两个分组因子作为方面,而只希望使用一个方面,那么我们可以使用
交互
函数

ggplot(df1, aes(x = s1, fill = interaction(s2,s3)))+
    geom_bar(position = 'stack')+
    facet_wrap(~s4)

使用
Rmisc::multiplot
最后,我们可以创建三个单独的绘图,然后使用
Rmisc::multiplot
在同一页面上绘图

library(Rmisc)
p1 <- ggplot(df1, aes(x = s1, fill = s2))+
    geom_bar(position = 'stack')
p2 <- ggplot(df1, aes(x = s1, fill = s3))+
    geom_bar(position = 'stack')
p3 <- ggplot(df1, aes(x = s1, fill = s4))+
    geom_bar(position = 'stack')

multiplot(p1,p2,p3, cols = 3)
库(Rmisc)

p1下面是一个示例,说明如何使用
facet\u grid
将所有4个变量包含在同一个绘图上

请注意,我生成了一些虚拟数据,因为我在将数据集导入
R
时遇到了问题

生成数据

如果以这种方式进行操作,则应明确注意x轴上的值来自三个不同的变量

IMHO:虽然我不是这方面的专家,但我确实认为在同一个轴上创建三个不同变量的可视化有点可疑,
ggplot2
为您提供了大量选项,以避免以这种方式继续

使用
facet\u网格进行绘图

使用
交互
facet\u wrap
现在,假设您不希望将两个分组因子作为方面,而只希望使用一个方面,那么我们可以使用
交互
函数

ggplot(df1, aes(x = s1, fill = interaction(s2,s3)))+
    geom_bar(position = 'stack')+
    facet_wrap(~s4)

使用
Rmisc::multiplot
最后,我们可以创建三个单独的绘图,然后使用
Rmisc::multiplot
在同一页面上绘图

library(Rmisc)
p1 <- ggplot(df1, aes(x = s1, fill = s2))+
    geom_bar(position = 'stack')
p2 <- ggplot(df1, aes(x = s1, fill = s3))+
    geom_bar(position = 'stack')
p3 <- ggplot(df1, aes(x = s1, fill = s4))+
    geom_bar(position = 'stack')

multiplot(p1,p2,p3, cols = 3)
库(Rmisc)

p1由于您试图使用
Crown_Class
Life_Class
Stem_Category
来区分绘图,ggplot2希望这些值位于它们自己的列中(一般来说,ggplot2与长数据类似,其中只有一列包含正在绘制的值)。我们可以使用tidyr重新组织数据

library(tidyr)
df <-
  gather(df, variable, value, -Species)

head(df)
     Species    variable           value
1 E. obliqua Crown_Class      Suppressed
2  E. rubida Crown_Class    Intermediate
3 E. obliqua Crown_Class      Suppressed
4 E. obliqua Crown_Class      Suppressed
5  E. rubida Crown_Class      Suppressed
6 E. radiata Crown_Class      Suppressed

如果您不喜欢为
Crown\u Class
Life\u Class
和“Stem\u Category”的所有颜色只提供一个指南,您可以制作三个单独的绘图,并使用
gridExtra
软件包将它们组合起来

library(dplyr)
library(gridExtra)
p <-
  df %>%
  filter(variable == 'Crown_Class') %>%
  ggplot() +
  geom_bar(aes(x = Species, fill = value)) +
  facet_wrap(~ variable)

q <-
  df %>%
  filter(variable == 'Life_class') %>%
  ggplot() +
  geom_bar(aes(x = Species, fill = value)) +
  facet_wrap(~ variable)

r <-
  df %>%
  filter(variable == 'Stem_Category') %>%
  ggplot() +
  geom_bar(aes(x = Species, fill = value)) +
  facet_wrap(~ variable)

grid.arrange(p, q, r)
库(dplyr)
图书馆(gridExtra)
p%
过滤器(变量=='Crown_Class')%>%
ggplot()+
geom_bar(aes(x=物种,填充=值))+
面包(~变量)
q%
过滤器(变量=='Life_class')%>%
ggplot()+
geom_bar(aes(x=物种,填充=值))+
面包(~变量)
r%
过滤器(变量=='Stem_Category')%>%
ggplot()+
geom_bar(aes(x=物种,填充=值))+
面包(~变量)
网格排列(p、q、r)

由于您试图使用
Crown\u Class
Life\u Class
Stem\u Category
来区分绘图,ggplot2希望这些值位于自己的列中(一般来说,ggplot2与长数据类似,其中只有一列包含正在绘制的值)。我们可以使用tidyr重新组织数据

library(tidyr)
df <-
  gather(df, variable, value, -Species)

head(df)
     Species    variable           value
1 E. obliqua Crown_Class      Suppressed
2  E. rubida Crown_Class    Intermediate
3 E. obliqua Crown_Class      Suppressed
4 E. obliqua Crown_Class      Suppressed
5  E. rubida Crown_Class      Suppressed
6 E. radiata Crown_Class      Suppressed

如果您不喜欢为
Crown\u Class
Life\u Class
和“Stem\u Category”的所有颜色只提供一个指南,您可以制作三个单独的绘图,并使用
gridExtra
软件包将它们组合起来

library(dplyr)
library(gridExtra)
p <-
  df %>%
  filter(variable == 'Crown_Class') %>%
  ggplot() +
  geom_bar(aes(x = Species, fill = value)) +
  facet_wrap(~ variable)

q <-
  df %>%
  filter(variable == 'Life_class') %>%
  ggplot() +
  geom_bar(aes(x = Species, fill = value)) +
  facet_wrap(~ variable)

r <-
  df %>%
  filter(variable == 'Stem_Category') %>%
  ggplot() +
  geom_bar(aes(x = Species, fill = value)) +
  facet_wrap(~ variable)

grid.arrange(p, q, r)
库(dplyr)
图书馆(gridExtra)
p%
过滤器(变量=='Crown_Class')%>%
ggplot()+
geom_bar(aes(x=物种,填充=值))+
面包(~变量)
q%
过滤器(变量=='Life_class')%>%
ggplot()+
geom_bar(aes(x=物种,填充=值))+
面包(~变量)
r%
过滤器(变量=='Stem_Category')%>%
ggplot()+
geom_bar(aes(x=物种,填充=值))+
面包(~变量)
网格排列(p、q、r)

就这样,您如何处理NAs?您可以尝试使用抱歉-我的图像有点错误。我们刚刚更改了它。@Artificialbreece,第二个绘图覆盖了第一个绘图-您可以看到后面的颜色。Re:NA"这是另一个问题-使用
na.rm=TRUE
可能是一种方法。谢谢@bouncyball,但是'facet\u grid'会给我另一个块。目的是在3个面内获得3个条。好的,我想你不处理它们,这有时可能会导致绘图出现问题。你如何处理NAs?你可以试试u唱抱歉-我的形象有点错误。我刚刚