ggplot2 선 그림에 범례 추가
ggplot2의 전설에 대해 질문이 있습니다.같은 그래프에 세 개의 선을 그려 넣었는데 세 가지 색상이 사용된 범례를 추가하려고 합니다.사용된 코드입니다.
library(ggplot2)
## edit from original post - removed lines that downloaded data from broken link. Data snippet now below.
## Here a subset as used by [Brian Diggs in their answer](https://stackoverflow.com/a/10355844/7941188)
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, y = TempMax, colour = "1")) +
geom_line(colour = "red") +
geom_line(aes(x = fecha, y = TempMedia, colour = "2"), colour = "green") +
geom_line(aes(x = fecha, y = TempMin, colour = "2"), colour = "blue") +
scale_y_continuous(limits = c(-10, 40)) +
scale_colour_manual(values = c("red", "green", "blue")) +
labs(title = "TITULO", x = NULL, y = "Temperatura (C)")
사용된 세 가지 색상과 변수 이름(TempMax, TempMedia 및 TempMin)이 포함된 범례를 추가하려고 합니다.난 시도했다.scale_colour_manual
정확한 방법을 찾을 수 없습니다.
@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")
저는 만약 제가 여러 개의 검으로 각각의 색을 지정한다면, 제가 잘못하고 있다는 것을 발견하는 경향이 있습니다.데이터를 표시하는 방법은 다음과 같습니다.
library(ggplot2)
library(tidyr)
dd_tidyr <- pivot_longer(datos, cols = -fecha, names_to = "Temperature")
남은 것은 간단한 ggplot 명령뿐입니다.
ggplot(dd_tidyr) +
geom_line(aes(x = fecha, y = value, colour = Temperature)) +
scale_colour_manual(values = c("red", "green", "blue"))
다른 방법으로 데이터를 재구성할 수 있습니다.대체된 방법은 이제 폐기된 {reshape2} 패키지를 사용하는 것입니다.
library(reshape2)
dd = melt(datos, id=c("fecha"))
저는 @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.cols
그리고.my.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
을 사용하는 다른 scale_color_identity
중요한 것은 각각의 색상 이름을 지정하는 것입니다.aes
각각의geom_line
에서.에서scale_color_identity
각 색상을 다음과 같이 언급할 수 있습니다.breaks
추니다합을 합니다.labels
다음과 .다음은 재현 가능한 예입니다.
library(ggplot2)
temp = ggplot(data = datos, aes(x = fecha)) +
geom_line(aes(y = TempMax, colour = "red")) +
geom_line(aes(y = TempMedia, colour = "green")) +
geom_line(aes(y = TempMin, colour = "blue")) +
labs(title="TITULO") +
ylab("Temperatura (C)") +
xlab(" ") +
scale_y_continuous(limits = c(-10,40)) +
scale_color_identity(name = '',
breaks = c('red', 'green', 'blue'),
labels = c("TempMax", "TempMedia", "TempMin"),
guide = 'legend')
temp
repref v2.0.2를 사용하여 2022-11-19에 생성됨
언급URL : https://stackoverflow.com/questions/10349206/add-legend-to-ggplot2-line-plot
'programing' 카테고리의 다른 글
드롭 테이블과 잘라내기 테이블의 차이점은 무엇입니까? (0) | 2023.06.30 |
---|---|
MySQL 인덱싱은 PHP를 통해 속도 효과가 없지만 PHP MyAdmin에서는 효과가 있습니다. (0) | 2023.06.30 |
java.sql.SQL 예외: ORA-03115: 지원되지 않는 네트워크 데이터 유형 또는 표현 (0) | 2023.06.30 |
Mockito는 @AutoWired Spring-Data Repository의 Spy를 생성할 수 없습니다. (0) | 2023.06.25 |
'Gravity Forms' 입력 버튼을 클릭할 때 jquery를 트리거합니다. (0) | 2023.06.25 |