制作因子变量的频率直方图

Posted

技术标签:

【中文标题】制作因子变量的频率直方图【英文标题】:Make Frequency Histogram for Factor Variables 【发布时间】:2014-03-05 13:15:07 【问题描述】:

我对 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")

输出完全不像我期望的那样。撇开标签问题不谈,我似乎无法弄清楚如何按类别创建简单的频率直方图。

【问题讨论】:

直方图用于连续数据。你想要一个条形图。 【参考方案1】:

你也可以使用lattice::histogram()

【讨论】:

多一点解释将使这个答案对 OP 和未来的用户更有用......【参考方案2】:

国家是一个分类变量,我想看看数据集中出现了多少国家。换句话说,每个国家/地区有多少记录/参加者

barplot(summary(df$Country))

【讨论】:

【参考方案3】:

如果您想在 ggplot 中执行此操作,则对 geom_histogram() 的 API 更改会导致错误: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()

【讨论】:

【参考方案4】:

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

这里给出了一个类似问题的答案: 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)

【讨论】:

【参考方案5】:

您得到意外结果的原因是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,您会得到完全相同的结果。

【讨论】:

请参阅megatron's answer 以获取更新版本的ggplot2【参考方案6】:

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

但是,这不是直方图。

【讨论】:

如果你只是做barplot(table(animals)),你会得到这个更像直方图,即没有标准化的计数。

以上是关于制作因子变量的频率直方图的主要内容,如果未能解决你的问题,请参考以下文章

直方图基数选择性群集因子

excel数据是ABC如何得到频率分布直方图

使用 plotly 基于组变量绘制直方图网格

使用元组元素从列表中生成频率直方图

R语言可视化:频率直方图绘制

如何从 Python 中的字符串列表制作直方图?