【问题标题】:How do I produce a barchart/histogram in R that orders by factor number but displays the factor names?如何在 R 中生成按因子编号排序但显示因子名称的条形图/直方图?
【发布时间】:2015-09-20 05:57:27
【问题描述】:

我的蘑菇可食性数据如下所示:

SpeciesName         Edibility   EdibilityRank  
abruptibulbus       Good                    3  
arvensis            Choice                  1  
bisporus            Good                    3  
bitorquis           Choice                  1  
campestris          Choice                  1  
diminutivus         Presumed harmless       4  
fuscofibrillosus    Choice non-standard     2  
haemorrhoidarius    Choice non-standard     2  
micromegethus       Presumed harmless       4  
placomyces          Mildly poisonous        5  
silvaticus          Choice non-standard     2  
silvicola           Good                    3  
subrufescens        Choice                  1  

对于每种蘑菇(第一列),都有一个可食性描述符(第二列)和一个数字可食性等级(第三列),等级越低,蘑菇越受欢迎。描述符和排名之间存在一对一的关系。

我想制作一个条形图/直方图,显示每个可食性级别的频率,按等级排序,并在 x 轴上用描述符标记。换句话说,虽然可食性描述符看起来像一个名义/分类变量,但它实际上是一个名义变量,名义关系由 Ranking 变量给出。

我可以按照描述符名称的字母顺序制作一个,如下所示:

edtable <- table(SourceFile$Edibility)
par(mai=c(3,1,1,1))
barplot(edtable, las=2)

或像这样按频率:

edtable <- table(SourceFile$Edibility)
par(mai=c(3,1,1,1))
barplot(edtable [order(edtable, decreasing = T)], las=2)

但我找不到按数字排名排序相同事物的方法。

【问题讨论】:

    标签: r histogram bar-chart labels


    【解决方案1】:
    library(data.table)
    library(ggplot2)
    
    mytable = df[, .N, keyby = .(EdibilityRank, Edibility)]
    ggplot(mytable, aes(Edibility, N )) + geom_histogram(stat = "identity")
    

    【讨论】:

    • 谢谢,亨克!这更多是我最初想要的。我必须看看每种方法如何处理更大的数据集。
    • 所以实际上,mytable = df[, .N, keyby = .(EdibilityRank, Edibility)] 行给了我错误unused argument (keyby = .(EdibilityRank, Edibility)) 我已经安装了 data.frame 1.9.6,所以我希望版本不是问题。我将它与我的原始数据集一起使用,因为彼得的“蘑菇”数据框没有 EdibilityRank 列。
    【解决方案2】:

    您的源数据中有冗余信息,这是一个坏主意,因为它可能导致数据输入问题(例如,如果 Edibility 和 EdibilityRank 相互矛盾)。有几种更好的方法,但一种就是使用 R 的 factor() 类。 ggplot2 遵循将“levels =”创建为因子时定义的顺序。数据不完整见下文。

    library(ggplot2)
    
    mushrooms <- data.frame(SpeciesName = c("abruptibulbus", "arvensios", "boisbisporus", "bitorquis", "campestris", "diminutivus", "fuscofibrillosus", "placomyces"),
                      Edibility = factor(c("Good", "Choice", "Good", "Choice", "Choice", "Presumed harmless", "Choice non-standard", "Mildly poisonous"), 
                                     levels = c("Choice", "Choice non-standard", "Good", "Presumed harmless", "Mildly poisonous")))
    
    ggplot(mushrooms, aes(x = Edibility)) + geom_histogram()
    

    如果您从文本文件或其他文件中读取数据(您没有指定),read.csv 会自动将 Edibility 转换为一个因素,除非您指定了 stringsAsFactors = FALSE;但它将默认为按字母顺序排列的因子水平。在这种情况下,您需要指定它们,例如通过

    mushrooms$Edibility <- factor(mushrooms$Edibility, levels = c(my ordered vector here))
    

    【讨论】:

    • 谢谢,彼得!可食用等级来自关系表,因此不存在不匹配的危险。作为关系键,很难放开它们! :-) 但你是对的——这更像是 R 的做法:使用 R 的(某种)迷你关系键(因子)
    • 听起来像是从数据库中获取的,因此您可以确定它会起作用。根据您的数据的复杂程度,您可能希望对我上面设置的方法采取不同的方法,例如以编程方式计算因子级别的顺序,而不是键入它们。但如果它只有六个左右,可能很容易以我的方式去做(只要注意那些意味着你输入错误的 NA)。
    • 另外,不仅因素是 R 处理事实表到维度表连接的方式(在我看来很尴尬),它们也是 ggplot2 似乎工作的方式。在指定事物在 ggplots 中出现的顺序时,绝对最好有因素,并仔细控制水平。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多