Editando rótulos de legenda (texto) no ggplot

120

Passei horas procurando na documentação e no StackOverflow, mas nenhuma solução parece resolver o meu problema. Ao usar, ggplotnão consigo obter o texto correto na legenda, mesmo que esteja no meu quadro de dados. Eu tentei scale_colour_manual, scale_fill_manualcom valores diferentes para labels=, como c("T999", "T888")", "cols".

Aqui está o meu código:

T999 <- runif(10, 100, 200)
T888 <- runif(10, 200, 300)
TY <- runif(10, 20, 30)
df <- data.frame(T999, T888, TY)


ggplot(data = df, aes(x=T999, y=TY, pointtype="T999")) + 
       geom_point(size = 15, colour = "darkblue") + 
       geom_point(data = df, aes(x=T888, y=TY), colour = 'red', size = 10 ) + 
       theme(axis.text.x = element_text(size = 20), axis.title.x =element_text(size = 20),   axis.text.y = element_text(size = 20)) +
       xlab("Txxx") + ylab("TY [°C]") + labs(title="temperatures", size = 15) + 
       scale_colour_manual(labels = c("T999", "T888"), values = c("darkblue", "red")) +    theme(legend.position="topright")

Ajuda seria muito apreciada!

user3633161
fonte
8
Dê uma olhada neste tutorial para descobrir com qual formato de dados ggplotestá mais satisfeito (longo, não amplo) e para ter uma idéia da diferença entre o mapeamento de uma aestética para uma variável na aeschamada e a configuração externa aes. Você precisa de meltseus dados para um formato longo e mapear colour(ou fill) aespara a variável relevante.
Henrik

Respostas:

145

O tutorial mencionado por Henrik é um excelente recurso para aprender a criar gráficos com o ggplot2pacote.

Um exemplo com seus dados:

# transforming the data from wide to long
library(reshape2)
dfm <- melt(df, id = "TY")

# creating a scatterplot
ggplot(data = dfm, aes(x = TY, y = value, color = variable)) + 
  geom_point(size=5) +
  labs(title = "Temperatures\n", x = "TY [°C]", y = "Txxx", color = "Legend Title\n") +
  scale_color_manual(labels = c("T999", "T888"), values = c("blue", "red")) +
  theme_bw() +
  theme(axis.text.x = element_text(size = 14), axis.title.x = element_text(size = 16),
        axis.text.y = element_text(size = 14), axis.title.y = element_text(size = 16),
        plot.title = element_text(size = 20, face = "bold", color = "darkgreen"))

isto resulta em:

insira a descrição da imagem aqui

Conforme mencionado por @ user2739472 nos comentários: Se você deseja alterar apenas os rótulos de texto da legenda e não as cores da paleta padrão do ggplot, pode usar em scale_color_hue(labels = c("T999", "T888"))vez de scale_color_manual().

Jaap
fonte
@Sathish Como você pode ver, o título do eixo y é menor que o título no eixo x. Os diferentes tamanhos são usados ​​para ilustrar as possibilidades e suas conseqüências. Portanto, o código usado na resposta está correto.
Jaap
@Sathish Adicionando ao meu comentário anterior: é certamente uma opção de fazê-lo dessa maneira! É tudo depende do que você quer alcançar ;-)
Jaap
9
Se você só quer mudar os rótulos lenda de texto e não as cores da paleta padrão de ggplot, você pode usar scale_color_hue(labels = c("T999", "T888"))em vez descale_color_manual()
user2739472
1
@ user2739472 Thx e verdadeiro. Vou adicioná-lo à minha resposta.
25416 Jaap
@Sathish I pouco tarde, mas corrigiu o erro de digitação agora :-)
Jaap
41

Os títulos das legendas podem ser rotulados por estética específica .

Isso pode ser alcançado usando as funções guides()ou labs()de ggplot2(mais aqui e aqui ). Permite adicionar propriedades de guia / legenda usando o mapeamento estético.

Aqui está um exemplo usando o mtcarsconjunto de dados e labs():

ggplot(mtcars, aes(x=mpg, y=disp, size=hp, col=as.factor(cyl), shape=as.factor(gear))) +
  geom_point() +
  labs(x="miles per gallon", y="displacement", size="horsepower", 
       col="# of cylinders", shape="# of gears")

insira a descrição da imagem aqui

Respondendo à pergunta do OP usando guides():

# transforming the data from wide to long
require(reshape2)
dfm <- melt(df, id="TY")

# creating a scatterplot
ggplot(data = dfm, aes(x=TY, y=value, color=variable)) + 
  geom_point(size=5) +
  labs(title="Temperatures\n", x="TY [°C]", y="Txxx") +
  scale_color_manual(labels = c("T999", "T888"), values = c("blue", "red")) +
  theme_bw() +
  guides(color=guide_legend("my title"))  # add guide properties by aesthetic

insira a descrição da imagem aqui

Megatron
fonte
Eu discordo disso. Ao especificar apenas o título, é mais fácil especificá-lo nos argumentos scale_ ..ou labs.
21416 Jaap
Eu estava comentando sobre sua solução de 15 minutos atrás, que adicionou o título a scale_color_manual(title="...", ...). Vejo que você o modificou para fazer referência à estética das cores labs(). Eu ofereço minha solução como alternativa.
Megatron
A partir de agora, isso parece modificar a legenda se for um gradiente de preenchimento mais absurdo.
Max Candocia