题 为因子变量制作频率直方图


我对R很新,所以我为这样一个基本问题道歉。我花了一个小时来搜索这个问题,但找不到解决方案。

假设我的数据集中有一些关于常见宠物类型的分类数据。我将其作为R中的字符向量输入,其中包含不同类型动物的名称。我创建它是这样的:

animals <- c("cat", "dog",  "dog", "dog", "dog", "dog", "dog", "dog", "cat", "cat", "bird")

我把它变成了一个与我的数据框中的其他向量一起使用的因子:

animalFactor <- as.factor(animals)

我现在想要创建一个直方图,显示y轴上每个变量的频率,x轴上每个因子的名称,并包含每个因子的一个条形。我尝试这个代码:

hist(table(animalFactor), freq=TRUE, xlab = levels(animalFactor), ylab = "Frequencies")

输出绝对没有像我期望的那样。抛开标签问题,我似乎无法弄清楚如何按类别创建简单的频率直方图。


34
2018-02-07 23:05


起源


直方图用于连续数据。你想要一个条形图。 - lmo


答案:


好像你想要的 barplot(prop.table(table(animals)))

enter image description here

但是,这不是直方图。


56
2018-02-07 23:09



如果你这样做 barplot(table(animals)) 你得到的更像是直方图,即没有标准化的计数。 - Chris A.


你得到意想不到的结果的原因是 hist(...) 从数字向量计算分布。在你的代码中, table(animalFactor) 表现得像一个带有三个元素的数字向量:1,3,7。所以 hist(...) 绘制1的数量(1),3的数量(1)和7的数量(1)。 @Roland的解决方案是最简单的。

这是使用的方法 ggplot

library(ggplot2)
ggp <- ggplot(data.frame(animals),aes(x=animals))
# counts
ggp + geom_histogram(fill="lightgreen")
# proportion
ggp + geom_histogram(fill="lightblue",aes(y=..count../sum(..count..)))

你会得到完全相同的结果 animalFactor 代替 animals 在上面的代码中。


14
2018-02-08 03:08



看到 威震天的答案 对于较新版本的 ggplot2。 - lmo


如果你想这样做的话 ggplot,对API进行了更改 geom_histogram() 这会导致错误: https://github.com/hadley/ggplot2/issues/1465

要解决这个问题,请使用 geom_bar()

animals <- c("cat", "dog",  "dog", "dog", "dog", "dog", "dog", "dog", "cat", "cat", "bird")

library(ggplot2)
# counts
ggplot(data.frame(animals), aes(x=animals)) +
  geom_bar()

enter image description here


13
2018-06-03 19:55





国家是一个分类变量,我想看看数据集中存在多少个国家/地区。换句话说,每个国家/地区有多少记录/与会者

barplot(summary(df$Country))

2
2018-03-31 22:29





作为因子的数据可以用作绘图函数的输入。

这里给出了类似问题的答案: https://stat.ethz.ch/pipermail/r-help/2010-December/261873.html

 x=sample(c("Richard", "Minnie", "Albert", "Helen", "Joe", "Kingston"),  
 50, replace=T)
 x=as.factor(x)
 plot(x)

1
2017-11-04 22:34