在R中绘制自定义图表 - 显示活动的时间日志

时间:2016-06-07 01:14:36

标签: r visualization rcharts

我是R的新手,所以我想知道是否有可能创建如下图所示的图表?

enter image description here

我想创建一个自定义图表,显示各个人在给定时间完成的活动的持续时间。

2 个答案:

答案 0 :(得分:1)

虽然这通常不是你在R中创建的图形类型,但你肯定可以通过足够的腿部工作来完成它。

我认为这会让你快速启动:

require(lubridate)
require(ggplot2)

df              <- as.data.frame(matrix(nrow=14,ncol=3))
colnames(df)    <- c("Person", "Time", "Activity")
df$Person       <- c("A","A","A","A","A","A", "A", 
                     "B","B","B","B","B","B", "B")
df$Time         <- as.character(hours(c(10,11,12,13,14,15,16)))
df$Activity     <- c(NA, "Activity 1", NA, "Activity 2", NA, "Activity 3","Activity 3",
                     NA, "Activity 1", "Activity 2", NA, NA, "Activity 3", NA)  

ggplot(df, aes(Time, Person)) + geom_tile(aes(fill = Activity),
                                               colour = "white")  +   scale_fill_manual(values = rainbow (3))

enter image description here

您可以通过浏览ggplot2选项并进一步自定义以使其更接近您绘制的图片,将其提升到新的水平。例如,你应该能够

  • 更改栏的尺寸
  • 覆盖图例中的标签(geom_label是一种方式)
  • 微调刻度线

只需阅读并调整选项即可。我最近给出了高度自定义刻度线的答案,您可以通过快速搜索找到它。

答案 1 :(得分:1)

我想为数据提出另一种格式,其中每项活动都有开始和结束时间。

加载库。 dplyr仅用于操作数据集,而不是严格需要。

library(ggplot2)
library(dplyr)

首先我们读取数据集

activities <- read.csv2(
text=
    "Person; Activity; Activity start; Activity end
    A; Activity 1; 10:30; 11:30
    A; Activity 2; 12:00; 13:00
    A; Activity 3; 14:00; 16:00
    B; Activity 1; 10:30; 11:30
    B; Activity 2; 11:30; 13:00
    B; Activity 3; 14:00; 14:30"
) %>%
    mutate(
        Activity.start = as.POSIXct(Activity.start, format="%H:%M"),
        Activity.end = as.POSIXct(Activity.end, format="%H:%M"),
        Person = as.factor(Person)
)

所以现在我们有了正确的列类,我们可以用

来绘制它
ggplot(activities) +
    geom_rect(
        aes(
            xmin=Activity.start,
            xmax=Activity.end,
            fill=Activity,
            ymin=as.numeric(Person)-.5,
            ymax=as.numeric(Person)+.5)
        ) +
    scale_y_continuous(labels=levels(activities$Person), breaks=1:2) +
    geom_text(
        aes(x=(Activity.start + (Activity.end - Activity.start)/2), y=as.numeric(Person), label=Activity)
    ) +
    xlab(NULL) +
    ylab("Person")

导致

Example plot