Eu usei o seguinte ggplot
comando:
ggplot(survey, aes(x = age)) + stat_bin(aes(n = nrow(h3), y = ..count.. / n), binwidth = 10)
+ scale_y_continuous(formatter = "percent", breaks = c(0, 0.1, 0.2))
+ facet_grid(hospital ~ .)
+ theme(panel.background = theme_blank())
para produzir
Eu gostaria de alterar as facetas rótulos, no entanto, para algo mais curto (como Hosp 1
, Hosp 2
...), porque eles são muito longos agora e olhar apertado (aumentando a altura do gráfico não é uma opção, que seria necessário muito espaço em o documento). Eu olhei para a página de ajuda facet_grid , mas não consigo descobrir como.
ggplot(transform(iris, Species = c("S", "Ve", "Vi")[as.numeric(Species)]), aes(Petal.Length)) + stat_bin() + facet_grid(Species ~ .)
levels(x$measurements) <- c(bquote(Area ~~ (cm^2)), bquote(Length ~~ (cm)))
) , ele não aparecerá na expressão matemática. Como mostrar expressões como rótulos de faceta?labeller
opção parafacet_grid
: stackoverflow.com/questions/37089052/…Aqui está uma solução que evita editar seus dados:
Digamos que seu plot seja facetado pela
group
parte do quadro de dados, que possui níveiscontrol, test1, test2
, e crie uma lista nomeada por esses valores:Em seguida, crie uma função 'rotuladora' e envie-a para sua chamada facet_grid:
Isso usa os níveis do quadro de dados para indexar a lista hospital_names, retornando os valores da lista (os nomes corretos).
Observe que isso só funciona se você tiver apenas uma variável de faceta. Se você tiver duas facetas, sua função de rotuladora precisará retornar um vetor de nome diferente para cada faceta. Você pode fazer isso com algo como:
Onde
facet1_names
efacet2_names
são listas predefinidas de nomes indexados pelos nomes de índice de faceta ('Hostpital # 1' etc.).Edit: O método acima falhará se você passar uma combinação de variável / valor que a etiquetadora não conhece. Você pode adicionar um fail-safe para variáveis desconhecidas como esta:
Resposta adaptada de como alterar as etiquetas strip.text no ggplot com faceta e margem = TRUE
edit: AVISO : se você estiver usando esse método para facetar uma coluna de caracteres , poderá estar recebendo rótulos incorretos. Veja este relatório de bug .corrigido nas versões recentes do ggplot2.fonte
Aqui está outra solução que está no espírito da dada por @ naught101, mas mais simples e também não lança um aviso sobre a versão mais recente do ggplot2.
Basicamente, você primeiro cria um vetor de caractere nomeado
E então você o usa como rotulador, apenas modificando a última linha do código fornecido por @ naught101 para
Espero que isto ajude.
fonte
as_labeller
? Encontrei algum código-fonte no repositório CRAN GitHub , mas após a atualização para a versão mais recente (no CRAN!), Parece que não tenho a função.hospital ~ gender
ou algo assim? Existe uma maneira de usar rotuladoras nos dois eixos? Não vejo nada óbvio nos documentos.Aqui está como eu fiz isso
facet_grid(yfacet~xfacet)
usando o ggplot2, versão 2.2.1:Observe que isso não contém uma chamada para
as_labeller()
- algo com o qual lutei por um tempo.Essa abordagem é inspirada no último exemplo da página de ajuda Coerce to labeller function .
fonte
setNames()
stackoverflow.com/a/22428439/3362993Se você tem duas facetas
hospital
eroom
deseja renomear apenas uma, pode usar:Para renomear duas facetas usando a abordagem baseada em vetores (como na resposta de naught101), você pode:
fonte
A maneira MAIS FÁCIL de alterar SEM modificar os dados subjacentes é:
1) Crie um objeto usando a
as_labeller
função adicionando a marca de retorno para cada um dos valores padrão :2) Adicionamos ao GGplot:
fonte
Observe que esta solução não funcionará bem, caso o ggplot mostre menos fatores do que a sua variável realmente contém (o que poderia acontecer se você estivesse, por exemplo, com um subconjunto):
Uma solução simples (além de adicionar todos os fatores não utilizados em names_li, o que pode ser entediante) é eliminar os fatores não utilizados com droplevels (), no conjunto de dados original ou na função labbeler, consulte:
fonte
Essa solução está muito próxima do que o @domi possui, mas foi projetada para encurtar o nome, buscando as primeiras 4 letras e o último número.
fonte
Ambos
facet_wrap
efacet_grid
também aceitam entrada deifelse
como argumento. Portanto, se a variável usada para lapidação for lógica, a solução será muito simples:Se a variável tiver mais categorias, a
ifelse
instrução precisará ser aninhada .Como efeito colateral, isso também permite que a criação dos grupos seja facetada na
ggplot
chamada.fonte
Adicionando outra solução semelhante à @ domi's com a análise de símbolos matemáticos, sobrescrito, subscrito, parênteses / colchete, .etc.
Criado em 30/03/2019 pelo pacote reprex (v0.2.1.9000)
fonte
Eu acho que todas as outras soluções são realmente úteis para fazer isso, mas há outra maneira.
Eu assumo:
dplyr
pacote, que possui omutate
comando conveniente , eseu conjunto de dados é nomeado
survey
.%>% de pesquisa mutada (Hosp1 = Hospital1, Hosp2 = Hospital2, ........)
Este comando ajuda a renomear colunas, mas todas as outras colunas são mantidas.
Então faça o mesmo
facet_wrap
, você está bem agora.fonte
A definição da função rotuladora com os
variable, value
argumentos não funcionaria para mim. Além disso, se você quiser usar a expressão, precisará usar lapply e não pode simplesmente usararr[val]
, pois o argumento para a função é um data.frame.Este código funcionou:
fonte
Desde que eu ainda não estou autorizado a comentar sobre as mensagens, eu estou postando isso separadamente como uma adenda à resposta de Vince e resposta de son520804 . Crédito vai para eles.
Usando o exemplo de íris de Vince e o código parcial de son520804, fiz isso com a função mutate e consegui uma solução fácil sem tocar no conjunto de dados original. O truque é criar um vetor de nome substituto e usar mutate () dentro do canal para corrigir temporariamente os nomes das facetas:
Neste exemplo, você pode ver que os níveis de i $ Species são temporariamente alterados para nomes comuns correspondentes contidos no vetor new_names. A linha que contém
pode ser facilmente removido para revelar a nomeação original.
Palavra de cautela: Isso pode facilmente introduzir erros nos nomes se o vetor new_name não estiver configurado corretamente. Provavelmente seria muito mais limpo usar uma função separada para substituir as seqüências de caracteres variáveis. Lembre-se de que o vetor new_name pode precisar ser repetido de diferentes maneiras para corresponder à ordem do seu conjunto de dados original. Por favor, verifique duas vezes e triplamente se isso foi alcançado corretamente.
fonte
new_names <- c('setosa' = 'Bristle-pointed iris', 'versicolor' = 'Poison flag iris', 'virginica' = 'Virginia iris')
e, em seguida, na mutação você pode criar uma nova coluna assim:mutate(Spec = new_names[Species])
Isso está funcionando para mim.
Defina um fator:
e use, em
ggplot()
:fonte
Apenas estendendo a resposta de naught101 - o crédito vai para ele
O que você precisa fazer é criar uma lista com mapeamento de nome para nome
e redefina
plot_labeller()
com novos argumentos padrão:E depois:
Como alternativa, você pode criar uma função dedicada para cada uma das alterações de etiqueta que deseja ter.
fonte
Eu tenho outra maneira de alcançar o mesmo objetivo sem alterar os dados subjacentes:
O que fiz acima foi alterar os rótulos do fator no quadro de dados original, e essa é a única diferença em comparação com o código original.
fonte
Você já tentou alterar os níveis específicos do seu
Hospital
vetor?fonte
Sinto que devo adicionar minha resposta a isso, porque demorei bastante para fazer isso funcionar:
Esta resposta é para você se:
bquote
) nos seus marcadores eBasicamente, coloquei os rótulos em um vetor nomeado para que os rótulos não ficassem confusos ou alternados. A
labeller
expressão provavelmente poderia ser mais simples, mas isso pelo menos funciona (as melhorias são muito bem-vindas). Observe o `(aspas) para proteger o fator de faceta.fonte
Solução simples ( daqui ):
fonte
Depois de lutar por um tempo, o que eu encontrei é que podemos usar
fct_relevel()
efct_recode()
deforcats
em conjunto para alterar a ordem das facetas assim corrigir os rótulos faceta. Não tenho certeza se é suportado pelo design, mas funciona! Confira os gráficos abaixo:Criado em 2020-02-16 pelo pacote reprex (v0.3.0)
fonte