2011-07-10 58 views
9

我正在繪製ggplot2中的值〜日期(R中)。我有以下代碼。正如你所看到的,ggplot2在我的數據中所增加的x軸上添加了更多的中斷。我只想每次在我的數據框中有一個數據點時都有x標籤。我如何強制ggplot2僅在my.dates的值處顯示中斷?似乎有對scale_x_dateggplot2和R中的scale_x_date的中斷

require(ggplot2) 
my.dates = as.Date(c("2011-07-22","2011-07-23", 
        "2011-07-24","2011-07-28","2011-07-29")) 
my.vals = c(5,6,8,7,3) 
my.data <- data.frame(date =my.dates, vals = my.vals) 
plot(my.dates, my.vals) 
p <- ggplot(data = my.data, aes(date,vals))+ geom_line(size = 1.5) 
p <- p + scale_x_date(format="%m/%d", ' ') 
p 
沒有「休息」的說法

enter image description here

回答

14

一種方法是治療x軸的數值,並設置休息和標籤美學與scale_x_continuous()

ggplot(my.data, aes(as.numeric(date), vals)) + 
    geom_line(size = 1.5) + 
    scale_x_continuous(breaks = as.numeric(my.data$date) 
        , labels = format(my.data$date, format = "%m/%d")) 

雖然7/24到7/28之間的間隔在我看來有點奇怪。但是,我認爲這就是你想要的?如果我誤解了,請告訴我。

EDIT

如上所述,我並不激動與突破了搜索的方式,特別是與在背景中的灰色網格。這裏有一種方法來維護矩形網格並只標記我們有數據的點。你可以在ggplot調用中完成這一切,但我認爲在ggplot之外進行處理更容易。首先,創建一個包含與日期對應的數字序列的向量。然後,我們將更新相應的標籤,並與" "更換NA條目,以防止任何從x軸這些條目被描繪:

xscale <- data.frame(breaks = seq(min(as.numeric(my.data$date)), max(as.numeric(my.data$date))) 
         , labels = NA) 

xscale$labels[xscale$breaks %in% as.numeric(my.data$date)] <- format(my.data$date, format = "%m/%d") 
xscale$labels[is.na(xscale$labels)] <- " " 

這給我們的東西,看起來像:

breaks labels 
1 15177 07/22 
2 15178 07/23 
3 15179 07/24 
4 15180  
5 15181  
6 15182  
7 15183 07/28 
8 15184 07/29 

然後可以傳遞給規模是這樣的:

scale_x_continuous(breaks = xscale$breaks, labels = xscale$labels)

+0

非常感謝。第一部分解決了我的問題。你有沒有機會知道我可以如何保持X軸斷裂,但刪除其網格線? – Mark

+2

@Mark - 'opts(panel.grid.major = theme_blank(),panel.grid.minor = theme_blank())'應該可以做到。 – Chase

+1

在'ggplot2 1.0.0'中拋出'錯誤:提供給連續標度的離散值'。 – MYaseen208