2013-01-23 76 views
20

下面是幾乎完全符合我想要的圖形的示例代碼。根據下面定義的minor_breaks,我想添加的唯一東西是x軸上的刻度線(與主要刻度相同)。向ggplot2中的x軸添加次要勾號標記(不帶標籤)

df <- data.frame(x = c(1900,1950,2000), y = c(50,75,60)) 

p <- ggplot(df, aes(x=x, y=y)) 
    p + geom_line() + 
    scale_x_continuous(minor_breaks = seq(1900,2000,by=10), breaks = seq(1900,2000,by=50), limits = c(1900,2000), expand = c(0,0)) + 
    scale_y_continuous(breaks = c(20,40,60,80), limits = c(0,100)) + 
    theme(legend.position="none", panel.background = element_blank(), 
    axis.line = element_line(color='black'), panel.grid.minor = element_blank()) 

由於提前, --JT

+7

我已經看到了這個要求了很多次,都沒有看到一個很好的答案。我見過/使用的選項是1:使用次要網格線。 2:手動添加刻度標記..(有點痛苦的方法,但我可以設想一個未來的功能/包,可以做到這一點。) – N8TRO

+0

無恥的自我推銷:看到這個[答](http://stackoverflow.com/ a/34533473/2726564) – manimal

回答

18

這將做到這一點的確切實例:

scale_x_continuous(breaks= seq(1900,2000,by=10), 
        labels = c(1900, rep("",4), 1950, rep("",4), 2000), 
        limits = c(1900,2000), expand = c(0,0)) + 

這裏有一個功能,是不是防彈但工程插入空白標籤當開始和結束主要標籤與at參數的開始和結束值對齊時:

insert_minor <- function(major_labs, n_minor) {labs <- 
           c(sapply(major_labs, function(x) c(x, rep("", 4)))) 
           labs[1:(length(labs)-n_minor)]} 

測試:

p <- ggplot(df, aes(x=x, y=y)) 
    p + geom_line() + 
    scale_x_continuous(breaks= seq(1900,2000,by=10), 
        labels = insert_minor(seq(1900, 2000, by=50), 4), 
        limits = c(1900,2000), expand = c(0,0)) + 
    scale_y_continuous(breaks = c(20,40,60,80), limits = c(0,100)) + 
    theme(legend.position="none", panel.background = element_blank(), 
     axis.line = element_line(color='black'), panel.grid.minor = element_blank()) 
+0

謝謝迪文。這將爲我所做的工作。甚至沒有想到要有效地使它們具有空白標籤的所有主要刻度標記。 – JimmyT

+2

我猜想真正需要的是一個將空白插入到序列中的函數。可能是一個很好的後續問題。 –

+1

Re:將空白插入到一個序列中:[here's](http://stackoverflow.com/questions/34533472/insert-blanks-into-a-vector-for-eg-minor-tick-labels-in-r)我的請使用示例應用程序進行小標記標記 – manimal