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

Onl*_*ean 37 r histogram categorical-data

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

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

animals <- c("cat", "dog",  "dog", "dog", "dog", "dog", "dog", "dog", "cat", "cat", "bird")
Run Code Online (Sandbox Code Playgroud)

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

animalFactor <- as.factor(animals)
Run Code Online (Sandbox Code Playgroud)

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

hist(table(animalFactor), freq=TRUE, xlab = levels(animalFactor), ylab = "Frequencies")
Run Code Online (Sandbox Code Playgroud)

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

Rol*_*and 58

看起来你想要barplot(prop.table(table(animals))):

在此输入图像描述

但是,这不是直方图.

  • 如果你只是做'barplot(table(animals))`你会更像直方图,即没有标准化的计数. (13认同)

Meg*_*ron 18

如果您想要执行此操作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()
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

  • geom_bar() 用于定量(分类)变量,geom_histogram() 用于定量变量。 (3认同)

jlh*_*ard 14

您获得意外结果的原因是hist(...)从数字向量计算分布.在您的代码中,table(animalFactor)行为类似于具有三个元素的数字向量:hist(...)1,3,7 .因此绘制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..)))
Run Code Online (Sandbox Code Playgroud)

使用animalFactor而不是animals在上面的代码中,您将获得完全相同的结果.

  • 有关“ggplot2”的新版本,请参阅 [megatron 的答案](/sf/answers/2633568031/)。 (2认同)