如何使用ggplot2在R中的散点极坐标图中获取垂直线
How to get a vertical line in a scatter polar coordinates plot in R using ggplot2
我有两个问题:
希望是一个简单的问题,但我想在我的极坐标图中放置一条垂直线,表示数据的开始。我有一个数据集,可以收集一年中每小时的读数,并且我已经(在帮助下)设法获得了我想要的极坐标图。我的数据格式为(x = yyyy-mm-dd HH:MM:SS and y = number value)。我旋转了原点,使起点不垂直(我需要保持这种旋转)。因此,为了表示一年中数据的开始和结束位置,我想添加一条垂直线(见下图)。
如果这不可能,是否可以在开始日期和结束日期之间输入一个空 space,以在数据中留出空白,作为开始和结束时间?
这是我当前的示例数据集和代码:
library(lubridate) #make an example dataset
NoOfHours <- as.numeric(ymd_hms("2019-6-1 17:00:00") - ymd_hms("2018-3-01 8:00:00"))*24
data <- as.data.frame(ymd_hms("2018-3-01 8:00:00") + hours(0:NoOfHours))
colnames(data) <- 'date'
set.seed(10)
data$level <- runif(nrow(data), min = 0, max = 250)
library(openair)
yeardata <- selectByDate(data, start = "2018-3-1", end = "2019-2-28", year = 2018:2019)
library(ggplot2)
plot <- ggplot(yeardata, aes(x=date, y=level, color = level)) +
geom_hline(yintercept = seq(0, 300, by = 50), colour = "black", size = 0.75, alpha = 0.3)+ #make my own gridlines so that when on a white background, the gridlines wont cross the text.
geom_vline(xintercept = as.POSIXct(data$date[1], origin = "1970-01-01 00:00:00 UTC"), colour = "black", size = 0.75, alpha = 0.3, )+
scale_color_gradient(limits = c(0,200), low="green", high="red", oob = scales::squish)+ #need oob = scales::squish to get values over 200 to be red.
geom_jitter(alpha = 0.2, size = 2) +# Use a slightly darker palette than normal
theme(axis.title=element_text(size=16,face="bold"), axis.text.x = element_text(size = 16), axis.text.y = element_text(size = 12))+
labs(x = NULL, y = bquote('Levels '~(m^2)), color = "Level")+ #bquote to allow superscripts
scale_y_continuous(breaks = seq(0, 300, 50),
limits = c(-100,310))
plot
plot + coord_polar(start = ((2*60/365)*pi))+ #need to have the number of radians to get my start position. If march 1st is the start date, then 60 days have past since Jan 1.
theme(legend.title = element_text(color = "black", size = 14, face = "bold"), panel.background = element_rect(fill = "white"), panel.grid = element_blank())
我可以得到一个正常的散点图,垂直线在我想要的地方(在数据集的开头)看起来像这样:
但是当我尝试将其放入极坐标时出现此错误:
"Error in as.POSIXct.numeric(value) : 'origin' must be supplied"
我试图以几种格式提供来源,最新的是上面代码中看到的格式。理想情况下,图表看起来像这样:
如有任何帮助,我们将不胜感激。
谢谢
这是添加行和文本标签的方法。看起来添加第一个文本注释的意外结果,在第一个日期之前使用 x,会像您在 #2 中请求的那样创建一个间隙。但缺点是它稍微改变了休息的旋转,这可能需要对 coord_polar(start =
项进行更多调整。
ggplot(yeardata, aes(x=date, y=level, color = level)) +
geom_hline(yintercept = seq(0, 300, by = 50), colour = "black", size = 0.75, alpha = 0.3)+
# this annotation layer is drawn over the gridlines, but under the points
annotate("segment",x = ymd_hms(data$date[1]), xend = ymd_hms(data$date[1]),
y = 0, yend = 310, colour = "black", size = 0.75, alpha = 0.3) +
scale_color_gradient(limits = c(0,200), low="green", high="red", oob = scales::squish)+
geom_jitter(alpha = 0.2, size = 2) +# Use a slightly darker palette than normal
# this text is prior to existing x data and creates a gap
annotate("text", label = "my text", x = ymd_hms(data$date[1]) - ddays(5),
y = 300, angle = 0) +
annotate("text", label = "my text2", x = ymd_hms(data$date[1]) + ddays(5),
y = 300, angle = 0) +
theme(axis.title=element_text(size=16,face="bold"), axis.text.x = element_text(size = 16), axis.text.y = element_text(size = 12))+
labs(x = NULL, y = bquote('Levels '~(m^2)), color = "Level")+ #bquote to allow superscripts
scale_y_continuous(breaks = seq(0, 300, 50),
limits = c(-100,310))+
coord_polar(start = ((2*60/365)*pi))+
theme(legend.title = element_text(color = "black", size = 14, face = "bold"),
panel.background = element_rect(fill = "white"),
panel.grid = element_blank())
我无法 post 更正代码,因为 openair 库不会加载到我的系统中,但出现此错误的原因:
"Error in as.POSIXct.numeric(value) : 'origin' must be supplied"
是因为您在添加数据之前试图在 vlines 上。如果图上没有数据,系统就无法弄清楚如何在上面画线。在大多数情况下,这无关紧要,我正在努力寻找向我解释这一点的参考资料,但 ggplot2 在一定程度上依赖于将对象添加到绘图中的顺序,尤其是在使用带有日期的 vline 时x 轴。
我有两个问题:
希望是一个简单的问题,但我想在我的极坐标图中放置一条垂直线,表示数据的开始。我有一个数据集,可以收集一年中每小时的读数,并且我已经(在帮助下)设法获得了我想要的极坐标图。我的数据格式为(x = yyyy-mm-dd HH:MM:SS and y = number value)。我旋转了原点,使起点不垂直(我需要保持这种旋转)。因此,为了表示一年中数据的开始和结束位置,我想添加一条垂直线(见下图)。
如果这不可能,是否可以在开始日期和结束日期之间输入一个空 space,以在数据中留出空白,作为开始和结束时间?
这是我当前的示例数据集和代码:
library(lubridate) #make an example dataset
NoOfHours <- as.numeric(ymd_hms("2019-6-1 17:00:00") - ymd_hms("2018-3-01 8:00:00"))*24
data <- as.data.frame(ymd_hms("2018-3-01 8:00:00") + hours(0:NoOfHours))
colnames(data) <- 'date'
set.seed(10)
data$level <- runif(nrow(data), min = 0, max = 250)
library(openair)
yeardata <- selectByDate(data, start = "2018-3-1", end = "2019-2-28", year = 2018:2019)
library(ggplot2)
plot <- ggplot(yeardata, aes(x=date, y=level, color = level)) +
geom_hline(yintercept = seq(0, 300, by = 50), colour = "black", size = 0.75, alpha = 0.3)+ #make my own gridlines so that when on a white background, the gridlines wont cross the text.
geom_vline(xintercept = as.POSIXct(data$date[1], origin = "1970-01-01 00:00:00 UTC"), colour = "black", size = 0.75, alpha = 0.3, )+
scale_color_gradient(limits = c(0,200), low="green", high="red", oob = scales::squish)+ #need oob = scales::squish to get values over 200 to be red.
geom_jitter(alpha = 0.2, size = 2) +# Use a slightly darker palette than normal
theme(axis.title=element_text(size=16,face="bold"), axis.text.x = element_text(size = 16), axis.text.y = element_text(size = 12))+
labs(x = NULL, y = bquote('Levels '~(m^2)), color = "Level")+ #bquote to allow superscripts
scale_y_continuous(breaks = seq(0, 300, 50),
limits = c(-100,310))
plot
plot + coord_polar(start = ((2*60/365)*pi))+ #need to have the number of radians to get my start position. If march 1st is the start date, then 60 days have past since Jan 1.
theme(legend.title = element_text(color = "black", size = 14, face = "bold"), panel.background = element_rect(fill = "white"), panel.grid = element_blank())
我可以得到一个正常的散点图,垂直线在我想要的地方(在数据集的开头)看起来像这样:
但是当我尝试将其放入极坐标时出现此错误:
"Error in as.POSIXct.numeric(value) : 'origin' must be supplied"
我试图以几种格式提供来源,最新的是上面代码中看到的格式。理想情况下,图表看起来像这样:
如有任何帮助,我们将不胜感激。
谢谢
这是添加行和文本标签的方法。看起来添加第一个文本注释的意外结果,在第一个日期之前使用 x,会像您在 #2 中请求的那样创建一个间隙。但缺点是它稍微改变了休息的旋转,这可能需要对 coord_polar(start =
项进行更多调整。
ggplot(yeardata, aes(x=date, y=level, color = level)) +
geom_hline(yintercept = seq(0, 300, by = 50), colour = "black", size = 0.75, alpha = 0.3)+
# this annotation layer is drawn over the gridlines, but under the points
annotate("segment",x = ymd_hms(data$date[1]), xend = ymd_hms(data$date[1]),
y = 0, yend = 310, colour = "black", size = 0.75, alpha = 0.3) +
scale_color_gradient(limits = c(0,200), low="green", high="red", oob = scales::squish)+
geom_jitter(alpha = 0.2, size = 2) +# Use a slightly darker palette than normal
# this text is prior to existing x data and creates a gap
annotate("text", label = "my text", x = ymd_hms(data$date[1]) - ddays(5),
y = 300, angle = 0) +
annotate("text", label = "my text2", x = ymd_hms(data$date[1]) + ddays(5),
y = 300, angle = 0) +
theme(axis.title=element_text(size=16,face="bold"), axis.text.x = element_text(size = 16), axis.text.y = element_text(size = 12))+
labs(x = NULL, y = bquote('Levels '~(m^2)), color = "Level")+ #bquote to allow superscripts
scale_y_continuous(breaks = seq(0, 300, 50),
limits = c(-100,310))+
coord_polar(start = ((2*60/365)*pi))+
theme(legend.title = element_text(color = "black", size = 14, face = "bold"),
panel.background = element_rect(fill = "white"),
panel.grid = element_blank())
我无法 post 更正代码,因为 openair 库不会加载到我的系统中,但出现此错误的原因:
"Error in as.POSIXct.numeric(value) : 'origin' must be supplied"
是因为您在添加数据之前试图在 vlines 上。如果图上没有数据,系统就无法弄清楚如何在上面画线。在大多数情况下,这无关紧要,我正在努力寻找向我解释这一点的参考资料,但 ggplot2 在一定程度上依赖于将对象添加到绘图中的顺序,尤其是在使用带有日期的 vline 时x 轴。