Eu tenho um comando ggplot
ggplot( rates.by.groups, aes(x=name, y=rate, colour=majr, group=majr) )
dentro de uma função. Mas gostaria de poder usar um parâmetro da função para escolher a coluna a ser usada como cor e grupo. Ou seja, eu gostaria de algo assim
f <- function( column ) {
...
ggplot( rates.by.groups, aes(x=name, y=rate, colour= ??? , group=??? ) )
}
Para que a coluna usada no ggplot seja determinada pelo parâmetro. Por exemplo, para f ("majr"), obtemos o efeito de
ggplot( rates.by.groups, aes(x=name, y=rate, colour=majr, group=majr) )
mas para f ("gênero") temos o efeito de
ggplot( rates.by.groups, aes(x=name, y=rate, colour=gender, group=gender) )
Algumas coisas que tentei:
ggplot( rates.by.groups, aes(x=name, y=rate, colour= columnName , group=columnName ) )
não funcionou. Nem
e <- environment()
ggplot( rates.by.groups, aes(x=name, y=rate, colour= columnName , group=columnName ), environment=e )
aes_string(x = rates.by.groups$name...
e, de qualquer forma, você não precisa, pois já passou noggplot(data = rates.by.groups...
argumento. (O problema nesta questão )"column_name"
ou"column"
não funcionariaDas notas de lançamento de
ggplot2 V3.0.0
:A maneira idiomática agora seria converter em um símbolo a string que a variável contém, usando
sym()
(que é quase o mesmo que aliases de baseas.name()
/as.symbol()
) e tirar aspas usando!!
Simulando os dados do OP, podemos fazer:
Se preferirmos fornecer nomes brutos para a função, podemos fazer:
Funcionará com nomes também conhecidos como símbolos E com literais de string
Como Lionel diz sobre
ensym()
:Uma nota sobre
enquo()
enquo()
cita a expressão (não necessariamente um símbolo) alimentada para o argumento, ela não converte uma string literal em um símbolo, poisensym()
isso pode ser menos adaptado aqui, mas podemos fazer:fonte
aes()
fala sobreenquo()
ela, mas não funciona. E de quem já ouviu falarensym()
? BIGf2
, todos os quatro exemplos funcionam, assim como capturar o nome da coluna em uma variável (ou sejaaname <- "mjr"; f2(aname)
). Se eu adicionar código para manipular o quadro de dados usando,dplyr
ele tentará encontrar uma coluna usando o nome da variável e não a string no nome da variável. Em outras palavras, como façorates.by.groups %>% group_by(!!column)...
para trabalhar e ainda apoiar as três formas de chamadaf2
?ensym
é projetado para lidar com argumentos fornecidos como nomes e tolerar aspas em torno deles. Acredito que você gostaria de tratar o argumento como um nome e recorrer ao valor se o nome não for encontrado. Isso é realmente o que acontece comselect
, mas não comgroup_by
... É possível hackear, mas não é óbvio. Se for importante para você, acho que merece sua própria pergunta.select
egroup_by
esse provavelmente era o problema. Posso criar uma nova pergunta, mas preciso criar um exemplo simples e verificar se foi respondido. Posso postar se não.facet_grid
? Funciona com,facet_grid(cols = vars(!!column))
mas gera um erro comfacet_grid(~ !!column)
Tente usar em
aes_string
vez deaes
.fonte
Outra opção (
ggplot2 > 3.0.0
) é usar o pronome de avaliação tidy.data
para cortar a variável / coluna escolhida dorates.by.groups
quadro de dados.Criado em 04/04/2019 pelo pacote reprex (v0.2.1.9000)
fonte
Usar
aes_string
corrige esse problema, mas enfrenta um problema ao adicionar barras de errogeom_errorbar
. Abaixo está uma solução simples.Bônus, você também pode adicionar facetas ao seu gráfico usando estas linhas dentro do ggplot:
Este script foi modificado a partir desta postagem original: ggplot2 - Barras de erro usando uma função personalizada
fonte
Aqui está um exemplo extremamente simples.
Apenas faça duas coisas
!!
quando você usarfonte