在 R 中绘制自定义图表 - 显示活动的时间日志
Drawing a custom chart in R - Displaying a time log of activites
我是R的新手,所以我想知道是否可以创建如下图所示的图表?
我想创建一个自定义图表,显示不同人在给定时间完成的活动的持续时间。
虽然这通常不是您在 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))
您可以通过探索 ggplot2
选项并进行进一步自定义以使其更接近您绘制的图片,从而将其提升到一个新的水平。例如,您应该能够
- 更改条形的尺寸
- 覆盖图例中的标签(
geom_label
是一种方法)
- 微调刻度线
只需仔细阅读并调整选项即可。我最近给出了一个关于高度自定义刻度线的答案,您可以通过快速搜索在 SO 上找到它。
我想建议另一种数据格式,其中每个 activity 都有开始时间和结束时间。
加载库。 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")
这导致
我是R的新手,所以我想知道是否可以创建如下图所示的图表?
我想创建一个自定义图表,显示不同人在给定时间完成的活动的持续时间。
虽然这通常不是您在 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))
您可以通过探索 ggplot2
选项并进行进一步自定义以使其更接近您绘制的图片,从而将其提升到一个新的水平。例如,您应该能够
- 更改条形的尺寸
- 覆盖图例中的标签(
geom_label
是一种方法) - 微调刻度线
只需仔细阅读并调整选项即可。我最近给出了一个关于高度自定义刻度线的答案,您可以通过快速搜索在 SO 上找到它。
我想建议另一种数据格式,其中每个 activity 都有开始时间和结束时间。
加载库。 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")
这导致