使用ggplot2绘制散点图,按日期着色

11

我正在尝试制作一个按日期着色的散点图。目前我正在尝试以下方法,但是尽管图表看起来符合要求,我仍然无法找到一种使得图例中的日期以易读的格式呈现的方法。我尝试将它们格式化为例如20140101,但整个年份都在一个小范围内,即<20141231,因此我无法在该年份内获得不同的颜色。

data(cars)
cars['dt'] = seq(Sys.Date(),Sys.Date()-980,-20)

ggplot(cars,aes(speed,dist,colour = as.integer(dt))) + geom_point(alpha = 0.6) +
scale_colour_gradientn(colours=c('red','green','blue')) 

能否有人推荐一个解决方案吗?具体来说,我希望每个日期都是不同的颜色/色调。(对于我的实际数据,我有约5-6年的日常数据)

输入图像描述

3个回答

11

解决"必须提供原点"错误的方法之一是创建一个为as.Date指定原点的包装器,然后将其作为标签调用。

as.Date_origin <- function(x){
  as.Date(x, origin = '1970-01-01')
}

data(cars)
cars['dt'] = seq(Sys.Date(),Sys.Date()-980,-20)

ggplot(cars,aes(speed,dist,colour=as.integer(dt))) + geom_point(alpha = 0.6) +
  scale_colour_gradientn(name = 'Date', colours=c('red','green','blue'), labels=as.Date_origin)

@Tonys Ladson,你的解决方案非常有用。我有一个后续问题。如何将图例标签格式化为“%d %Y”?我不知道在哪里使用“format =”参数。谢谢! - mand3rd
1
嗨@mand3rd。你可以做到这一点。在as.Date_origin函数中,将as.Date(x, origin = '1970-01-01')更改为format(as.Date(x, origin = '1970-01-01'), format = '%d %Y') - Tony Ladson
1
这也可作为一个匿名函数使用:scale_colour_gradientn(name='日期', colours=c('红色', '绿色', '蓝色'), labels=function(x){ as.Date(x, origin='1970-01-01') }) - Jake Fisher

10

只需添加一个标签函数:

ggplot(cars,aes(speed,dist,colour=as.integer(dt))) + geom_point(alpha = 0.6) +
  scale_colour_gradientn(colours=c('red','green','blue'), labels=as.Date)

这里输入图片描述


3
我遇到了以下错误:as.Date.numeric(breaks) 中的错误:必须提供“origin”。 - achaudhr

0

scale_colour_gradient 主要用于连续数据,因此我们应该首先使用 as.integer() 将日期数据转换为连续格式。否则,可能会出现错误,例如“Error: Discrete value supplied to continuous scale”。

在许多情况下,日期列是因子,我们需要执行 as.integer(as.Date()) 来获取正确的转换数据。这不是一个大问题,但有时可能会棘手。自定义函数中的 origin1970-01-01,这是一个系统属性。阅读 as.Date 获取更多信息。

data(cars)
cars['dt'] = seq(Sys.Date(),Sys.Date()-980,-20)

trans_date <- function(x){
  as.Date(x, origin = '1970-01-01')
}
    
p <- ggplot(cars,aes(speed,dist,colour=as.integer(as.Date(dt)))) 
p + geom_point(alpha = 0.6) +
    scale_colour_gradientn(name = 'Date', colours=c('red','green','blue'), labels=trans_date)

这个答案与已发布的另一个答案不同并不明显。 - ouflak
嗨@ouflak。这不是一个完全不同于其他答案的回答。你没有看到这些差异的价值,可能是因为你对R和其他答案有深刻的理解。但我花了一些时间去弄清楚为什么我们可以使用scale_colour_gradientn来做到这一点,并修复数据格式以适应我的情况,即使它们只是一些小技巧。因此,我不希望其他人浪费时间去解决同样的问题,因此将我所学到的写入答案,希望能帮助那些也是新手的人。但我也感谢你花时间查看答案并发表评论。 - WEI YAN
@ouflak也许下次我可以在评论中提到其他答案来阐述我的观点,尽管它们可能不在一个答案中。谢谢! - WEI YAN

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接