代码之家  ›  专栏  ›  技术社区  ›  wishihadabettername

在分类变量图表中显示%而不是计数

  •  150
  • wishihadabettername  · 技术社区  · 14 年前

    我正在绘制一个分类变量,而不是显示每个分类值的计数。

    我在找一种方法 ggplot 显示该类别中值的百分比。当然,可以用计算出的百分比创建另一个变量并绘制它,但是我必须做几十次,我希望在一个命令中实现这一点。

    我在试验类似的东西

    qplot(mydataf) +
      stat_bin(aes(n = nrow(mydataf), y = ..count../n)) +
      scale_y_continuous(formatter = "percent")
    

    但我一定是用错了,因为我出错了。

    为了方便地重现设置,下面是一个简化的示例:

    mydata <- c ("aa", "bb", NULL, "bb", "cc", "aa", "aa", "aa", "ee", NULL, "cc");
    mydataf <- factor(mydata);
    qplot (mydataf); #this shows the count, I'm looking to see % displayed.
    

    在实际情况下,我可能会使用 格格图 而不是 qplot 但是正确的使用方法 stat_bin 我还是不知道。

    我还尝试了以下四种方法:

    ggplot(mydataf, aes(y = (..count..)/sum(..count..))) + 
      scale_y_continuous(formatter = 'percent');
    
    ggplot(mydataf, aes(y = (..count..)/sum(..count..))) + 
      scale_y_continuous(formatter = 'percent') + geom_bar();
    
    ggplot(mydataf, aes(x = levels(mydataf), y = (..count..)/sum(..count..))) + 
      scale_y_continuous(formatter = 'percent');
    
    ggplot(mydataf, aes(x = levels(mydataf), y = (..count..)/sum(..count..))) + 
      scale_y_continuous(formatter = 'percent') + geom_bar();
    

    但这4者都给出:

    Error: ggplot2 doesn't know how to deal with data of class factor
    

    同样的错误出现在

    ggplot (data=mydataf, aes(levels(mydataf))) +
      geom_bar()
    

    所以很明显是关于 格格图 与单个向量交互。我抓耳挠腮,在谷歌上搜索那个错误给出了一个 result .

    8 回复  |  直到 6 年前
        1
  •  207
  •   Tung    7 年前

    由于回答了这个问题,对 ggplot 语法进行了一些有意义的更改。总结以上评论中的讨论:

    require(ggplot2)
    需要(比例尺)
    
    P<-ggplot(mydataf,aes(x=foo))。+
    土工格栅(aes(y=..count../sum(..count..)))+
    ##版本3.0.0
    缩放连续(标签=百分比)
    < /代码> 
    
    

    下面是一个使用mtcars的可复制示例:

    ggplot(mtcars,aes(x=factor(hp)))+
    土工格栅(aes(y=..count../sum(..count..)))+
    缩放连续(标签=百分比)版本3.0.0
    < /代码> 
    
    

    这个问题目前是google上“ggplot count vs percentage histogram”的第一个问题,所以希望这有助于提取当前包含在接受答案评论中的所有信息。

    备注:ifhpis not set as a factor,ggplot returns:。

    博威:

     require(ggplot2)
     require(scales)
    
     p <- ggplot(mydataf, aes(x = foo)) +  
            geom_bar(aes(y = (..count..)/sum(..count..))) + 
            ## version 3.0.0
            scale_y_continuous(labels=percent)
    

    下面是一个可复制的示例,使用mtcars:

     ggplot(mtcars, aes(x = factor(hp))) +  
            geom_bar(aes(y = (..count..)/sum(..count..))) + 
            scale_y_continuous(labels = percent) ## version 3.0.0
    

    enter image description here

    这个问题目前是Google对“ggplot count vs percentage histogram”的第一个点击,所以希望这有助于提取当前包含在接受答案评论中的所有信息。

    备注:如果hp不设为因子,ggplot返回:

    enter image description here

        2
  •  56
  •   Ramnath    14 年前

    修改后的代码应该有效

    p = ggplot(mydataf, aes(x = foo)) + 
        geom_bar(aes(y = (..count..)/sum(..count..))) + 
        scale_y_continuous(formatter = 'percent')
    

    如果您的数据有NAS,并且您不希望它们包含在绘图中,请将na.omit(mydataf)作为参数传递给ggplot。

    希望这有帮助。

        3
  •  44
  •   Fabian Hertwig    9 年前

    对于ggplot2版本2.1.0,它是

    + scale_y_continuous(labels = scales::percent)
    
        4
  •  33
  •   Olivier Ma    8 年前

    截至2017年3月, ggplot2 2.2.1我认为最好的解决方案在Hadley Wickham's R for Data Science Book:

    ggplot(mydataf) + stat_count(mapping = aes(x=foo, y=..prop.., group=1))
    

    stat_count 计算两个变量: count 默认情况下使用,但您可以选择使用 prop 显示比例。

        5
  •  18
  •   Sam Firke    9 年前

    如果希望Y轴上的百分比 标记在条形上:

    库(ggplot2)
    图书馆(比例尺)
    ggplot(mtcars,aes(x=as.factor(am)))+
    土工格栅(aes(y=..count../sum(..count..)))+
    geom_text(aes(y=(..count../sum(..count..)),label=scales::percent(..count../sum(..count..)),stat=“count”,vjust=-0.25)+
    缩放连续(标签=百分比)+
    实验室(title=“手动与自动频率”,y=“百分比”,x=“自动变速器”)
    < /代码> 
    
    

    添加条形图标签时,您可能希望通过在末尾添加以下内容来省略更清晰图表的Y轴:

    主题( axis.text.y=element_blank(),axis.ticks=element_blank(), axis.title.y=元素_blank()) ) < /代码>

    enter image description here

    添加条形图标签时,您可能希望通过在末尾添加以下内容来省略更清晰图表的Y轴:

      theme(
            axis.text.y=element_blank(), axis.ticks=element_blank(),
            axis.title.y=element_blank()
      )
    

    enter image description here

        6
  •  6
  •   Steve Powell    11 年前

    如果你想要百分比 标签 但Y轴上的实际ns,请尝试以下操作:

        library(scales)
    perbar=function(xx){
          q=ggplot(data=data.frame(xx),aes(x=xx))+
          geom_bar(aes(y = (..count..)),fill="orange")
           q=q+    geom_text(aes(y = (..count..),label = scales::percent((..count..)/sum(..count..))), stat="bin",colour="darkgreen") 
          q
        }
        perbar(mtcars$disp)
    
        7
  •  6
  •   Uwe    7 年前

    这里是一个面数据的解决方法。(本例中@andrew接受的答案不起作用。)其想法是使用dpylr计算百分比值,然后使用geom_col创建绘图。

    库(ggplot2)
    图书馆(比例尺)
    图书馆(Magrittr)
    图书馆(DPLYR)
    
    箱宽<-30
    
    mtcars.stats<-mtcars%>%
    分组依据(cyl)%>%
    突变(bin=切割(hp,breaks=seq(0400,binwidth)
    labels=seq(0+binwidth,400,binwidth)-(binwidth/2)),
    n=n())%& g%;
    分组依据(cyl,bin)%>%
    总结(p=n()/n[1])%>%
    取消分组()%>%
    变异(bin=as.numeric(as.character(bin)))
    
    ggplot(mtcars.stats,aes(x=bin,y=p))。+
    GeoMyCo()+
    缩放连续(标签=百分比)+
    面网格(cyl~)
    < /代码> 
    
    

    这是情节:

    然后用dpylr和geom_col创建绘图。

    library(ggplot2)
    library(scales)
    library(magrittr)
    library(dplyr)
    
    binwidth <- 30
    
    mtcars.stats <- mtcars %>%
      group_by(cyl) %>%
      mutate(bin = cut(hp, breaks=seq(0,400, binwidth), 
                   labels= seq(0+binwidth,400, binwidth)-(binwidth/2)),
             n = n()) %>%
      group_by(cyl, bin) %>%
      summarise(p = n()/n[1]) %>%
      ungroup() %>%
      mutate(bin = as.numeric(as.character(bin)))
    
    ggplot(mtcars.stats, aes(x = bin, y= p)) +  
      geom_col() + 
      scale_y_continuous(labels = percent) +
      facet_grid(cyl~.)
    

    这就是情节:

    enter image description here

        8
  •  1
  •   Rtist    6 年前

    请注意,如果变量是连续的,则必须使用geom_histogram(),因为函数将按“bin”对变量分组。

    df <- data.frame(V1 = rnorm(100))
    
    ggplot(df, aes(x = V1)) +  
      geom_histogram(aes(y = (..count..)/sum(..count..))) 
    
    # if you use geom_bar(), with factor(V1), each value of V1 will be treated as a
    # different category. In this case this does not make sense, as the variable is 
    # really continuous. With the hp variable of the mtcars (see previous answer), it 
    # worked well since hp was not really continuous (check unique(mtcars$hp)), and one 
    # can want to see each value of this variable, and not to group it in bins.
    ggplot(df, aes(x = factor(V1))) +  
      geom_bar(aes(y = (..count..)/sum(..count..))) 
    
    推荐文章