我在尝试使用 scale_y_datetime not show geom_bar 时遇到了很多麻烦
I'm having a lot of trouble trying using scale_y_datetime not show geom_bar
我在尝试使用 scale_y_datetime
not show geom_bar
show message remove 30 rows 时遇到了很多问题
并尝试 coord_cartesian
颠倒麻烦。
Warning message:
Removed 30 rows containing missing values (geom_bar).
我的原始数据是格式的字符串:
> dataset
Date Duration Time
1 2020-06-01T00:00:00.0000000 1899-12-31T04:43:00.0000000
2 2020-06-02T00:00:00.0000000 1899-12-31T04:37:00.0000000
3 2020-06-03T00:00:00.0000000 1899-12-31T04:25:00.0000000
4 2020-06-04T00:00:00.0000000 1899-12-31T04:48:00.0000000
5 2020-06-05T00:00:00.0000000 1899-12-31T04:52:00.0000000
6 2020-06-06T00:00:00.0000000 1899-12-31T05:19:00.0000000
7 2020-06-07T00:00:00.0000000 1899-12-31T04:25:00.0000000
8 2020-06-08T00:00:00.0000000 1899-12-31T04:43:00.0000000
9 2020-06-09T00:00:00.0000000 1899-12-31T05:26:00.0000000
10 2020-06-10T00:00:00.0000000 1899-12-31T04:26:00.0000000
Sys.setenv(TZ='UTC')
library(scales)
library(ggplot2)
library(reshape2)
Day=format(as.POSIXct(dataset$'Date', format="%Y-%m-%dT%H:%M:%S",tz="UTC"), format="%y-%b-%d")
Hour=as.POSIXct(dataset$'Duration Time', format="%Y-%m-%dT%H:%M:%S",tz="UTC")
lima1 = c(as.POSIXct("1899-12-31T01:00:00",format="%Y-%m-%dT%H:%M:%S",tz="UTC"),as.POSIXct("1899-12-31T08:00:00",format="%Y-%m-%dT%H:%M:%S",tz="UTC"))
DurationTime <- c(Hour)
day <- c(Day)
df1 <- data.frame(DurationTime, day)
df <- melt(df1, id.vars = "day")
head(df)
start_time = strptime("1899-12-31 02:00:00", format = "%Y-%m-%d %H:%M:%S")
breaks = seq(0, 6, length.out = 7)
labels = c( "02:00", "03:00",
"04:00", "05:00", "06:00", "07:00", "08:00")
dataFrame <- data.frame(df)
names(dataFrame) <- c("day","Variable","Value")
#dataFrame$Time <- dataFrame$Value
#dataFrame$TimeInSeconds <- as.difftime(dataFrame$Time - start_time)
ggplot(data = dataFrame,aes(x = dataFrame$'day',
y = as.POSIXct(dataFrame$'Value', format="%Y-%m-%dT%H:%M:%S",tz="UTC"),
fill = Variable)) +
geom_bar(stat="identity",position = 'dodge') +
geom_text(aes(label=format(as.POSIXct(dataFrame$'Value', format="%Y-%m-%dT%H:%M:%S",tz="UTC"), format="%H:%M")), position=position_dodge(width=0.9), hjust =-0.10,angle=90) +
#scale_y_continuous(limits = c(0, 6),breaks = breaks,labels = labels)
#coord_cartesian(ylim=c(as.POSIXct("1899-12-31T01:00:00",format="%Y-%m-%dT%H:%M:%S"),as.POSIXct("1899-12-31T08:00:00",format="%Y-%m-%dT%H:%M:%S"))) +
scale_y_datetime(limits=c(as.POSIXct("1899-12-31T01:00:00",format="%Y-%m-%dT%H:%M:%S"),as.POSIXct("1899-12-31T08:00:00",format="%Y-%m-%dT%H:%M:%S")),breaks=date_breaks("1 hour"),labels=date_format("%H:%M", tz = "UTC"))+
theme_bw()+
xlab("Day") +
ylab("Time") +
labs(fill="Legend") +
theme(axis.text.x=element_text(angle=90))+
theme(axis.text.y=element_text(angle=45))+
theme(legend.position = 'bottom')+
theme(panel.grid.major = element_blank(),panel.background = element_blank())
我正在使用 ylim
coord_cartesian
它颠倒了我不想颠倒。
我想要正常的垂直。
coord_cartesian(ylim=c(as.POSIXct("1899-12-31T01:00:00",format="%Y-%m-%dT%H:%M:%S"),as.POSIXct("1899-12-31T08:00:00",format="%Y-%m-%dT%H:%M:%S"))) +
scale_y_datetime(breaks=date_breaks("1 hour"),labels=date_format("%H:%M", tz = "UTC"))+
我想我明白了。
之所以看到条形图倒置是因为 ggplot 不理解日期。 Ggplot see numbers:将日期转换为数字。
那些转换为数字的持续时间是负数。因此,条形图正确地朝向负侧。
解决方案是让您的持续时间从 R 的“零”日期开始。
在此处查看这个可重现的示例:
[我保留了图表的所有主题和设置]
library(scales)
library(ggplot2)
library(reshape2)
library(lubridate)
library(dplyr)
dataset <- tibble::tribble(~Date, ~`Duration Time`,
"2020-06-01T00:00:00.0000000", "1899-12-31T04:43:00.0000000",
"2020-06-02T00:00:00.0000000", "1899-12-31T04:37:00.0000000",
"2020-06-03T00:00:00.0000000", "1899-12-31T04:25:00.0000000",
"2020-06-04T00:00:00.0000000", "1899-12-31T04:48:00.0000000",
"2020-06-05T00:00:00.0000000", "1899-12-31T04:52:00.0000000",
"2020-06-06T00:00:00.0000000", "1899-12-31T05:19:00.0000000",
"2020-06-07T00:00:00.0000000", "1899-12-31T04:25:00.0000000",
"2020-06-08T00:00:00.0000000", "1899-12-31T04:43:00.0000000",
"2020-06-09T00:00:00.0000000", "1899-12-31T05:26:00.0000000",
"2020-06-10T00:00:00.0000000", "1899-12-31T04:26:00.0000000")
dataset <- dataset %>%
mutate(Day = as_date(Date),
`Duration Time` = as_datetime(`Duration Time`)) %>%
mutate(Time = make_datetime(hour = hour(`Duration Time`),
min = minute(`Duration Time`),
sec = second(`Duration Time`)))
ggplot(data = dataset,
aes(x = Day,
y = Time)) +
geom_bar(fill = "steelblue", stat = "identity") +
geom_text(aes(label = format(Time, format="%H:%M")), position=position_dodge(width=0.9), hjust =-0.10,angle=90) +
theme_bw() +
xlab("Day") +
ylab("Time") +
labs(fill="Legend") +
theme(axis.text.x = element_text(angle = 90))+
theme(axis.text.y = element_text(angle = 45))+
theme(legend.position = 'bottom')+
theme(panel.grid.major = element_blank(),
panel.background = element_blank())
我在尝试使用 scale_y_datetime
not show geom_bar
show message remove 30 rows 时遇到了很多问题
并尝试 coord_cartesian
颠倒麻烦。
Warning message:
Removed 30 rows containing missing values (geom_bar).
我的原始数据是格式的字符串:
> dataset
Date Duration Time
1 2020-06-01T00:00:00.0000000 1899-12-31T04:43:00.0000000
2 2020-06-02T00:00:00.0000000 1899-12-31T04:37:00.0000000
3 2020-06-03T00:00:00.0000000 1899-12-31T04:25:00.0000000
4 2020-06-04T00:00:00.0000000 1899-12-31T04:48:00.0000000
5 2020-06-05T00:00:00.0000000 1899-12-31T04:52:00.0000000
6 2020-06-06T00:00:00.0000000 1899-12-31T05:19:00.0000000
7 2020-06-07T00:00:00.0000000 1899-12-31T04:25:00.0000000
8 2020-06-08T00:00:00.0000000 1899-12-31T04:43:00.0000000
9 2020-06-09T00:00:00.0000000 1899-12-31T05:26:00.0000000
10 2020-06-10T00:00:00.0000000 1899-12-31T04:26:00.0000000
Sys.setenv(TZ='UTC')
library(scales)
library(ggplot2)
library(reshape2)
Day=format(as.POSIXct(dataset$'Date', format="%Y-%m-%dT%H:%M:%S",tz="UTC"), format="%y-%b-%d")
Hour=as.POSIXct(dataset$'Duration Time', format="%Y-%m-%dT%H:%M:%S",tz="UTC")
lima1 = c(as.POSIXct("1899-12-31T01:00:00",format="%Y-%m-%dT%H:%M:%S",tz="UTC"),as.POSIXct("1899-12-31T08:00:00",format="%Y-%m-%dT%H:%M:%S",tz="UTC"))
DurationTime <- c(Hour)
day <- c(Day)
df1 <- data.frame(DurationTime, day)
df <- melt(df1, id.vars = "day")
head(df)
start_time = strptime("1899-12-31 02:00:00", format = "%Y-%m-%d %H:%M:%S")
breaks = seq(0, 6, length.out = 7)
labels = c( "02:00", "03:00",
"04:00", "05:00", "06:00", "07:00", "08:00")
dataFrame <- data.frame(df)
names(dataFrame) <- c("day","Variable","Value")
#dataFrame$Time <- dataFrame$Value
#dataFrame$TimeInSeconds <- as.difftime(dataFrame$Time - start_time)
ggplot(data = dataFrame,aes(x = dataFrame$'day',
y = as.POSIXct(dataFrame$'Value', format="%Y-%m-%dT%H:%M:%S",tz="UTC"),
fill = Variable)) +
geom_bar(stat="identity",position = 'dodge') +
geom_text(aes(label=format(as.POSIXct(dataFrame$'Value', format="%Y-%m-%dT%H:%M:%S",tz="UTC"), format="%H:%M")), position=position_dodge(width=0.9), hjust =-0.10,angle=90) +
#scale_y_continuous(limits = c(0, 6),breaks = breaks,labels = labels)
#coord_cartesian(ylim=c(as.POSIXct("1899-12-31T01:00:00",format="%Y-%m-%dT%H:%M:%S"),as.POSIXct("1899-12-31T08:00:00",format="%Y-%m-%dT%H:%M:%S"))) +
scale_y_datetime(limits=c(as.POSIXct("1899-12-31T01:00:00",format="%Y-%m-%dT%H:%M:%S"),as.POSIXct("1899-12-31T08:00:00",format="%Y-%m-%dT%H:%M:%S")),breaks=date_breaks("1 hour"),labels=date_format("%H:%M", tz = "UTC"))+
theme_bw()+
xlab("Day") +
ylab("Time") +
labs(fill="Legend") +
theme(axis.text.x=element_text(angle=90))+
theme(axis.text.y=element_text(angle=45))+
theme(legend.position = 'bottom')+
theme(panel.grid.major = element_blank(),panel.background = element_blank())
我正在使用 ylim
coord_cartesian
它颠倒了我不想颠倒。
我想要正常的垂直。
coord_cartesian(ylim=c(as.POSIXct("1899-12-31T01:00:00",format="%Y-%m-%dT%H:%M:%S"),as.POSIXct("1899-12-31T08:00:00",format="%Y-%m-%dT%H:%M:%S"))) +
scale_y_datetime(breaks=date_breaks("1 hour"),labels=date_format("%H:%M", tz = "UTC"))+
我想我明白了。
之所以看到条形图倒置是因为 ggplot 不理解日期。 Ggplot see numbers:将日期转换为数字。 那些转换为数字的持续时间是负数。因此,条形图正确地朝向负侧。
解决方案是让您的持续时间从 R 的“零”日期开始。
在此处查看这个可重现的示例: [我保留了图表的所有主题和设置]
library(scales)
library(ggplot2)
library(reshape2)
library(lubridate)
library(dplyr)
dataset <- tibble::tribble(~Date, ~`Duration Time`,
"2020-06-01T00:00:00.0000000", "1899-12-31T04:43:00.0000000",
"2020-06-02T00:00:00.0000000", "1899-12-31T04:37:00.0000000",
"2020-06-03T00:00:00.0000000", "1899-12-31T04:25:00.0000000",
"2020-06-04T00:00:00.0000000", "1899-12-31T04:48:00.0000000",
"2020-06-05T00:00:00.0000000", "1899-12-31T04:52:00.0000000",
"2020-06-06T00:00:00.0000000", "1899-12-31T05:19:00.0000000",
"2020-06-07T00:00:00.0000000", "1899-12-31T04:25:00.0000000",
"2020-06-08T00:00:00.0000000", "1899-12-31T04:43:00.0000000",
"2020-06-09T00:00:00.0000000", "1899-12-31T05:26:00.0000000",
"2020-06-10T00:00:00.0000000", "1899-12-31T04:26:00.0000000")
dataset <- dataset %>%
mutate(Day = as_date(Date),
`Duration Time` = as_datetime(`Duration Time`)) %>%
mutate(Time = make_datetime(hour = hour(`Duration Time`),
min = minute(`Duration Time`),
sec = second(`Duration Time`)))
ggplot(data = dataset,
aes(x = Day,
y = Time)) +
geom_bar(fill = "steelblue", stat = "identity") +
geom_text(aes(label = format(Time, format="%H:%M")), position=position_dodge(width=0.9), hjust =-0.10,angle=90) +
theme_bw() +
xlab("Day") +
ylab("Time") +
labs(fill="Legend") +
theme(axis.text.x = element_text(angle = 90))+
theme(axis.text.y = element_text(angle = 45))+
theme(legend.position = 'bottom')+
theme(panel.grid.major = element_blank(),
panel.background = element_blank())