2017-02-23 282 views
0

Я использую aes_string() в функции для создания некоторых графиков. Я использую cowplot для theming, и это масштабирует оси до максимальных значений предоставленных данных, отсекая верхнюю или боковую точки точек в максимуме, как в примере ниже.Использовать переменные, переданные в aes_string() в других функциях ggplot.

Поэтому я хочу добавить 5% к максимальным данным для столбца, чтобы добавить небольшое пространство. Если бы я не писал функцию я мог бы сделать что-то вроде

scale_y_continuous(expand = c(0,0), 
         limits = c(0, max(y_var) * 1.05)) 

Однако, я не знаю, как сделать это с aes_string(). Может ли кто-нибудь объяснить, как это сделать с помощью aes_string()?

library(cowplot) 
library(ggplot2) 

fig_fun <- function(data, var){ 
    ggplot(data, aes_string(x = "wt", y = var)) + 
    geom_line() + 
    geom_point() + 
    scale_y_continuous(expand = c(0,0), 
         limits = c(0, NA)) 
} 

data("mtcars") 
p <- fig_fun(data = mtcars, var = "mpg") 
p 

current problem

+1

Не отправляйте 'expand = c (0, 0)', если вы хотите, чтобы ось расширялась. – Roland

+1

Можете ли вы не просто использовать 'max (data [, var])', чтобы получить максимум всех значений для переменной 'y'? Затем вы меняете это, как хотите. – niczky12

+0

@Roland, к сожалению, мне было наложено требование, чтобы ось x пересекала y в нуле, поэтому 'expand = c (0, 0)' –

ответ

2

Вы можете извлечь переменную y из данных внутри expand_limits и масштаб, что на 5%:

expand_limits(y = c(0, max(data[, var])*1.05)) 

Что делает:

fig_fun <- function(data, var){ 
    ggplot(data, aes_string(x = "wt", y = var)) + 
    geom_line() + 
    geom_point() + 
    expand_limits(y = c(0,max(data[, var])*1.05))) # picking the var column here 
} 

Вы будете необходимо дополнительно + scale_y_continuous(expand = c(0, 0)) имитировать эти числа.

Но, как предложили другие, если вы используете значение по умолчанию для expand параметра scale_y_continuous, вы получите то, что хотите. Таким образом, scale_y_continuous(expand = c(0, 0.1)) предоставит вам 10% дополнительного пространства от ваших границ оси y с обеих сторон. Документы: here.

Метод expand_limits по-прежнему полезен, если вы хотите получить более индивидуальные решения.

+0

ah, ну, я сделал 'пределы = c (0, max (data [, var]) * 1.05)' из-за требования пройти через нуль, как описано в вышеприведенном комментарии. Но, спасибо, это достало мне то, что мне было нужно. –

+0

Это не так, как работает аргумент 'expand'. Эти два числа являются мультипликативными и аддитивными константами для обоих концов. Поэтому, если вы захотите увеличить масштаб на 5%, вы должны дать 'c (0.05, 0)' (который уже по умолчанию). @ r.bot имеет правильное решение установки «пределов» (вместе с 'expand = c (0, 0)'). – Axeman

+0

@ Аксан, ты прав. Меня перепутали с 'expand_limits'. Измените ответ соответствующим образом. – niczky12