Eu tenho uma pergunta sobre lendas no ggplot2. Consegui traçar três linhas no mesmo gráfico e quero adicionar uma legenda com as três cores usadas. Este é o código usado
library(ggplot2)
require(RCurl)
link<-getURL("https://dl.dropbox.com/s/ds5zp9jonznpuwb/dat.txt")
datos<- read.csv(textConnection(link),header=TRUE,sep=";")
datos$fecha <- as.POSIXct(datos[,1], format="%d/%m/%Y")
temp = ggplot(data=datos,aes(x=fecha, y=TempMax,colour="1")) +
geom_line(colour="red") + opts(title="TITULO") +
ylab("Temperatura (C)") + xlab(" ") +
scale_y_continuous(limits = c(-10,40)) +
geom_line(aes(x=fecha, y=TempMedia,colour="2"),colour="green") +
geom_line(aes(x=fecha, y=TempMin,colour="2"),colour="blue") +
scale_colour_manual(values=c("red","green","blue"))
temp
e a saída
Gostaria de adicionar uma legenda com as três cores usadas e o nome da variável (TempMax, TempMedia e TempMin). eu tentei
scale_colour_manual
mas não consegue encontrar o caminho exato.
Infelizmente, os dados originais foram excluídos do site vinculado e não puderam ser recuperados. Mas eles vieram de arquivos de dados meteo com este formato
"date","Tmax","Tmin","Tmed","Precip.diaria","Wmax","Wmed"
2000-07-31 00:00:00,-1.7,-1.7,-1.7,-99.9,20.4,20.4
2000-08-01 00:00:00,22.9,19,21.11,-99.9,6.3,2.83
2000-08-03 00:00:00,24.8,12.3,19.23,-99.9,6.8,3.87
2000-08-04 00:00:00,20.3,9.4,14.4,-99.9,8.3,5.29
2000-08-08 00:00:00,25.7,14.4,19.5,-99.9,7.9,3.22
2000-08-09 00:00:00,29.8,16.2,22.14,-99.9,8.5,3.27
2000-08-10 00:00:00,30,17.8,23.5,-99.9,7.7,3.61
2000-08-11 00:00:00,27.5,17,22.68,-99.9,8.8,3.85
2000-08-12 00:00:00,24,13.3,17.32,-99.9,8.4,3.49
Respostas:
Costumo descobrir que, se estou especificando cores individuais em vários geom's, estou fazendo errado. Aqui está como eu plotaria seus dados:
Tudo o que resta é um simples comando ggplot:
Gráfico de exemplo
fonte
Como o @Etienne perguntou como fazer isso sem derreter os dados (que geralmente é o método preferido, mas reconheço que pode haver alguns casos em que isso não é possível), apresento a seguinte alternativa.
Comece com um subconjunto dos dados originais:
Você pode obter o efeito desejado por (e isso também limpa o código de plotagem original):
A idéia é que cada linha receba uma cor mapeando a
colour
estética para uma sequência constante. Escolher a sequência que é o que você deseja que apareça na legenda é a mais fácil. O fato de que, nesse caso, é o mesmo que o nome day
variável que está sendo plotada não é significativo; poderia ser qualquer conjunto de strings. É muito importante que isso esteja dentro daaes
chamada; você está criando um mapeamento para essa "variável".scale_colour_manual
agora pode mapear essas seqüências de caracteres para as cores apropriadas. O resultado éEm alguns casos, o mapeamento entre os níveis e as cores precisa ser explicitado, nomeando os valores na escala manual (obrigado a @DaveRGP por apontar isso):
(fornecendo a mesma figura de antes). Com valores nomeados, as quebras podem ser usadas para definir a ordem na legenda e qualquer ordem pode ser usada nos valores.
fonte
scale_colour_manual("", values = c("TempMax" = "red", "TempMedia" = "green", "TempMin" = "blue"))
que TempMax, TempMedia e TempMin são especificados como argumento de cores, como na resposta acima.Eu realmente gosto da solução proposta por @Brian Diggs. No entanto, no meu caso, crio os gráficos de linha em um loop, em vez de explicitamente, porque não sei a priori quantos gráficos terei. Quando tentei adaptar o código do @ Brian, tive alguns problemas ao lidar com as cores corretamente. Aconteceu que eu precisava modificar as funções estéticas. Caso alguém tenha o mesmo problema, aqui está o código que funcionou para mim.
Eu usei o mesmo quadro de dados que @Brian:
No meu caso, eu giro
my.cols
emy.names
dinamicamente, mas não quero tornar as coisas desnecessariamente complicadas, por isso dou explicitamente aqui. Essas três linhas facilitam a ordenação da legenda e a atribuição de cores.E aqui está o enredo:
fonte
ggplot
esperado.