2017-03-27 9 views
0

질문 : this으로 확장됩니다. 기본적으로 bty = "n" 길 ggplot2 그래프에 추가하고 싶습니다. 여기에 적절한 강조점이 있기 때문에 다른 질문에 대한 해결책은 내가 원하는 것,이 세부 사항을 제외하고 : enter image description here 축선이 진드기의 끝까지, 중간까지는 계속 될 것이라고 나는 그것을 원합니다. 첫째, 그래프 코드 :bty = "n"인 ggplot 또는 좌표 그리기에 그리드 좌표를 추가하는 방법

library(ggplot2) 
library(grid) 

graph = ggplot(faithful, aes(x=eruptions, y=waiting)) + 
    geom_point(shape=21) + 
    theme(
    # tick width, a bit exaggerated as example 
    axis.ticks = element_line(size = 5, color = "gray") 
    ) 
graph # graph with no axis lines 

# get axis limits 
gb = ggplot_build(graph) 
xLim = range(gb$layout$panel_ranges[[1]]$x.major_source) 
yLim = range(gb$layout$panel_ranges[[1]]$y.major_source) 

# add lines 
graph + 
    geom_segment(y = -Inf, yend = -Inf, x = xLim[1], xend = xLim[2]) + 
    geom_segment(x = -Inf, xend = -Inf, y = yLim[1], yend = yLim[2]) 

그래서 문제는 : 나는 90까지 50에서 x 축에 그려 단, 표시 점은 50와 90을 중심으로하는, 그러므로 그들이에 size = 5의 절반으로 확장 양쪽. ?element_line은 라인/테두리 크기가 기본적으로 mm임을 알려줍니다.

xLim = range(gb$layout$panel_ranges[[1]]$x.major_source) 
yLim = range(gb$layout$panel_ranges[[1]]$y.major_source) 

uType = "npc" 
uType2 = "mm" 

# attempt conversion of units 
xLim[1] = xLim[1] - convertWidth(unit(2.5, units = uType2), 
         unitTo = uType, valueOnly = TRUE) 
xLim[2] = xLim[2] + convertWidth(unit(2.5, units = uType2), 
         unitTo = uType, valueOnly = TRUE) 

yLim[1] = yLim[1] - convertHeight(unit(2.5, units = uType2), 
          unitTo = uType, valueOnly = TRUE) 
yLim[2] = yLim[2] - convertHeight(unit(2.5, units = uType2), 
          unitTo = uType, valueOnly = TRUE) 

# redraw graph  
cairo_pdf("Rplot.pdf") 
graph + 
    geom_segment(y = -Inf, yend = -Inf, x = xLim[1], xend = xLim[2]) + 
    geom_segment(x = -Inf, xend = -Inf, y = yLim[1], yend = yLim[2]) 
dev.off() 

하지만 아무런 행운 : 나는 다음 (많은 변화) 시도 90 + 5mm/2까지 5mm/2 - 따라서 나는 50 선을 그어야 할. 어떤 아이디어?

답변

1

이 작업을 수행하려면 그리기 시간에 단위 계산을 수행하기 위해 drawDetails 메소드 또는 이와 비슷한 메소드를 작성해야한다고 생각합니다.

또는 (아마도 더 쉬울 수도 있음) 축선을 덮기 위해 확장하는 사용자 정의 눈금 grob를 작성할 수 있습니다.

enter image description here

(두 축이 때문에 z 순서 IIRC 상이한 선폭을 갖고 있음에 유의 I 버그가 수정되었다고 생각).

library(ggplot2) 
library(grid) 


element_grob.element_custom_x <- function (element, x = 0:1, y = 0:1, colour = NULL, size = NULL, 
              linetype = NULL, lineend = "butt", default.units = "npc", id.lengths = NULL, 
              ...) 
{ 
    gp <- gpar(lwd = ggplot2:::len0_null(size * .pt), col = colour, lty = linetype, 
      lineend = lineend) 
    element_gp <- gpar(lwd = ggplot2:::len0_null(element$size * .pt), col = element$colour, 
        lty = element$linetype, lineend = element$lineend) 
    arrow <- if (is.logical(element$arrow) && !element$arrow) { 
    NULL 
    } 
    else { 
    element$arrow 
    } 
    g1 <- polylineGrob(x, y, default.units = default.units, 
        gp = utils::modifyList(element_gp, gp), 
        id.lengths = id.lengths, arrow = arrow, ...) 

    vertical <- length(unique(element$x)) == 1 && length(unique(element$y)) >= 1 

    g2 <- grid::editGrob(g1, y=y + unit(1,"mm"), gp=utils::modifyList(gp, list(col="green")), name="new") 

    grid::grobTree(g2, g1) 

} 


element_grob.element_custom_y <- function (element, x = 0:1, y = 0:1, colour = NULL, size = NULL, 
              linetype = NULL, lineend = "butt", default.units = "npc", id.lengths = NULL, 
              ...) 
{ 
    gp <- gpar(lwd = ggplot2:::len0_null(size * .pt), col = colour, lty = linetype, 
      lineend = lineend) 
    element_gp <- gpar(lwd = ggplot2:::len0_null(element$size * .pt), col = element$colour, 
        lty = element$linetype, lineend = element$lineend) 
    arrow <- if (is.logical(element$arrow) && !element$arrow) { 
    NULL 
    } 
    else { 
    element$arrow 
    } 
    g1 <- polylineGrob(x, y, default.units = default.units, 
        gp = utils::modifyList(element_gp, gp), 
        id.lengths = id.lengths, arrow = arrow, ...) 

    g2 <- grid::editGrob(g1, x=x + unit(1,"mm"), gp=utils::modifyList(gp, list(col="green")), name="new") 

    grid::grobTree(g2, g1) 

} 


## silly wrapper to fool ggplot2 
x_custom <- function(...){ 
    structure(
    list(...), # this ... information is not used, btw 
    class = c("element_custom_x","element_blank", "element") # inheritance test workaround 
) 

} 
y_custom <- function(...){ 
    structure(
    list(...), # this ... information is not used, btw 
    class = c("element_custom_y","element_blank", "element") # inheritance test workaround 
) 

} 

graph = ggplot(faithful, aes(x=eruptions, y=waiting)) + 
    geom_point(shape=21) + theme_minimal() + 
    theme(
    axis.ticks.x = x_custom(size = 5, colour = "red") , 
    axis.ticks.y = y_custom(size = 5, colour = "red") , 
    axis.ticks.length = unit(2,"mm") 
) 
graph # graph with no axis lines 
gb <- ggplot_build(graph) 
xLim = range(gb$layout$panel_ranges[[1]]$x.major_source) 
yLim = range(gb$layout$panel_ranges[[1]]$y.major_source) 


graph + 
    geom_segment(y = -Inf, yend = -Inf, x = xLim[1], xend = xLim[2],lwd=2) + 
    geom_segment(x = -Inf, xend = -Inf, y = yLim[1], yend = yLim[2],lwd=2)