R ggplot2 y轴顺序在子集后发生变化

R ggplot2 y轴顺序在子集后发生变化,r,ggplot2,r-factor,R,Ggplot2,R Factor,我有一个函数,在我将其子集之前,它可以按预期工作。函数plotCalendar()是我尝试使用带有刻面的ggplot2制作日历热图的一个例子。y轴顺序很重要,因为它是针对“周/月”的,当顺序颠倒时,数据viz看起来不像日历 下面是代码,首先是调用代码,然后是生成一些数据的函数-generateData(),然后是plot函数-plotCalendar() 当我对数据使用df时,代码按预期工作,但当我使用df2(子集数据)时,周和月的顺序沿y轴反转 library(ggplot2) library

我有一个函数,在我将其子集之前,它可以按预期工作。函数plotCalendar()是我尝试使用带有刻面的ggplot2制作日历热图的一个例子。y轴顺序很重要,因为它是针对“周/月”的,当顺序颠倒时,数据viz看起来不像日历

下面是代码,首先是调用代码,然后是生成一些数据的函数-generateData(),然后是plot函数-plotCalendar()

当我对数据使用df时,代码按预期工作,但当我使用df2(子集数据)时,周和月的顺序沿y轴反转

library(ggplot2)
library(ProgGUIinR)
library(chron)

df <- generateData()
plotCalendar(df, dateFieldName = "dates", numericFieldName = "counts", yLab = "Month of Year")
df2 <- df[df$filterField == 42, ]
plotCalendar(df2, dateFieldName = "dates", numericFieldName = "counts", yLab = "Month of Year")
库(ggplot2)
图书馆(ProgGUIinR)
图书馆(计时)

df如果您颠倒“到”平铺层的顺序,它将起作用

当前:

p <- ggplot(agg, aes(Year, WeekOfMonth, fill = NumericField))
noData <- subset(agg, is.na(agg$NumericField))
p <- p + geom_tile(data = subset(agg, !is.na(agg$NumericField)), aes(fill = NumericField), color = "gray")
if(nrow(noData) > 0) p <- p + geom_tile(data = noData, color = "gray", fill = "white")
要避免y轴负标签,必须添加:

p <- p + scale_y_continuous(label=abs)
这样就完全不需要
noData

最后,我想您有理由以这种方式显示日历,但我认为这里有一个更直观的日历视图

gg.calendar <- function(df) {
  require(ggplot2)
  require(lubridate)
  wom <- function(date) { # week-of-month
    first <- wday(as.Date(paste(year(date),month(date),1,sep="-")))
    return((mday(date)+(first-2)) %/% 7+1)
  }
  df$month <- month(df$dates)
  df$day   <- mday(df$dates)

  rng   <- range(df$dates)
  rng   <- as.Date(paste(year(rng),month(rng),1,sep="-"))
  start <- rng[1]
  end   <- rng[2]
  month(end) <- month(end)+1
  day(end)   <- day(end)  -1

  cal <- data.frame(dates=seq(start,end,by="day"))
  cal$year  <- year(cal$dates)
  cal$month <- month(cal$dates)
  cal$cmonth<- month(cal$dates,label=T)
  cal$day   <- mday(cal$dates)
  cal$cdow  <- wday(cal$dates,label=T)
  cal$dow   <- wday(cal$dates)
  cal$week  <- wom(cal$dates)

  cal        <- merge(cal,df[,c("dates","counts")],all.x=T)

  ggplot(cal, aes(x=cdow,y=-week))+
    geom_tile(aes(fill=counts,colour="grey50"))+
    geom_text(aes(label=day),size=3,colour="grey20")+
    facet_wrap(~cmonth, ncol=3)+
    scale_fill_gradient(low = "moccasin", high = "dodgerblue", na.value="white")+
    scale_color_manual(guide=F,values="grey50")+
    scale_x_discrete(labels=c("S","M","T","W","Th","F","S"))+
    theme(axis.text.y=element_blank(),axis.ticks.y=element_blank())+
    theme(panel.grid=element_blank())+
    labs(x="",y="")+
    coord_fixed()
}
gg.calendar(df)
gg.calendar(df2)


gg.calendar如果您颠倒“到”平铺层的顺序,它就会工作

当前:

p <- ggplot(agg, aes(Year, WeekOfMonth, fill = NumericField))
noData <- subset(agg, is.na(agg$NumericField))
p <- p + geom_tile(data = subset(agg, !is.na(agg$NumericField)), aes(fill = NumericField), color = "gray")
if(nrow(noData) > 0) p <- p + geom_tile(data = noData, color = "gray", fill = "white")
要避免y轴负标签,必须添加:

p <- p + scale_y_continuous(label=abs)
这样就完全不需要
noData

最后,我想您有理由以这种方式显示日历,但我认为这里有一个更直观的日历视图

gg.calendar <- function(df) {
  require(ggplot2)
  require(lubridate)
  wom <- function(date) { # week-of-month
    first <- wday(as.Date(paste(year(date),month(date),1,sep="-")))
    return((mday(date)+(first-2)) %/% 7+1)
  }
  df$month <- month(df$dates)
  df$day   <- mday(df$dates)

  rng   <- range(df$dates)
  rng   <- as.Date(paste(year(rng),month(rng),1,sep="-"))
  start <- rng[1]
  end   <- rng[2]
  month(end) <- month(end)+1
  day(end)   <- day(end)  -1

  cal <- data.frame(dates=seq(start,end,by="day"))
  cal$year  <- year(cal$dates)
  cal$month <- month(cal$dates)
  cal$cmonth<- month(cal$dates,label=T)
  cal$day   <- mday(cal$dates)
  cal$cdow  <- wday(cal$dates,label=T)
  cal$dow   <- wday(cal$dates)
  cal$week  <- wom(cal$dates)

  cal        <- merge(cal,df[,c("dates","counts")],all.x=T)

  ggplot(cal, aes(x=cdow,y=-week))+
    geom_tile(aes(fill=counts,colour="grey50"))+
    geom_text(aes(label=day),size=3,colour="grey20")+
    facet_wrap(~cmonth, ncol=3)+
    scale_fill_gradient(low = "moccasin", high = "dodgerblue", na.value="white")+
    scale_color_manual(guide=F,values="grey50")+
    scale_x_discrete(labels=c("S","M","T","W","Th","F","S"))+
    theme(axis.text.y=element_blank(),axis.ticks.y=element_blank())+
    theme(panel.grid=element_blank())+
    labs(x="",y="")+
    coord_fixed()
}
gg.calendar(df)
gg.calendar(df2)


gg.calendar我无法运行您的代码。您有一些未定义的函数。你在使用其他软件包吗?
if(nrow(noData)>0)
行就是把事情搞砸的地方,我认为问题是如果nrow(noData)>0是真的,那么你在现有的基础上添加了另一层
geom_tile
。要修复反向顺序,您可以将geom_tiles放入if-else,即
if(nrow(noData)>0){做一件事}否则{做另一件事}
;但我不确定你是否希望日历是这样的。否则,如果nrow
,您可以在
中添加
+缩放y____离散(打断=5:1,标签=1:5)
,但我想这更像暴力破解。谢谢rawr的回答。我的目标是在没有数据的情况下使用另一种颜色。但是我不需要测试没有数据,我所要做的就是把没有数据的层放在有数据的情况下的层之前。通过删除noData变量和if语句及其块,我可以让它正常工作。如果我用这两行代码得到了我想要的日历外观:p我不能运行你的代码。您有一些未定义的函数。你在使用其他软件包吗?
if(nrow(noData)>0)
行就是把事情搞砸的地方,我认为问题是如果nrow(noData)>0是真的,那么你在现有的基础上添加了另一层
geom_tile
。要修复反向顺序,您可以将geom_tiles放入if-else,即
if(nrow(noData)>0){做一件事}否则{做另一件事}
;但我不确定你是否希望日历是这样的。否则,如果nrow
,您可以在
中添加
+缩放y____离散(打断=5:1,标签=1:5)
,但我想这更像暴力破解。谢谢rawr的回答。我的目标是在没有数据的情况下使用另一种颜色。但是我不需要测试没有数据,我所要做的就是把没有数据的层放在有数据的情况下的层之前。通过删除noData变量和if语句及其块,我可以让它正常工作。如果得到了我想要的两行日历的外观:p在底部查看我的编辑。有一个更好的方法。请参阅底部的“我的编辑”。有一个更好的方法。
gg.calendar <- function(df) {
  require(ggplot2)
  require(lubridate)
  wom <- function(date) { # week-of-month
    first <- wday(as.Date(paste(year(date),month(date),1,sep="-")))
    return((mday(date)+(first-2)) %/% 7+1)
  }
  df$month <- month(df$dates)
  df$day   <- mday(df$dates)

  rng   <- range(df$dates)
  rng   <- as.Date(paste(year(rng),month(rng),1,sep="-"))
  start <- rng[1]
  end   <- rng[2]
  month(end) <- month(end)+1
  day(end)   <- day(end)  -1

  cal <- data.frame(dates=seq(start,end,by="day"))
  cal$year  <- year(cal$dates)
  cal$month <- month(cal$dates)
  cal$cmonth<- month(cal$dates,label=T)
  cal$day   <- mday(cal$dates)
  cal$cdow  <- wday(cal$dates,label=T)
  cal$dow   <- wday(cal$dates)
  cal$week  <- wom(cal$dates)

  cal        <- merge(cal,df[,c("dates","counts")],all.x=T)

  ggplot(cal, aes(x=cdow,y=-week))+
    geom_tile(aes(fill=counts,colour="grey50"))+
    geom_text(aes(label=day),size=3,colour="grey20")+
    facet_wrap(~cmonth, ncol=3)+
    scale_fill_gradient(low = "moccasin", high = "dodgerblue", na.value="white")+
    scale_color_manual(guide=F,values="grey50")+
    scale_x_discrete(labels=c("S","M","T","W","Th","F","S"))+
    theme(axis.text.y=element_blank(),axis.ticks.y=element_blank())+
    theme(panel.grid=element_blank())+
    labs(x="",y="")+
    coord_fixed()
}
gg.calendar(df)
gg.calendar(df2)