【问题标题】:How to melt my data to create a bar chart?如何融合我的数据以创建条形图?
【发布时间】:2019-09-04 12:34:16
【问题描述】:

我想使用 ggplot 创建一个条形图来比较不同活动的持续时间。在 y 轴上,我希望有时间以小时和分钟为单位,在 x 轴上是活动标签。

我正在苦苦挣扎的是如何转换我的数据以及如何转换为时间格式。

此时时间以 10 分钟间隔表示,例如。 460 /60 = 7 小时 40 分钟

我的数据格式如下:

structure(list(Sleep = c(460, 420, 500, 600, 280, 700, 420, 500, 
600, 460), `Tv and video` = c(200, 60, 140, 120, 0, 300, 80, 
210, 140, 340), `Main job` = c(0, 0, 500, 0, 420, 0, 0, 0, 0, 
0), `Social life` = c(210, 260, 60, 20, 40, 0, 410, 180, 160, 
70), Eating = c(90, 80, 50, 120, 90, 60, 120, 90, 60, 120), `Travel by purpose` = c(180, 
140, 0, 60, 190, 10, 70, 70, 100, 140), `Other personal care` = c(60, 
70, 40, 30, 90, 60, 130, 60, 0, 140), `Food management` = c(110, 
190, 10, 90, 0, 40, 0, 70, 90, 20), `Radio and music` = c(0, 
0, 0, 110, 0, 0, 0, 0, 60, 0), `Childcare of own household member` = c(30, 
50, 80, 0, 0, 20, 0, 0, 140, 0)), row.names = c(NA, 10L), class = "data.frame")

非常感谢您的帮助

【问题讨论】:

    标签: r ggplot2 time


    【解决方案1】:

    你可以试试

    library(tidyverse)                                                                                                                                                                                                                                                                                                                                                                                                                                                           
    df %>% 
      gather(k, v) %>% 
      mutate(v=v/60) %>% 
      mutate(k = gsub(" ", "\n", k)) %>% 
      ggplot(aes(reorder(k,-v), v)) + 
       geom_col() +
       ylab("Hours") + xlab("Activities")
    

    可以使用这个添加文本

    df %>% 
      gather(k, v) %>% 
      mutate(k = gsub(" ", "\n", k)) %>% 
      group_by(k) %>% 
      summarise(v=sum(v)/60) %>% 
      ggplot(aes(reorder(k,-v), v, label = round(v,1))) + 
      geom_col() +
      geom_text(nudge_y = 2) +
      ylab("Hours") + xlab("Activities")
    

    【讨论】:

    • 非常感谢您抽出宝贵时间我不明白 y 轴是什么意思 rthe 400000?是 400000 分钟?以及如何转换为小时和分钟
    • @user11964604 请重新加载页面。我稍微修改了我的答案。
    • 非常感谢您抽出宝贵的时间一个问题是有一种方法可以在堆叠条上显示小时数。比如上面的sleep 83等等?
    • 当然。检查geom_text 函数并将label = v 添加到aes()。但在此之前,你必须总结一下。我编辑我的答案。
    • @jimbou 看起来额外的润色给了你蛋糕,虽然我比你用图表的完整解决方案快了几分钟;)
    【解决方案2】:

    您可以首先将您的数据列收集成具有“类”和“值”两列的长格式。然后你可以按类对值求和。最后,您可以制作一个条形图,在其中直接使用值(stat =“identity”)。主题在 x 轴上旋转标签的轴。

    # Libraries
    library(tidyr)
    library(dplyr)
    library(ggplot2)
    
    # Gathering, summarizing and plotting data
    data %>% 
      gather("class", "value", 1:10) %>%
      group_by(class) %>%
      summarise(total = sum(value)) %>%
      ggplot(., aes(class, total)) + geom_bar(stat = "identity") + theme(axis.text.x = element_text(angle = 90, hjust = 1))
    

    【讨论】:

    • stat = "identity"的情况下建议使用geom_col
    • @esbeneickhardt 非常感谢您抽出宝贵时间我不明白 y 轴是什么意思 rthe 400000?是 400000 分钟?我可以转换成小时和分钟吗?
    猜你喜欢
    • 2018-06-02
    • 2014-05-01
    • 2014-04-04
    • 1970-01-01
    • 2019-05-18
    • 1970-01-01
    • 2021-01-20
    • 2016-06-07
    • 2018-06-17
    相关资源
    最近更新 更多