如何在R和ggplot 2中绘制一系列堆积的直方图?

时间:2017-12-05 22:42:54

标签: r ggplot2 histogram stacked-chart

我对外交政策的态度有几个类似的调查问题,包括叙利亚(syria_threat),朝鲜(nk_threat)和英国退欧(Brexit)。每个响应都被编码为一个因素:“无威胁”,“轻微威胁”,“中度威胁”,“高度威胁”和“严重威胁”。下面给出了一个最小的数据示例

#Reading the data#
syria_threat<-c("High Threat", "Slight Threat", "Slight Threat", "Medium Threat")
nk_threat<-c("Grave Threat", "Grave Threat", "High Threat", "Medium Threat")

brexit<-c("Medium Threat", "Slight Threat", "Slight Threat", "No Threat")

data<-cbind.data.frame(syria_threat, nk_threat, brexit)

#Showing the structure of the data 
 data
   syria_threat     nk_threat        brexit
1   High Threat  Grave Threat Medium Threat
2 Slight Threat  Grave Threat Slight Threat
3 Slight Threat   High Threat Slight Threat
4 Medium Threat Medium Threat     No Threat

我想创建一堆直方图密度图,可视化每个威胁/危机的感知威胁。因此,对于每个问题(叙利亚,朝鲜和英国退欧),我会有一个从无威胁到坟墓的直方图叠加在另一个上面。并非所有问题都具有相同的价值(即没有人将英国退欧视为“严重威胁”)。我希望它看起来像这个问题的答案Multiple histograms in ggplot2(但直方图条旋转90度https://i.stack.imgur.com/3CPOS.png)。

我使用以下代码:

 ggplot(melt(data), aes(x=as.factor(value), fill=as.factor(value))) + 
 geom_bar() + xlab("") + 
 scale_fill_discrete("Threat")

我收到以下错误消息:

Using syria_threat, nk_threat, brexit as id variables
Error in is.factor(x) : object 'value' not found

任何帮助将不胜感激。谢谢!

1 个答案:

答案 0 :(得分:1)

  

因此,对于每个问题(叙利亚,朝鲜和英国脱欧),我都会有一个从无威胁到坟墓的直方图叠加在另一个上面。

基于此,我认为您需要以下内容:

library(tidyverse)

# Converting factors to characters
data[] <- lapply(data, as.character)

data %>% 
  gather(key, value) %>% 
  group_by(key, value) %>% 
  mutate(count = n()) %>% 
  distinct() %>% 
  ggplot(aes(value, count, fill = value)) +
  geom_col(position = position_dodge()) +
  facet_wrap(~ key, ncol = 1) +
  coord_flip() +
  scale_x_discrete(limits = c("No Threat", 
                              "Slight Threat", 
                              "Medium Threat", 
                              "High Threat", 
                              "Grave Threat")) +
  theme_bw() +
  theme(
    text = element_text(family = "Source Code Pro"),
    panel.grid.minor = element_blank(),
    panel.grid.major.y = element_blank()
    )

enter image description here

注意:我使用tidyr代替reshape2,因为tidyr旨在取代reshape2。另外,如果您不想要它们,请忽略/修改主题组件(例如,您可能没有安装源代码专业版字体)。