在y轴上具有持续时间的分组条形图

时间:2016-07-01 19:01:25

标签: r ggplot2 bar-chart

我有像

这样的数据
column1 <- c(rep("ab", 3), rep("cd", 3), rep("ef", 3))
column2 <- gl(3, 1, 9, labels=c("abc", "def", "ghi"))
column3 <- c("10:10:00", "01:15:10", "00:00:20", "01:20:40", "05:20:55", "10:00:00", "02:00:30", "03:23:55", "10:01:40")

我需要使用ggplot为这些数据绘制分组条形图。我试过下面的rscript。

d <- data.frame(column1=column1, column2=column2, column3=column3)

require(ggplot2)
ggplot(d, aes(x=column1, y=column3, fill=column2)) + geom_bar(position=position_dodge(),stat="identity")

它给出了像

这样的情节

enter image description here

由于以下问题,这看起来不对,

  1. 列的顺序是一致的
  2. Y轴上的时间不一致。 (范围错误)。
  3. 但如果我尝试下面的数据,

    column1 <- c(rep("ab", 3), rep("cd", 3), rep("ef", 3))
    column2 <- gl(3, 1, 9, labels=c("abc", "def", "ghi"))
    column3 <- c(10, 15, 20, 80, 95, 10, 30, 55, 80)
    
    d <- data.frame(column1=column1, column2=column2, column3=column3)
    require(ggplot2)
    ggplot(d, aes(x=column1, y=column3, fill=column2)) + geom_bar(position=position_dodge(),stat="identity")
    

    它生成图形,

    enter image description here

    哪个看起来很完美。 我在这里看到的问题是它适用于整数但不适用于时间数据类型。我试着玩它但却无法获得成功。任何人都可以帮我创建正确的图表,或者请建议是否需要其他方法?

    提前致谢。

1 个答案:

答案 0 :(得分:1)

此解决方案转换假定column3是一个持续时间,并将其转换为持久性类,如@alistaire建议的那样。它也可能需要一些修改才能让标签定期出现,但这应该很容易。

library(ggplot2)

column1 <- c(rep("ab", 3), rep("cd", 3), rep("ef", 3))
column2 <- gl(3, 1, 9, labels=c("abc", "def", "ghi"))
column3 <- c("10:10:00", "01:15:10", "00:00:20", "01:20:40", "05:20:55", 
    "10:00:00", "02:00:30", "03:23:55", "10:01:40")

d <- data.frame(column1=column1, column2=column2, column3=column3)

library(lubridate)

# convert to a duration 
c3 <- lubridate::hms(column3)
c3 <- lubridate::duration(hour = hour(c3), minute = minute(c3), 
    second = second(c3))

# convert to numeric to plot
d$c3 <- as.numeric(c3)

# labeling funtion to convert from numeric back to the original 
# format of the duration
yLabels <- function(x)
{
  x <- seconds_to_period(x)
  paste(hour(x),minute(x),second(x), sep = ':')
}

ggplot(d, aes(x=column1, y=c3, fill=column2)) + 
  geom_bar(position=position_dodge(),stat="identity") + 
  scale_y_continuous(labels = yLabels)