2014-10-08 76 views
4

假设我有如下图“无单位”,定性,或相对轴标GGPLOT2

dat <- data.frame(x = 1:10, y = 1:10) 

ggplot(dat, aes(x=x, y=y)) + geom_point() 

但我不是在任一轴的数值2.5, 5, 7.5, 10真正感兴趣。我想标记的是“从低到高”。我知道我可以标记+ xlab("Low to High"),但我更愿意将“低”放在轴的最左侧(在原点下),将“高”放在最右边(在10.0之下) >高。我可以手动指定休息时间,但这似乎太过分了。

回答

8

像这样的东西可能会帮助,

dat <- data.frame(x = 1:10, y = 1:10) 

p <- ggplot(dat, aes(x=x, y=y)) + geom_point() + 
    scale_x_continuous('', breaks=NULL)+ 
    scale_y_continuous('', breaks=NULL) 

g <- ggplotGrob(p) 
library(gtable) 
library(grid) 

my_axis <- function(low="low", high="high", axis=c("x", "y"), ...){ 

    axis <- match.arg(axis) 

    if(axis == "x"){ 
    g1 <- textGrob(low, x=unit(0,"npc"), hjust=0) 
    g3 <- textGrob(high, x=unit(1,"npc"), hjust=1) 
    g2 <- segmentsGrob(grobWidth(g1) + unit(2,"mm"), unit(0.5,"npc"), 
       unit(1,"npc") - grobWidth(g3)- unit(2,"mm"), 
       unit(0.5,"npc"), ...) 

    } else if(axis == "y"){ 
    g1 <- textGrob(low, y=unit(0,"npc"), rot=90, hjust=0) 
    g3 <- textGrob(high, y=unit(1,"npc"), rot=90, hjust=1) 
    g2 <- segmentsGrob(unit(0.5,"npc"),grobHeight(g1) + unit(2,"mm"), 
         unit(0.5,"npc"), 
         unit(1,"npc") - grobHeight(g3)- unit(2,"mm"), 
         ...) 

    } 

    grobTree(g1,g2,g3) 
} 

g <- gtable_add_grob(g, my_axis(arrow=arrow(length=unit(2,"mm"))), 
        t=nrow(g)-2, b=nrow(g)-1, l=4) 
g <- gtable_add_grob(g, my_axis(axis="y", arrow=arrow(length=unit(2,"mm"))), 
        t=3, l=1,r=3) 
grid.newpage() 
grid.draw(g) 

enter image description here

+0

+1,但我必须在'textGrob'中手动指定水平位置。我更喜欢一个解决方案,其中'dat'值的更改不需要其他更改。 – Hugh 2014-10-08 23:34:14

+0

这些位置实际上是“npc”单位,又名“归一化父坐标”,也就是你想要的,我想。 – baptiste 2014-10-08 23:35:22

+0

你是对的,抱歉怀疑你! :P – Hugh 2014-10-08 23:39:27

0

作为替代方案,因为你没有问“低 - >高”,这里不涉及拆卸的选项情节

dat <- data.frame(x = 1:10, y = 1:10) 
low_to_high <- paste0("low ", paste0(rep("-", 35), collapse = ""), "> high") 

library(ggplot2) 
ggplot(dat, aes(x, y)) + 
    geom_point() + 
    labs(x = low_to_high, y = low_to_high) + 
    coord_equal() + 
    theme_bw() + 
    theme(axis.title = element_text(size=20), 
     axis.text = element_blank(), 
     axis.ticks = element_blank()) 

enter image description here

无可否认,所需的-数量会有所不同,需要根据您的地块大小进行调整,并且不如正确渲染的箭头那么漂亮。不过,这很快就会从头开始。