【问题标题】:How to plot a series of stacked histograms in R and ggplot 2?如何在 R 和 ggplot 2 中绘制一系列堆叠直方图?
【发布时间】:2017-12-05 22:42:54
【问题描述】:

我有几个关于外交政策态度的李克特式调查问题,包括叙利亚 (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

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

【问题讨论】:

  • 如果您查看melt(data) 的输出,您会发现它并没有重塑数据集。 melt 假定所有字符变量都是 id 变量,除非你另有说明,所以试试 melt(data, measure = 1:3) 之类的。
  • 谢谢...我做到了。我只得到所有三个变量组合的直方图。不是每个问题都分解出三个直方图,一个在另一个之上。

标签: r ggplot2 histogram stacked-chart


【解决方案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()
    )

注意:我使用的是tidyr 而不是reshape2,因为tidyr 是为了替换reshape2。此外,如果您不想要主题组件,请忽略/修改它们(例如,您可能没有安装 Source Code Pro 字体)。

【讨论】:

    猜你喜欢
    • 2011-01-25
    • 2017-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多