2015-09-16 2 views
2

В принципе, я хочу написать функцию, которая работает в типичном стиле ggplot, где вы просто «добавляете» его, используя оператор +. Теперь у меня есть следующее:Преобразование функции в функцию ggplot

Чтобы сделать это воспроизводимым, я сохранил следующее изображение в виде png в свой рабочий каталог и использовал mtcars для данных графика.

https://en.wikipedia.org/wiki/File:Chevypnglogo.png

library(png) 
library(ggplot2) 
library(grid) 

logo <- readPNG(
    source = 'Chevypnglogo.png' 
) 
logo_grob <- rasterGrob(logo, interpolate = TRUE) 
add_logo <- function(g, logo) { 
    y.range <- ggplot_build(g)$panel$ranges[[1]]$y.range 
    y.space <- (y.range[2] - y.range[1])/100 
    height <- (y.range[2] - y.range[1])/10 

    x.range <- ggplot_build(g)$panel$ranges[[1]]$x.range 
    x.space <- (x.range[2] - x.range[1])/100 
    width <- (x.range[2] - x.range[1])/10 

    g <- g + annotation_custom(
    logo, 
    xmin = x.range[1] + x.space, xmax = x.range[1] + width, 
    ymin = y.range[2] - height, ymax = y.range[2] - y.space 
) 
} 

test.plot <- ggplot(mtcars, aes(x = wt, y = mpg)) + 
    geom_point() 
test.plot <- add_logo(test.plot, logo_grob) 

То, что я действительно хотел бы быть в состоянии сделать это:

test.plot <- ggplot(mtcars, aes(x = wt, y = mpg)) + 
    geom_point() + 
    add_logo(logo_grob) 

Кто-нибудь знает, как изменить мой код, чтобы сделать это возможным?

+0

Просто обратите внимание, что у вас есть изображение в другом формате, чем в коде. У вас есть 'jpg' на ссылке и' png' в коде. Кроме того, не могли бы вы включить библиотеки, которые вы используете, чтобы кто-нибудь мог воспроизвести ваш код? –

+0

Хорошо, я посмотрю, смогу ли найти png. По какой-то причине пользовательское сохранение в виде png не работает в моем коде. –

+0

Я неправильно понял вопрос. Если вам понадобится вычисленный диапазон ggplot2/etc для создания графика, вам нужно будет написать это как «Geom», и это будет намного проще в dev-версии ggplot2 на github. – hrbrmstr

ответ

0
#How about: 

#Test data 
logo <- readPNG(source = 'Chevypnglogo.png') 
logo_grob <- rasterGrob(logo, interpolate=T) 

#The function 
add_logo <- function(g, logo) { 

    y.range <- ggplot_build(g)$panel$ranges[[1]]$y.range 
    y.space <- (y.range[2] - y.range[1])/100 
    height <- (y.range[2] - y.range[1])/10 

    x.range <- ggplot_build(g)$panel$ranges[[1]]$x.range 
    x.space <- (x.range[2] - x.range[1])/100 
    width <- (x.range[2] - x.range[1])/10 

    #Create annotation and wrap it in list() 
    my_anot <- list(annotation_custom(logo, 
        xmin = x.range[1] + x.space, xmax = x.range[1] + width, 
        ymin = y.range[2] - height, ymax = y.range[2] - y.space)) 
    return(my_anot) 
} 

#Test 
test.plot <- ggplot(mtcars, aes(x = wt, y = mpg)) + geom_point() 
test.plot <- test.plot + add_logo(g=test.plot, logo_grob) 
+0

Это может работать так, как вы его создали, но все равно нужно выполнить два назначения. Я надеялся на решение, которое только назначает test.plot один раз. –

Смежные вопросы