Как использовать переменную для указания имени столбца в ggplot
У меня есть команда ggplot
ggplot( rates.by.groups, aes(x=name, y=rate, colour=majr, group=majr) )
внутри функции. Но я хотел бы иметь возможность использовать параметр функции, чтобы выбрать столбец для использования в качестве цвета и группы. Т.е. хотелось бы что то подобное
f <- function( column ) {
...
ggplot( rates.by.groups, aes(x=name, y=rate, colour= ??? , group=??? ) )
}
Так что столбец, используемый в ggplot, определяется параметром. Например, для f("majr") мы получаем эффект
ggplot( rates.by.groups, aes(x=name, y=rate, colour=majr, group=majr) )
но для f ("пол") мы получаем эффект
ggplot( rates.by.groups, aes(x=name, y=rate, colour=gender, group=gender) )
Некоторые вещи, которые я пробовал:
ggplot( rates.by.groups, aes(x=name, y=rate, colour= columnName , group=columnName ) )
не работал. Не сделал
e <- environment()
ggplot( rates.by.groups, aes(x=name, y=rate, colour= columnName , group=columnName ), environment=e )
3 ответа
Ты можешь использовать aes_string
:
f <- function( column ) {
...
ggplot( rates.by.groups, aes_string(x="name", y="rate", colour= column,
group=column ) )
}
до тех пор, пока вы передаете столбец функции в виде строки (f("majr")
скорее, чем f(majr)
). Также обратите внимание, что мы изменили другие столбцы, "name"
а также "rate"
, чтобы быть строк.
Если по какой-либо причине вы не хотите использовать aes_string
Вы можете изменить его на (несколько более громоздкий):
ggplot( rates.by.groups, aes(x=name, y=rate, colour= get(column),
group=get(column) ) )
Из заметок о выпуске ggplot2 V3.0.0
:
aes () теперь поддерживает квазиквотацию, так что вы можете использовать!!,!!! и:=. Это заменяет aes_() и aes_string(), которые теперь мягко осуждаются (но останутся в течение долгого времени).
Теперь идиоматическим способом было бы преобразовать в символ строку, содержащуюся в переменной, используя ensym
и закройте его, используя кавычки !!
Имитация данных ОП мы можем сделать:
library(tidyverse)
rates.by.groups <- data.frame(
name = LETTERS[1:3],
rate = 1:3,
mjr = LETTERS[c(4,4,5)],
gender = c("M","F","F")
)
f <- function(column) {
ggplot(rates.by.groups,
aes(x = name,
y = rate,
fill = !!ensym(column),
group = !!ensym(column))) +
geom_fill()
}
f("gender")
f("mjr")
Если бы мы предпочли передать необработанные имена в функцию, которую мы можем сделать:
f2 <- function(column) {
column <- enquo(column)
ggplot(rates.by.groups,
aes(x = name,
y = rate,
fill = !!column,
group = !!column)) +
geom_fill()
}
f2(gender)
f2(mjr)
Другой вариант (ggplot2 > 3.0.0
) использовать чистое местоимение .data
вырезать выбранную переменную / столбец из rates.by.groups
фрейм данных.
library(ggplot2)
theme_set(theme_classic(base_size = 14))
# created by @Moody_Mudskipper
rates.by.groups <- data.frame(
name = LETTERS[1:3],
rate = 1:3,
mjr = LETTERS[c(4, 4, 5)],
gender = c("M", "F", "F")
)
f1 <- function(df, column) {
gg <- ggplot(df,
aes(x = name,
y = rate,
fill = .data[[column]],
group = .data[[column]])) +
geom_col() +
labs(fill = column)
return(gg)
}
plot_list <- lapply(list("gender", "mjr"), function(x){ f1(rates.by.groups, x) })
plot_list
#> [[1]]
#>
#> [[2]]
# combine all plots
library(egg)
ggarrange(plots = plot_list,
nrow = 2,
labels = c('A)', 'B)'))
Создано 2019-04-04 пакетом представлением (v0.2.1.9000)
Вот очень простой пример.
Просто сделай две вещи
- Превратите строку в символ
- добавлять
!!
когда вы используете это
select_col <- sym("Petal.Length")
iris %>%
ggplot(aes(x = Sepal.Length, y = !!select_col)) +
geom_point()
С помощью aes_string
устраняет эту проблему, но сталкивается с проблемой при добавлении полос ошибок geom_errorbar
. Ниже представлено простое решение.
#Identify your variables using the names of your columns indie your dataset
xaxis <- "Independent"
yaxis <- "Dependent"
sd <- "error"
#Specify error bar range (in 'a-b' not 'a'-'b')
range <- c(yaxis, sd) #using c(X, y) allows use of quotation marks inside formula
yerrbar <- aes_string(ymin=paste(range, collapse='-'),
ymax=paste(range, collapse='+'))
#Build the plot
ggplot(data=Dataset, aes_string(x=xaxis, y=yaxis)) +
geom_errorbar(mapping=yerrbar, width=15, colour="#73777a", size = 0.5) +
geom_point (shape=21)
Бонус, вы также можете добавить грани к своему графику, используя эти строки внутри ggplot:
facet_grid(formula(paste(Variable1, "~", Variable2)))
Этот сценарий был изменен из исходного сообщения: ggplot2 - панели ошибок с использованием пользовательской функции