Como você pede especificamente o eixo ggplot2 x em vez da ordem alfabética?

Eu estou tentando fazer um heatmap usando ggplot2 usando a function geom_tiles aqui está o meu código abaixo:

 p<-ggplot(data,aes(Treatment,organisms))+geom_tile(aes(fill=S))+ scale_fill_gradient(low = "black",high = "red") + scale_x_discrete(expand = c(0, 0)) + scale_y_discrete(expand = c(0, 0)) + theme(legend.position = "right", axis.ticks = element_blank(), axis.text.x = element_text(size = base_size, angle = 90, hjust = 0, colour = "black"), axis.text.y = element_text(size = base_size, hjust = 1, colour = "black")). 

data é meu arquivo data.csv
meu eixo X é tipos de tratamento
meu eixo Y é tipos de organismos

Não estou muito familiarizado com comandos e programação e sou relativamente novo nisso. Eu só quero poder especificar a ordem dos labels no eixo x. Neste caso, estou tentando especificar a ordem de “Tratamento”. Por padrão, ele ordena alfabeticamente. Como faço para replace isso / manter os dados na mesma ordem que no meu arquivo csv original?

Eu tentei este comando

 scale_x_discrete(limits=c("Y","X","Z")) 

onde x, yez são minha ordem de condição de tratamento. No entanto, não funciona muito bem e dá-me falta de checkboxs de calor.

É um pouco difícil responder à sua pergunta específica sem um exemplo completo e reproduzível. No entanto, algo como isto deve funcionar:

 #Turn your 'treatment' column into a character vector data$Treatment < - as.character(data$Treatment) #Then turn it back into a factor with the levels in the correct order data$Treatment <- factor(data$Treatment, levels=unique(data$Treatment)) 

Neste exemplo, a ordem do fator será a mesma do arquivo data.csv .

Se preferir um pedido diferente, você pode encomendá-lo manualmente:

 data$Treatment < - factor(data$Treatment, levels=c("Y", "X", "Z")) 

No entanto, isso é perigoso se você tiver muitos níveis: se você errar algum deles, isso causará problemas.

Tropeçou nesta resposta por causa de uma questão duplicada atual. A resposta mais aceita oferece uma solução que requer a alteração do quadro de dados subjacente. Isso não é necessário. Também é possível simplesmente fatorizar dentro da chamada aes () diretamente ou criar um vetor para isso.

Isso certamente não é muito diferente da resposta de @Drew Steen, mas com a importante diferença de não mudar o quadro de dados original.

 level_order < - c('virginica', 'versicolor', 'setosa') #this vector might be useful for other plots/analyses ggplot(iris, aes(x = factor(Species, level = level_order), y = Petal.Width)) + geom_col() 

ou

 level_order < - factor(iris$Species, level = c('virginica', 'versicolor', 'setosa')) ggplot(iris, aes(x = level_order, y = Petal.Width)) + geom_col() 

edit : ou diretamente na chamada aes () sem um vetor pré-criado:

 ggplot(iris, aes(x = factor(Species, level = c('virginica', 'versicolor', 'setosa')), y = Petal.Width)) + geom_col() 

isso é para a primeira versão