R에서 각각 고유 한 색상으로 여러 선 (데이터 시리즈) 플로팅
저는 R을 처음 접하고 다음과 같은 쿼리가 있습니다.
여러 줄 (데이터 시리즈)이있는 R에서 제품을 생성합니다. 이 라인은 각각 카테고리이며 고유 한 색상을 갖기를 원합니다.
현재 내 코드는 다음과 같이 설정됩니다.
먼저 빈 작성을 만듭니다.
plot(1,type='n',xlim=c(1,10),ylim=c(0,max_y),xlab='ID', ylab='Frequency')
그런 다음 각 카테고리에 대해 다음과 같이 "for"루프를 사용하여 빈 광고에 선을 그립니다.
for (category in categories){
lines(data.frame.for.this.category, type='o', col=sample(rainbow(10)), lwd=2)
}
여기에는 8 개의 범주가 있고 8 개의 선이 생성됩니다. 보시다시피 rainbows () 함수에서 색상을 샘플링하여 각 선에 대한 색상을 생성합니다.
그러나 여러 선이 있음을 알 수 있습니다. 예를 들어 8 개의 선 중 3 개는 녹색입니다.
이 8 개의 선 재고에 고유 한 색상을 지정해야합니까?
또한 전체의 범례 에이 고유성을 어떻게 반영합니까? legend()
함수 를 조회하려고 했지만 각 카테고리에 대해이 고유 한 개 색상을 반영하기 위해 사용해야하는 매개 변수가 명확하지 않습니까?
어떤 도움이나 제안도 대단히 감사하겠습니다.
데이터가 광범위한 형식 인 matplot
경우를 위해 만들어지고 다음 사항에 대해 종종 잊혀집니다.
dat <- matrix(runif(40,1,20),ncol=4) # make data
matplot(dat, type = c("b"),pch=1,col = 1:4) #plot
legend("topleft", legend = 1:4, col=1:4, pch=1) # optional legend
같은 것들에 익숙하지 않은 사람들을 위해 추가 개체도있다 ggplot
같은 음모를 꾸미고 매개 변수의 대부분 pch
등을 사용하여 동일 matplot()
로가 plot()
.
ggplot2
솔루션 을 원하는 경우 데이터를이 형식으로 만들 수 있습니다. (아래 예 참조).
# dummy data
set.seed(45)
df <- data.frame(x=rep(1:5, 9), val=sample(1:100, 45),
variable=rep(paste0("category", 1:9), each=5))
# plot
ggplot(data = df, aes(x=x, y=val)) + geom_line(aes(colour=variable))
기본 그래픽을 사용 하여이 작업을 수행하기위한 올바른 일반 전략이, 지적했듯이 기본적으로 R에게 각 10 개의 세트에서 임의의 색상을 선택하도록 지시합니다. 그 점을 감안할 때 모든 것이 같은 색의 두 줄이 있다는 것은 놀라운 일이 아닙니다. 다음은 기본 그래픽을 사용하는 예입니다.
plot(0,0,xlim = c(-10,10),ylim = c(-10,10),type = "n")
cl <- rainbow(5)
for (i in 1:5){
lines(-10:10,runif(21,-10,10),col = cl[i],type = 'b')
}
type = "n"
창을 설정하기위한 원래 호출에서 모든 플로팅을 금지하기 위해 의 사용 과 cl
for 루프 내부의 인덱싱을 유의하십시오 .
lines()
함수 를 사용하여 동일한 차트에 둘 이상의 선을 그릴 수 있습니다.
# Create the data for the chart.
v <- c(7,12,28,3,41)
t <- c(14,7,6,19,3)
# Give the chart file a name.
png(file = "line_chart_2_lines.jpg")
# Plot the bar chart.
plot(v,type = "o",col = "red", xlab = "Month", ylab = "Rain fall",
main = "Rain fall chart")
lines(t, type = "o", col = "blue")
# Save the file.
dev.off()
@Arun 더미 데이터 사용 :) 여기에 lattice
해결책이 있습니다.
xyplot(val~x,type=c('l','p'),groups= variable,data=df,auto.key=T)
@ joran의 대답 기본 사용 plot
로모그래퍼 기능을 for
루프, 당신은 할 수 있습니다 또한베이스를 사용 plot
하여lapply
:
plot(0,0,xlim = c(-10,10),ylim = c(-10,10),type = "n")
cl <- rainbow(5)
invisible(lapply(1:5, function(i) lines(-10:10,runif(21,-10,10),col = cl[i],type = 'b')))
- 여기서
invisible
함수는 단순히lapply
콘솔에서 목록 출력을 생성하는 것을 방지 하는 역할을 합니다 (우리가 원하는 것은 목록이 아니라 함수가 제공하는 재귀이기 때문입니다).
보시다시피 for
루프 접근 방식 을 사용하는 것과 똑같은 결과를 생성합니다 .
그렇다면 왜 사용 lapply
합니까?
비록 lapply
더 나은보다 / 더 빨리 수행하는 것으로 나타났다 for
R에 (예를 들어, 참조 여기에 , 비록 참조 여기 그렇지 않은 인스턴스에 대한)이 거의 같은 약 수행이 경우 :
lapply
및 for
접근 방식 모두에 대해 라인 수를 50000으로 늘리는 데 각각 시스템 46.3
과 46.55
몇 초가 걸렸습니다 .
- 따라서
lapply
약간 더 빠르지 만 무시할 수있는 수준이었습니다. 이 속도 차이는 더 크고 복잡한 그래프에 유용 할 수 있지만 솔직히 말하면 50000 개의 라인은 아마도 꽤 좋은 천장 일 것입니다.
그래서 "왜 lapply
?"에 대한 대답 은 똑같이 작동하는 대안적인 접근 방식입니다. :)
알아요, 답변해야 할 오래된 게시물이지만 같은 게시물을 검색하는 것처럼 다른 사람도 여기로 돌아갈 수 있습니다.
ggplot 함수에 다음을 추가하면 플롯에있는 그룹과 관련된 다른 색상의 선을 얻을 수 있습니다.
ggplot(data=Set6, aes(x=Semana, y=Net_Sales_in_pesos, group = Agencia_ID, colour = as.factor(Agencia_ID)))
과
geom_line()
다음은 관심이있는 경우 범례를 포함하는 샘플 코드입니다.
# First create an empty plot.
plot(1, type = 'n', xlim = c(xminp, xmaxp), ylim = c(0, 1),
xlab = "log transformed coverage", ylab = "frequency")
# Create a list of 22 colors to use for the lines.
cl <- rainbow(22)
# Now fill plot with the log transformed coverage data from the
# files one by one.
for(i in 1:length(data)) {
lines(density(log(data[[i]]$coverage)), col = cl[i])
plotcol[i] <- cl[i]
}
legend("topright", legend = c(list.files()), col = plotcol, lwd = 1,
cex = 0.5)
다음을 사용하여 줄을 추가하는 또 다른 방법은 다음과 같습니다 plot()
.
첫째, 기능 사용 par(new=T)
선택권:
http://cran.r-project.org/doc/contrib/Lemon-kickstart/kr_addat.html
색상을 다르게 지정하십시오 col()
.
축 설명을 불필요한 방지하려면 xaxt="n"
및 yaxt="n"
두-th 및 추가 플롯을 사용하십시오.
'ProgramingTip' 카테고리의 다른 글
Python의 for 루프에서 목록 요소를 제거하는 방법은 무엇입니까? (0) | 2020.11.29 |
---|---|
편집 할 수 없어야하는 EditText 안에 상수 텍스트 삽입 -Android (0) | 2020.11.29 |
NSUserDefaults에 NSMutablearray를 저장하는 방법 (0) | 2020.11.29 |
mysql 함수의 영숫자 텍스트에서 선행 0을 자르는 방법 (0) | 2020.11.29 |
동일한 파일에 여러 클래스를 사용하는 것이 나쁜 습관입니까? (0) | 2020.11.29 |