【问题标题】:R - Empiled histogram for two continuous variablesR - 两个连续变量的 Empiled 直方图
【发布时间】:2020-06-19 14:25:48
【问题描述】:

我想做一个像第一个一样的累积直方图here

我有两个连续的收入变量(一个是家庭的总收入,另一个是家庭中一个人的收入)。

但是,即使 Stackoverflow 中已经有很多问题,我也无法制作这个直方图。

我的数据集名为 df,家庭变量为 df$household,另一个为 df$individual。

我试过这样做

ggplot(df, aes(group = individual, x = household, fill= individual), colour = c("red", "blue")) + geom_histogram() + xlim(0, 350000)

我认为我对填充的事情完全错误!

【问题讨论】:

    标签: r histogram


    【解决方案1】:

    如果您包含一些示例数据,您更有可能得到一个好的答案。在这种情况下,创建一些与您的数据形状大致匹配的示例数据并不难:

    library(ggplot2)
    library(dplyr)
    library(tidyr)
    
    set.seed(69)
    
    individual <- round(rgamma(1000, 2.5, 1/11000))
    household  <- round(individual + runif(1000, 0, 30000))
    
    df <- data.frame(household, individual)
    

    这应该给我们一些合理的数字:

    head(df)
    #>   household individual
    #> 1     44277      23217
    #> 2     55581      28208
    #> 3     36186      17100
    #> 4     39693      36174
    #> 5     27371      16424
    #> 6     16406       9615
    

    我们可以检查它们的分布是否也是合理的:

    hist(df$household)
    

    hist(df$individual)
    

    现在我们可以进入正确的答案了!

    您没有得到想要的绘图的原因之一是您的数据与iris 数据的格式不同。链接问题中的两个堆叠直方图不是不同列中两个连续变量的直方图,而是同一列的子集,按物种着色,在另一列中。

    当然可以在一个图上为您的两个变量绘制直方图:

    ggplot(df) + 
      geom_histogram(aes(x = household), fill = "gold") + 
      geom_histogram(aes(x = individual), fill = "tomato", alpha = 0.5)
    

    ...当然,这些不是堆叠的。这样做的原因是您有两个单独的变量,并且需要从它们独立地创建两个直方图。这些对彼此“一无所知”,因此无法叠加。

    那么解决方法是什么?与许多绘图问题一样,解决方案包括准备您的数据,使其采用您希望呈现的格式。您希望将所有收入显示为单个大直方图,但根据它们是个人收入还是家庭收入,部分条形会被着色。换句话说,您需要将所有收入放在一个列中,并将“家庭”和“个人”作为分组列中的标签。这被称为 长格式 数据,如果您可以将数据转换为这种格式,通常会使绘图更容易。

    在您的情况下,使用 tidyr 包中的 pivot_longer 非常简单:

    df %>% pivot_longer(cols = c("household", "individual"))
    #> # A tibble: 2,000 x 2
    #>    name       value
    #>    <chr>      <dbl>
    #>  1 household  44277
    #>  2 individual 23217
    #>  3 household  55581
    #>  4 individual 28208
    #>  5 household  36186
    #>  6 individual 17100
    #>  7 household  39693
    #>  8 individual 36174
    #>  9 household  27371
    #> 10 individual 16424
    #> # ... with 1,990 more rows
    

    这样做会使情节变得非常简单(我添加了一些比例尺和主题元素只是为了使其更具视觉吸引力):

    df %>% 
      pivot_longer(cols = c("household", "individual")) %>%
      ggplot() + 
        geom_histogram(aes(x = value, fill = name), colour = "black") +
        scale_fill_manual(values = c("gold", "dodgerblue")) +
        scale_x_continuous(breaks = 0:12 * 10000) + 
        theme(axis.text.x = element_text(angle = 90)) +
        labs(x = "Income ($)", y = "Number", title = "Income distribution")
    

    reprex package (v0.3.0) 于 2020 年 6 月 19 日创建

    【讨论】:

      猜你喜欢
      • 2013-01-16
      • 2019-12-24
      • 2013-10-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-02
      相关资源
      最近更新 更多