2017-08-08 106 views
2

我正在嘗試使用ggplot2製作刻面的t-chart,其中x軸表示一系列事件,y軸表示這些事件之間的天數。 x軸應標有事件日期,但不是時間序列,因爲無論事件之間的實際時間如何,x軸刻度之間的距離應該均勻。使用第二個變量標記ggplot2刻面中的軸刻度

添加一個刻面圖令我感到困惑。下面是一些樣本數據:

df <- data.frame(EventDT = as.POSIXct(c("2014-11-22 07:41:00", "2015-02-24 08:10:00", 
            "2015-06-10 13:54:00", "2015-07-11 02:43:00", 
            "2015-08-31 19:08:00", "2014-11-18 14:06:00", 
            "2015-06-09 23:10:00", "2016-02-29 07:55:00", 
            "2016-05-22 04:30:00", "2016-05-25 21:46:00", 
            "2014-12-22 16:19:00", "2015-05-13 16:38:00", 
            "2015-06-01 09:05:00", "2016-02-21 02:30:00", 
            "2016-05-13 01:36:00")), 
      EventNBR = rep(1:5, 3), 
      Group = c(rep('A', 5), rep('B',5), rep('C',5)), 
      Y = c(15.818750, 94.020139, 106.238889, 30.534028, 51.684028, 
        187.670139, 203.377778, 264.364583, 82.857639, 3.719444, 
        169.829861, 142.013194, 18.685417, 264.725694,81.962500)) 

忽略事件的日期,我可以生產這樣的:

g <- ggplot(df, aes(x=EventNBR, y=Y)) + 
    geom_point() + 
    geom_line() + 
    facet_wrap(~ Group, scales='free_x') 

Plot should show EventDT along X-axis, not EventNBR

我曾嘗試使用標籤參數沒有成功scale_x_discrete:

xaxis.ticks <- function(x) { 
    df[which(df$EventNBR) == x] } 

g + scale_x_discrete(labels = xaxis.ticks) 

但這是錯誤的方式,我無法描述,因爲因爲它完全切斷了我的刻度標籤。

由於此組數據集中EventNBR與EventDT之間存在1-1對應關係,因此似乎應該有一個簡單的解決方案,但我無法弄清楚。我可以俯視一些痛苦的事情嗎?

回答

1

一般來說,這是一個非常有問題的東西,如here所提及的,還有其他幾個主題。

但幸運的是,您可以使用scales='free_x'

你需要做的是增加一個唯一索引列像

df$id <- 1:nrow(df) 

事後你可以與你有正確的標籤欄覆蓋這些指標。

g <- ggplot(df, aes(x=id, y=Y)) + 
    geom_point() + 
    geom_line() + 
    facet_wrap(~ Group, scales='free_x') 
g + scale_x_continuous(breaks=df$id, labels=df$EventDT) + 
    theme(axis.text.x=element_text(angle=90, vjust=.5)) 

可能有更簡單的解決方案,但這是在你的例子中工作。

此外,由於x軸是數字而不是離散的,因此標籤似乎已消失。所以使用scale_x_continuous會產生正確的標籤。

編輯:

所以,一個完整的例子看起來像這樣

library(ggplot2) 
df <- data.frame(EventDT = as.POSIXct(c("2014-11-22 07:41:00", "2015-02-24 08:10:00", 
             "2015-06-10 13:54:00", "2015-07-11 02:43:00", 
             "2015-08-31 19:08:00", "2014-11-18 14:06:00", 
             "2015-06-09 23:10:00", "2016-02-29 07:55:00", 
             "2016-05-22 04:30:00", "2016-05-25 21:46:00", 
             "2014-12-22 16:19:00", "2015-05-13 16:38:00", 
             "2015-06-01 09:05:00", "2016-02-21 02:30:00", 
             "2016-05-13 01:36:00")), 
       EventNBR = rep(1:5, 3), 
       Group = c(rep('A', 5), rep('B',5), rep('C',5)), 
       Y = c(15.818750, 94.020139, 106.238889, 30.534028, 51.684028, 
         187.670139, 203.377778, 264.364583, 82.857639, 3.719444, 
         169.829861, 142.013194, 18.685417, 264.725694,81.962500)) 

df$id <- 1:nrow(df) 

g <- ggplot(df, aes(x=id, y=Y)) + 
    geom_point() + 
    geom_line() + 
    facet_wrap(~ Group, scales='free_x') 
g + scale_x_continuous(breaks=df$id, labels=df$EventDT) + 
    theme(axis.text.x=element_text(angle=90, vjust=.5)) 

,併產生以下的輸出:

result

+0

啊,我說話很快就解決這個。 EventDT列不是多面的,而是在三個方面逐字地再現,即,組B和C都標有組A的EventDT。 –

+0

@f_lost不在我的情況。我會添加一張圖片和一個完整的例子。 – drmariod

+0

謝謝,現在這個適合我。我昨天肯定會無意中改變了一些事情,讓我感到奇怪的行爲。 –