57

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

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

4

6 回答 6

80

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

在此处输入图像描述

但是,这不是直方图。

于 2014-02-07T23:09:58.610 回答
28

如果您想在 中执行此操作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()

在此处输入图像描述

于 2016-06-03T19:55:19.903 回答
14

您得到意外结果的原因是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

于 2014-02-08T03:08:39.803 回答
4

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

barplot(summary(df$Country))
于 2016-03-31T22:29:50.173 回答
1

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

这里给出了类似问题的答案: 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)
于 2014-11-04T22:34:11.373 回答
1

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

于 2020-01-27T10:36:17.420 回答