[r] ggplot2 라인 플롯에 범례 추가

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



답변

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

##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"))

플롯 예

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


답변

@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")


답변

@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

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


답변