我有像
这样的数据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")
它给出了像
这样的情节由于以下问题,这看起来不对,
但如果我尝试下面的数据,
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")
它生成图形,
哪个看起来很完美。 我在这里看到的问题是它适用于整数但不适用于时间数据类型。我试着玩它但却无法获得成功。任何人都可以帮我创建正确的图表,或者请建议是否需要其他方法?
提前致谢。
答案 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)