2015-03-18 3 views
1

Я хочу создать динамические значения ylim в ggplot, чтобы параметр ylim ссылался на значение, которое dplyr предоставляет через трубу. Чтобы проиллюстрировать проблему, см. Рабочий (не общий) код, который я хочу изменить на (не работающий общий) код.Динамический ylim в ggplot2 с использованием трубы dplyr

require(dplyr) 
require(scales) 
require(ggplot2) 

x <- data.frame(name = c("A","B","C"), 
       value = c(2,4,6)) 

работает необщего код:

arrange(x[1:2, ], value) %>% 
    ggplot(data=., aes(x=factor(name), y=value)) + 
    geom_bar(stat="identity") + 
    scale_y_continuous(labels=comma, 
        limits=c(0,max(arrange(x[1:2, ], value)$value) * 1.1)) 

не работает общий код (вызов не находит значение):

arrange(x[1:2, ], value) %>% 
    ggplot(data=., aes(x=factor(name), y=value)) + 
    geom_bar(stat="identity") + 
    scale_y_continuous(labels=comma, 
        limits=c(0,max(value) * 1.1)) 

Таким образом, вопрос, есть ли способ установить пределы, обычно составляющие часть после аранжировки, всегда будут одинаковыми (мне нужно создать много одинаковых графов с разными x, т.е. разными пределами). Спасибо!

ответ

1

Вы можете построить фиктивную точку с нулевым размером при своих предельных значениях. Это не особенно красивое решение, но оно выглядит довольно гибким. Код будет выглядеть так:

arrange(x[1:2, ], value) %>% 
    ggplot(data=., aes(x=factor(name), y=value)) + 
    geom_bar(stat="identity") + 
    geom_point(aes(x=c(name[1], name[1]), y = c(0, max(value)*1.1)), size=0) + 
    scale_y_continuous(labels=comma) 
+0

Это приятное обходное решение, хотя я еще не думал о каких-либо недостатках. Одна вещь, с которой я все еще сталкиваюсь в этом решении, заключается в том, что в моих таблицах не всегда есть столбец с именем «имя». Это всегда будет что-то другое, например. имя1, имя2 и т. д. – Triamus

5

Если вы можете жить с помощью <<-, а также не прочь использовать одну дополнительную переменную, следующий будет сохранить трубопровод и дать вам динамический ylim:

max_val <- 0 
arrange(x[1:2, ], value) %>% 
{ max_val <<- max(.$value) 
. } %>% 
    ggplot(data=., aes(x=factor(name), y=value)) + 
    geom_bar(stat="identity") + 
    scale_y_continuous(labels=comma, 
        limits=c(0, max_val * 1.1)) 
+0

Есть ли способ присвоить «max_val <- 0» только один раз, а не перед каждым вызовом ggplot? – Triamus

+2

Да. Если вы определите его в верхней части вашего скрипта, он будет находиться в пространстве имен/среде (что все, что действительно имеет значение для '<< -' для работы), тогда каждый раз, когда блок '{}' выполняется в любом канале он просто назначит эту переменную с областью. Не нужно делать '<- 0' каждый раз. – hrbrmstr

0

Если вы звоните max(x$value[1,2]) вы можете избежать ggplot работает, чтобы проанализировать arg до max(). Также ваш код не объясняет comma, поэтому я оставил его вне ответа.

arrange(x[1:2, ], value) %>%  
    ggplot(data=., aes(x=factor(name), y=value)) + 
    geom_bar(stat="identity") + 
    scale_y_continuous(limits=c(0,max(x$value[1:2])) * 1.1) 
+0

Я не уверен, что понимаю этот ответ. Идея заключалась в том, чтобы получить «x» из scale_y_continue call? – Triamus

+0

независимо от того, что вы делаете с подмножеством x в вызове 'arr()', используйте одно и то же подмножество в вызове 'max()'. – PeterK