2017-02-03 5 views
0

Как может ggplot быть автоматизирован (в функции?), Чтобы можно было выбрать столбцы для построения графика. то есть: учитывая следующие данные:как автоматизировать графики ggplot в функции? - R

DT <- data.frame(y=seq(0,10,1),x=seq(0,20,2),z=seq(0,30,3)) 

Я хотел бы, например: во-первых, участок Y против X, а затем Y против Z Я пробовал (простой) код ниже, но не успех:

fun<- function (y,x){ 
    Yaxis=paste(y) 
    Xaxis=paste(x) 

    Plot <- ggplot() + geom_point(data = DT, 
          aes(x=Yaxis, y=Xaxis)) 
return(Plot) 
} 
fun("y","x") 
fun("y","z") 
+1

Посмотрите в нестандартную оценку для ggplot2,? Aes_string должно помочь тоже. – Haboryme

ответ

0

Вы имеете в виду что-то вроде этого?

# create the dataset 
DT <- data.frame(y=seq(0,10,1),x=seq(0,20,2),z=seq(0,30,3)) 

# plot data as categorical 
fun<- function (df, xaxis, yaxis){ 
    # convert numeric to character 
    Yaxis=paste(df[, yaxis]) 
    Xaxis=paste(df[, xaxis]) 
    # create the plot object 
    Plot <- ggplot() + geom_point(data = df, 
           aes(x=Yaxis, y=Xaxis)) 
    # plot it 
    return(Plot) 
} 
# plot y on horizontal, x on vertical 
fun(DT,"y","x") 
fun(DT,"y","z") 

# plot data as numeric 
fun2 <- function (df, xaxis, yaxis){ 
    Yaxis=df[, yaxis] 
    Xaxis=df[, xaxis] 

    Plot <- ggplot() + geom_point(data = df, 
           aes(x=Yaxis, y=Xaxis)) 
    return(Plot) 
} 
# plot y on horizontal, x on vertical 
fun2(DT,"y","x") 
# plot y on horizontal, z on vertical 
fun2(DT,"y","z") 

Вы можете явно настроить сюжет дальше, создавая гибкое название, оси и т.д.

этой заметку
+1

Нет необходимости создавать новые переменные, такие как 'Yaxis', просто используйте' aes_string', чтобы передать 'xaxis' прямо в' ggplot2'. –

+0

Достаточно честный, я, вероятно, немного смутился благодаря использованию 'paste' в коде и не хотел его полностью удалять. Вы правы, что функция может быть улучшена. Но я думаю, что это все еще показывает, как обернуть ggplot в собственную функцию, чтобы упростить вызов. – ira

+0

Уважаемые @Paul и @Ira, большое спасибо ... действительно, 'aes_string' отлично работает ... Я пропустил эту команду cheers – Rui