如何在ggplot2中设置y轴和x轴的原点/截距?
我有一个类似以下的数据集(问题末尾的数据结构):
Var1 Var2 value
1 04:00 Personal care 2
2 04:10 Personal care 2
3 04:20 Personal care 2
4 04:30 Personal care 2
5 04:40 Personal care 2
我正在使用以下代码绘制数据
plot <- ggplot(melted_Activities, aes(x = Var1,y = value,fill = Var2)) +
geom_col(position = "fill") +
labs(x="Time", y="Probabilities", colour="Activties", fill="Activites") +
theme(legend.position="right", axis.text.x = element_text(angle = 0, hjust = 0)) +
annotate("rect", fill = "black", alpha = 0.3,
xmin = c(73), xmax = c(97), ymin = -Inf, ymax = Inf)
plot + scale_x_discrete(breaks = c("04:00","05:00", "06:00", "07:00","08:00", "09:00",
"10:00", "11:00", "12:00","13:00", "14:00", "15:00",
"16:00", "17:00", "18:00", "19:00", "20:00", "21:00",
"22:00", "23:00", "00:00", "01:00", "02:00", "03:00"),
expand = c(0,0)) + scale_y_continuous(expand = c(-0,0))
melted_Activities <- structure(list(Var1 = structure(1:5, .Label = c("04:00", "04:10",
"04:20", "04:30", "04:40", "04:50", "05:00", "05:10", "05:20",
"05:30", "05:40", "05:50", "06:00", "06:10", "06:20", "06:30",
"06:40", "06:50", "07:00", "07:10", "07:20", "07:30", "07:40",
"07:50", "08:00", "08:10", "08:20", "08:30", "08:40", "08:50",
"09:00", "09:10", "09:20", "09:30", "09:40", "09:50", "10:00",
"10:10", "10:20", "10:30", "10:40", "10:50", "11:00", "11:10",
"11:20", "11:30", "11:40", "11:50", "12:00", "12:10", "12:20",
"12:30", "12:40", "12:50", "13:00", "13:10", "13:20", "13:30",
"13:40", "13:50", "14:00", "14:10", "14:20", "14:30", "14:40",
"14:50", "15:00", "15:10", "15:20", "15:30", "15:40", "15:50",
"16:00", "16:10", "16:20", "16:30", "16:40", "16:50", "17:00",
"17:10", "17:20", "17:30", "17:40", "17:50", "18:00", "18:10",
"18:20", "18:30", "18:40", "18:50", "19:00", "19:10", "19:20",
"19:30", "19:40", "19:50", "20:00", "20:10", "20:20", "20:30",
"20:40", "20:50", "21:00", "21:10", "21:20", "21:30", "21:40",
"21:50", "22:00", "22:10", "22:20", "22:30", "22:40", "22:50",
"23:00", "23:10", "23:20", "23:30", "23:40", "23:50", "00:00",
"00:10", "00:20", "00:30", "00:40", "00:50", "01:00", "01:10",
"01:20", "01:30", "01:40", "01:50", "02:00", "02:10", "02:20",
"02:30", "02:40", "02:50", "03:00", "03:10", "03:20", "03:30",
"03:40", "03:50"), class = "factor"), Var2 = structure(c(1L,
1L, 1L, 1L, 1L), .Label = c("Personal care", "Sleep", "Eating",
"Other personal care", "Employment", "Main job", "Second job",
"Activites related to employment", "Study", "School or University",
"Free time study", "House and family care", "Food management",
"Household maintenance", "Making care for textiles", "Gardening and pet care",
"Construction and repairs", "Shopping and services", "Household management",
"Childcare of own household member", "Help to an adult household member",
"Volunteer work and meeting", "Organisational work", "Informal help to others",
"Participatory activties", "Social care", "Social life", "Entertainment and culture",
"Resting", "Sport and outdoor activities", "Physical exercise",
"Productive exercise", "Sportsrelated activities", "Hobbies, games and computing",
"Arts and hobbies", "Computing", "PC Games", "Mass media", "Reading",
"Tv and video", "Radio and music", "Travel and unspecified time use",
"Travel by purpose", "Punctuating activity"), class = "factor"),
value = c(2, 2, 2, 2, 2)), row.names = c(NA, 5L), class = "data.frame")
答案 0 :(得分:2)
查看数据及其显示方式,似乎发现午夜至4点之前的时间是第二天。这使字符到日期时间格式的转换有点复杂。这就是if_else
管道中dplyr
背后的原因。由于dplyr::if_else
弄乱了时间格式,因此请确保您正在使用base::ifelse
。
现在您需要在annotate
中插入希望“阴影框” 出现的时间,而不是任意数字。
这些说,expand_limits
在评论工作中建议。请注意,将仅时间字符串转换为日期时间时,默认情况下R
会考虑当前的Sys.Date()
。这就是为什么在expand_limits
中,我使用从数据框本身转换的日期时间来解决这个问题。
library(lubridate)
library(dplyr)
library(ggplot2)
melted_ActivitiesC <- melted_Activities %>%
mutate(time = as.POSIXct(strptime(Var1, format="%H:%M"))) %>%
mutate(time = if_else(hour(time) >= 4, time,
time + as.difftime(1, unit="days")))
ggplot(melted_Activities, aes(x = time,y = value,fill = Var2)) +
geom_col(position = "fill") +
labs(x="Time", y="Probabilities", colour="Activties", fill="Activites") +
theme(legend.position="right", axis.text.x = element_text(angle = 0, hjust = 0)) +
annotate("rect", fill = "black", alpha = 0.3,
xmin = as.POSIXct(strptime("16:00", format="%H:%M")),
xmax = as.POSIXct(strptime("24:00", format="%H:%M")),
ymin = -Inf, ymax = Inf) + scale_x_datetime(date_labels = "%H") +
expand_limits(x =floor_date(min(melted_Activities$time), "day"), y = 0)