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)))
:
但是,这不是直方图.
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)
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
在上面的代码中,您将获得完全相同的结果.