ggplot2 라인 플롯에 범례 추가


143

ggplot2의 범례에 대한 질문이 있습니다. 동일한 그래프에서 세 줄을 그릴 수 있었고 사용 된 세 가지 색상으로 범례를 추가하고 싶습니다. 이것은 사용 된 코드입니다

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

그리고 출력

ggplot 세 줄

사용 된 세 가지 색상과 변수 이름 (TempMax, TempMedia 및 TempMin)으로 범례를 추가하고 싶습니다. 나는 시도했다

scale_colour_manual

그러나 정확한 방법을 찾을 수 없습니다.

불행히도 원본 데이터는 연결된 사이트에서 삭제되어 복구 할 수 없습니다. 그러나 그들은이 형식의 기상 데이터 파일에서 나왔습니다.

"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

나는 여전히 전설이 줄거리의 다른 요소 (예 : 다른 geom_line)에 묶여있을 수 있는지 궁금합니다.
Etienne Low-Décarie

3 줄만 있다면 dirrectlabels 패키지를 보는 것이 좋습니다. (링크)
Tyler Rinker

@TylerRinker 이전에 다른 용도로 사용했지만 지금 csgillespie의 답변이 더 효과적입니다.
pacomet

@ EtienneLow-Décarie 당신은 할 수 있지만 일반적으로 그들이 다른 미학을 사용하는 경우에만 가능합니다. 예를 들어 한 줄 세트를 색상으로, 다른 줄 세트를 선 종류로 매핑합니다. 이 경우 일반적으로 각 데이터에 별도의 데이터를 전달합니다.
joran

답변:


82

여러 개의 기하학으로 개별 색상을 지정하면 잘못하고있는 것을 발견하는 경향이 있습니다. 데이터를 플로팅하는 방법은 다음과 같습니다.

##Subset the necessary columns
dd_sub = datos[,c(20, 2,3,5)]
##Then rearrange your data frame
library(reshape2)
dd = melt(dd_sub, id=c("fecha"))

남은 것은 간단한 ggplot 명령입니다.

ggplot(dd) + geom_line(aes(x=fecha, y=value, colour=variable)) +
  scale_colour_manual(values=c("red","green","blue"))

플롯 예

여기에 이미지 설명을 입력하십시오


87
나는 여전히 질문의 원래 목적이었던 geom_line과 같은 별도의 요소 추가와 관련된 범례를 추가하는 방법에 대해 여전히 궁금합니다.
Etienne Low-Décarie

202

@Etienne 은 데이터를 녹 이지 않고이 작업을 수행하는 방법을 물었 으므로 (일반적으로 선호되는 방법이지만 불가능한 경우가 있음을 알고 있음) 다음 대안을 제시합니다.

원래 데이터의 서브 세트로 시작하십시오.

datos <-
structure(list(fecha = structure(c(1317452400, 1317538800, 1317625200, 
1317711600, 1317798000, 1317884400, 1317970800, 1318057200, 1318143600, 
1318230000, 1318316400, 1318402800, 1318489200, 1318575600, 1318662000, 
1318748400, 1318834800, 1318921200, 1319007600, 1319094000), class = c("POSIXct", 
"POSIXt"), tzone = ""), TempMax = c(26.58, 27.78, 27.9, 27.44, 
30.9, 30.44, 27.57, 25.71, 25.98, 26.84, 33.58, 30.7, 31.3, 27.18, 
26.58, 26.18, 25.19, 24.19, 27.65, 23.92), TempMedia = c(22.88, 
22.87, 22.41, 21.63, 22.43, 22.29, 21.89, 20.52, 19.71, 20.73, 
23.51, 23.13, 22.95, 21.95, 21.91, 20.72, 20.45, 19.42, 19.97, 
19.61), TempMin = c(19.34, 19.14, 18.34, 17.49, 16.75, 16.75, 
16.88, 16.82, 14.82, 16.01, 16.88, 17.55, 16.75, 17.22, 19.01, 
16.95, 17.55, 15.21, 14.22, 16.42)), .Names = c("fecha", "TempMax", 
"TempMedia", "TempMin"), row.names = c(NA, 20L), class = "data.frame")

원하는 효과를 얻을 수 있습니다 (그리고 이것은 또한 원래의 플로팅 코드를 정리합니다) :

ggplot(data = datos, aes(x = fecha)) +
  geom_line(aes(y = TempMax, colour = "TempMax")) +
  geom_line(aes(y = TempMedia, colour = "TempMedia")) +
  geom_line(aes(y = TempMin, colour = "TempMin")) +
  scale_colour_manual("", 
                      breaks = c("TempMax", "TempMedia", "TempMin"),
                      values = c("red", "green", "blue")) +
  xlab(" ") +
  scale_y_continuous("Temperatura (C)", limits = c(-10,40)) + 
  labs(title="TITULO")

아이디어는 colour미적 요소를 상수 문자열 에 매핑하여 각 줄에 색상이 부여된다는 것입니다 . 범례에 표시하려는 문자열을 선택하는 것이 가장 쉽습니다. 이 경우 y플롯 되는 변수 의 이름과 동일하다는 사실 은 중요하지 않습니다. 문자열 집합이 될 수 있습니다. 이것이 aes통화 안에 있다는 것이 매우 중요합니다 . 이 "변수"에 대한 맵핑을 작성 중입니다.

scale_colour_manual이제이 문자열을 적절한 색상으로 매핑 할 수 있습니다. 결과는 여기에 이미지 설명을 입력하십시오

경우에 따라 수동 스케일의 값 이름을 지정하여 레벨과 색상 간의 매핑을 명시 적으로 만들어야 합니다 (이 점을 지적 하기 위해 @DaveRGP 덕분에 ).

ggplot(data = datos, aes(x = fecha)) +
  geom_line(aes(y = TempMax, colour = "TempMax")) +
  geom_line(aes(y = TempMedia, colour = "TempMedia")) +
  geom_line(aes(y = TempMin, colour = "TempMin")) +
  scale_colour_manual("", 
                      values = c("TempMedia"="green", "TempMax"="red", 
                                 "TempMin"="blue")) +
  xlab(" ") +
  scale_y_continuous("Temperatura (C)", limits = c(-10,40)) + 
  labs(title="TITULO")

(전과 같은 수치를 나타냄). 명명 된 값을 사용하면 나누기를 사용하여 범례에서 순서를 설정하고 모든 순서를 값에 사용할 수 있습니다.

ggplot(data = datos, aes(x = fecha)) +
  geom_line(aes(y = TempMax, colour = "TempMax")) +
  geom_line(aes(y = TempMedia, colour = "TempMedia")) +
  geom_line(aes(y = TempMin, colour = "TempMin")) +
  scale_colour_manual("", 
                      breaks = c("TempMedia", "TempMax", "TempMin"),
                      values = c("TempMedia"="green", "TempMax"="red", 
                                 "TempMin"="blue")) +
  xlab(" ") +
  scale_y_continuous("Temperatura (C)", limits = c(-10,40)) + 
  labs(title="TITULO")


2
나는이 솔루션을 좋아하지만 한계가 있다고 생각합니다. 'breaks'와 'values'변수의 매핑 사이에 알파벳 정렬 문제가 있습니까? TempM {a] x, TempM {e} dia 및 TempM {i} n은 깔끔하게 정렬되지만 변수 이름에 적용하면 색상이 순서 입력이 아닌 '중단'과 알파벳 순서로 일치하는 것처럼 보입니다. . 이것을 반영 / 고정하기 위해 위의 내용을 명확하게 / 정제 할 수 있습니까?
DaveRGP

3
이전에 구입 한 문제인 색상 순서에 대한 해결책을 찾았습니다. scale_colour_manual("", values = c("TempMax" = "red", "TempMedia" = "green", "TempMin" = "blue"))위의 답변에서와 같이 TempMax, TempMedia 및 TempMin이 색상 인수로 지정된 양식을 사용하십시오 .
DaveRGP

@DaveRGP ggplot의 버그로 간주 될 수 있습니까?
Alessandro Jacopson

1
@StellaBiderman 감사합니다. 이 답변이 5 년 후에도 (거의) 유용하다는 것을 아는 것이 좋습니다.
Brian Diggs

1
@BrianDiggs 당신은 선이 아닌 스케일로 점을 표시하는 방법을 알지 못합니까?
Stella Biderman

2

@Brian Diggs가 제안한 솔루션이 정말 좋습니다. 그러나 필자의 경우 몇 줄의 플롯을 미리 알지 못하기 때문에 선 플롯을 명시 적으로 제공하지 않고 루프로 선 플롯을 만듭니다. @Brian의 코드를 수정하려고 할 때 색상을 올바르게 처리하는 데 몇 가지 문제가 발생했습니다. 미적 기능을 수정해야한다는 것이 밝혀졌습니다. 누군가가 같은 문제가있는 경우, 여기 나를 위해 일한 코드가 있습니다.

@Brian과 동일한 데이터 프레임을 사용했습니다.

data <- structure(list(month = structure(c(1317452400, 1317538800, 1317625200, 1317711600, 
                                       1317798000, 1317884400, 1317970800, 1318057200, 
                                       1318143600, 1318230000, 1318316400, 1318402800, 
                                       1318489200, 1318575600, 1318662000, 1318748400, 
                                       1318834800, 1318921200, 1319007600, 1319094000), 
                                     class = c("POSIXct", "POSIXt"), tzone = ""),
                   TempMax = c(26.58, 27.78, 27.9, 27.44, 30.9, 30.44, 27.57, 25.71, 
                               25.98, 26.84, 33.58, 30.7, 31.3, 27.18, 26.58, 26.18, 
                               25.19, 24.19, 27.65, 23.92), 
                   TempMed = c(22.88, 22.87, 22.41, 21.63, 22.43, 22.29, 21.89, 20.52,
                                 19.71, 20.73, 23.51, 23.13, 22.95, 21.95, 21.91, 20.72, 
                                 20.45, 19.42, 19.97, 19.61), 
                   TempMin = c(19.34, 19.14, 18.34, 17.49, 16.75, 16.75, 16.88, 16.82, 
                               14.82, 16.01, 16.88, 17.55, 16.75, 17.22, 19.01, 16.95, 
                               17.55, 15.21, 14.22, 16.42)), 
              .Names = c("month", "TempMax", "TempMed", "TempMin"), 
              row.names = c(NA, 20L), class = "data.frame")  

내 경우에는 내가 생성 my.colsmy.names동적,하지만 난 여기에 명시 적으로 그들에게 줄 수 있도록 불필요하게 일을 복잡하게 만들고 싶어하지 않습니다. 이 세 줄로 범례의 순서를 정하고 색상을 쉽게 지정할 수 있습니다.

my.cols <- heat.colors(3, alpha=1)
my.names <- c("TempMin", "TempMed", "TempMax")
names(my.cols) <- my.names

그리고 여기 음모가 있습니다 :

p <-  ggplot(data, aes(x = month))

for (i in 1:3){
  p <- p + geom_line(aes_(y = as.name(names(data[i+1])), colour = 
colnames(data[i+1])))#as.character(my.names[i])))
}
p + scale_colour_manual("", 
                        breaks = as.character(my.names),
                        values = my.cols)
p

여기에 이미지 설명을 입력하십시오


2
이러한 복잡성으로 인해 데이터를 원하는 긴 형식으로 재구성하는 것이 훨씬 쉬워졌습니다 ggplot.
Axeman

1
@Brian이 게시 한 원래 답변과 비교할 때 복잡성을 추가한다고 생각하지 않습니다. 또한 일부 사람들은 데이터를 재구성하지 않고 데이터를 원할 수도 있습니다.
Justyna

...이 방법은 변수가 다른 기하 구조 (플롯 유형) 허용
MAC
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.