barcode

R 배워보기-8.1. ggplot2로 그래프 그리기 (하)

Coding/R

그래프 제목(ggtitle())

김후추씨의 조언대로 그래프를 만든 신입 데이터분석가. 그런데 문제가 하나 있다. 

"그래프에 제목을 넣고 싶은데... 어떻게 해야 할까요? "

 

> ggplot(data=data_siseol,aes(x=채소구분소분류,y=생산량.톤.,fill=채소구분소분류))+geom_bar(stat="identity")+ggtitle("제주도 시설재배 야채 생산량")

이렇게요. 

 

> ggplot(data=data_siseol,aes(x=채소구분소분류,y=생산량.톤.,fill=채소구분소분류))+geom_bar(stat="identity")+ggtitle("제주도 시설재배 야채 생산량")+theme(plot.title=element_text(lineheight=1.5,face="bold"))

물론 제목 글자 크기를 키워줄 수도 있는데... 아니 글꼴 지원 안해주냐고... 이럴거면 그냥 matplotlib 쓰자

 

> ggplot(data=data_siseol,aes(x=채소구분소분류,y=생산량.톤.,fill=채소구분소분류))+geom_bar(stat="identity")+ggtitle("제주도 시설재배 야채 생산량")+theme(plot.title=element_text(lineheight=1.5,face="bold"))+coord_flip()

아까도 말했지만 cooord_flip()을 쓰면 그래프가 눕는다. 아 라벨 깔끔하다 그졍 

 

> plot+scale_x_discrete(limits=c("딸기","방울토마토"))
경고메시지(들): 
Removed 42 rows containing missing values (position_stack).

과채류만 빼고싶다고요? 예 빼세요 

 

> plot+scale_x_discrete(limits=c("깻잎","상추"),labels=c("Lettuce","penilla leaf"))
경고메시지(들): 
Removed 42 rows containing missing values (position_stack).

어? 라벨 바꼈는데?

라벨도 바꿀 수 있다. 

 

> plot+scale_x_discrete(breaks=NULL)

축 모눈이 거슬리신다고요? 아 빼드렸습니다^^ 

 

bp + theme(axis.ticks = element_blank(), axis.text.x = element_blank())

이거는 선은 냅두고 축 라벨만 빼버린다. 

 

> plot+expand_limits(y=0)

세로축 한도를 바꾸고 싶으면 이걸로 하면 되고 

 

> plot+expand_limits(y=c(0,1500,3000,4500,6000,7500,9000,10500,12000))

이걸로 수동으로 간격 멕이거나 

 

> plot+ylim(0,12000)

이걸로 시작과 끝을 정해주되 등간격으로 먹일 수도 있다. 

 

> plot+coord_cartesian(ylim=c(1500,12000))

이렇게 표시 범위를 바꿀 수도 있다.

 

> plot+scale_y_reverse()

아, 물론 뒤집는것도 된다. 

 

> sp=ggplot(dat,aes(xval,yval))+geom_point()# Setting the tick marks on an axis
# This will show tick marks on every 0.25 from 1 to 10
# The scale will show only the ones that are within range (3.50-6.25 in this case)
bp + scale_y_continuous(breaks=seq(1,10,1/4))

# The breaks can be spaced unevenly
bp + scale_y_continuous(breaks=c(4, 4.25, 4.5, 5, 6,8))

# Suppress ticks and gridlines
bp + scale_y_continuous(breaks=NULL)

# Hide tick marks and labels (on Y axis), but keep the gridlines
bp + theme(axis.ticks = element_blank(), axis.text.y = element_blank())

x축과 마찬가지로 y축도 눈금이나 라벨을 숨기는 게 된다. 

 

축 스케일이 지수 or 로그일 때 

우리의 제육쌈밥군... R로 깔끔하게 스탠다드 커브를 만들어서 냈던 게 교수님의 마음에 들었는지, 방학동안 랩에서 일해보지 않겠느냐는 제의를 받았다. 근데 왜 제육쌈밥이죠 그냥 마침 관심이 있던 분야였던 제육쌈밥군은 흔쾌히 수락했고, 첫 출근을 하게 됐는데... 실험실 선배가 그를 불러 넌지시 물어봤다. 

"교수님께 얘기는 들었어. R로 standard curve를 그렸다고... 혹시... 나 좀 도와줄 수 있어? "

제육쌈밥군이 OK하자 선배는 그래프 하나를 보여줬다. 

sorted(CLNSIG_dict.items())[n]

일본열도 아님 "교수님께서 좀 더 깔끔한 그래프를 보고 싶다고 하셨는데, 어떻게 해야 할 지 모르겠어. "
"어떻게 깔끔하게 바꾸고 싶으시대요? "
"데이터가 직선으로 보였으면 좋겠대. "

 

> library(scales)
> sp+scale_y_continuous(trans=log2_trans())

이렇게요? 

 

sp + coord_trans(y="log2")

얘는 눈금이 이렇게 바뀐다. 

"하는 김에 눈금도 바꾸면 좀 깔끔할 것 같은데... "

> sp + scale_y_continuous(trans = log2_trans(),
+                         breaks = trans_breaks("log2", function(x) 2^x),
+                         labels = trans_format("log2", math_format(2^.x)))

"제육쌈밥군! 덕분에 해결됐어! 이거 바로 논문에 넣어도 되겠대! "

 

축 비율과 축 라벨

> plot+coord_fixed(ratio=1/3)

(마른세수) 이거 꼭 비율 이렇게 해야됨? 

 

> plot+theme(axis.title.x=element_blank())

축 제목은 이렇게 빼버리면 된다. (라벨 말고 제목)

 

> plot+theme(axis.title.x=element_text(face="bold",size=18),axis.text.x=element_text(size=8))

크기도 이렇게 바꿀 수 있다. 폰트만 바꾸면 되는데 

 

> plot+scale_y_continuous(label=percent)

축 라벨이 퍼센트가 됐어요! 

 

> plot+theme(panel.grid.minor=element_blank(),panel.grid.major=element_blank())

얘는 아예 그래프의 모눈을 싹 치워버린다. 

 

> plot+theme(panel.grid.minor.y=element_blank(),panel.grid.major.y=element_blank())

위에도 썼지만 하나만 날리는것도 됨. 

 

범례

> plot+guides(fill=FALSE)
경고메시지(들): 
`guides(<scale> = FALSE)` is deprecated. Please use `guides(<scale> = "none")` instead.

상여자는 범례를 넣지 않는다!!! 

 

bp + scale_fill_discrete(breaks=c("trt1","ctrl","trt2"))

상여자는 범례 순서를 수동으로 매긴다!!! 

 

> plot+guides(fill=guide_legend(reverse=TRUE))

이거는 수동으로 매기는 게 아니라 범례 순서가 반대가 된다. 

 

> plot+guides(fill=guide_legend(title=NULL))

범례 제목은 이걸로 뺀다. 

 

bp + scale_fill_discrete(name="Experimental\nCondition",
                         breaks=c("ctrl", "trt1", "trt2"),
                         labels=c("Control", "Treatment 1", "Treatment 2"))

범례 라벨만 바꾸거나(...) 

 

# Specify both colour and shape
lp1 + scale_colour_discrete(name  ="Payer",
                            breaks=c("Female", "Male"),
                            labels=c("Woman", "Man")) +
      scale_shape_discrete(name  ="Payer",
                           breaks=c("Female", "Male"),
                           labels=c("Woman", "Man"))

데이터 바이 데이터지만 데이터 그룹별로 묶거나... 

 

> plot+theme(legend.text=element_text(colour="#939597",size=16))

범례 제목이나 내용물을 바꿀 수도 있다. 

 

> plot+theme(legend.background=element_rect(fill="gray90"),legend.position="top")

범레를 위로 치워드렸습니다^^ 

 

선이... 선이 보인다! 

넣었응게 보이지. 

 

> plot+geom_hline(aes(yintercept=100))

y절편을 설정해서 띄울 수 있다. 

 

> sp+geom_hline(aes(yintercept=0))+geom_vline(aes(xintercept=0))

근데 이건 너무 갔는데? 

 

library(dplyr)
> lines <- dat %>%
+   group_by(cond) %>%
+   summarise(
+     x = mean(xval),
+     ymin = min(yval),
+     ymax = max(yval)
+   )
sp + geom_hline(aes(yintercept=10)) +
     geom_linerange(aes(x=x, y=NULL, ymin=ymin, ymax=ymax), data=lines)

이런 것도 된다. ...저거 평균임? 

 

dat_vlines <- data.frame(cond=levels(dat$cond), xval=c(10,11.5))
dat_vlines
#>        cond xval
#> 1   control 10.0
#> 2 treatment 11.5

spf + geom_hline(aes(yintercept=10)) +
      geom_vline(aes(xintercept=xval), data=dat_vlines,
                    colour="#990000", linetype="dashed")

spf + geom_hline(aes(yintercept=10)) +
     geom_linerange(aes(x=x, y=NULL, ymin=ymin, ymax=ymax), data=lines)
#> Warning: Ignoring unknown aesthetics: y

아 나눠드리겠습니다. 

 

그것은 분할출력

이거랑 때깔까지만 보면 된다. 

 

> sp <- ggplot(tips, aes(x=total_bill, y=tip/total_bill)) + geom_point(shape=1)
> sp

내장 데이터를 활용한 그래프. 근데 이걸 좀 분할해서 띄우고 싶다... 뭐 그럴 거 아님? 

 

sp + facet_grid(sex ~ .)

가로분열(성별)

 

> sp + facet_grid(. ~ time)

세로분열(시간대)

 

> sp + facet_grid(sex ~ time)

아, 이런 것도 된다. (성별+시간대)

 

> sp + facet_grid(sex ~ time)+theme(strip.text.x=element_text(size=6),strip.text.y=element_text(size=6),strip.background=element_rect(fill="#f5df4d"))

이렇게 정보가 표시되는 부분의 디자인도 바꿀 수 있다. 

 

> labels=c(Female="Woman",Male="Man")
> sp+facet_grid(.~sex,labeller=labeller(sex=labels))

라벨이 Female이랑 Male인게 좀 거시기하면 바꾸면 된다. 

 

색깔

먹고 죽은 귀신이 때깔도 고운데 그래프는 뭐 하면 때깔이 좋아지나... 

 

> ggplot(data=data4_medium,aes(x=Product.name,y=Order))+geom_bar(stat="identity")

참고로 원래 그래프는 이렇게 단색이다. 

 

> ggplot(data=data4_medium,aes(x=Product.name,y=Order))+geom_bar(stat="identity",fill="#f7cac9")

그래서 이렇게 단색으로만 변경이 된다. 

 

> ggplot(data=data4_medium,aes(x=Product.name,y=Order,fill=Product.name))+geom_bar(stat="identity")

물론 데이터별로 먹이면 이런 화려한 그래프가 나를 감싼다. 근데 저거 파레트 못 바꾸냐고? 

 

> cbPalette <- c("#999999", "#E69F00", "#56B4E9", "#009E73", "#F0E442", "#0072B2", "#D55E00", "#CC79A7")
> ggplot(data=data4_medium,aes(x=Product.name,y=Order,fill=Product.name))+geom_bar(stat="identity")+scale_fill_manual(values=cbPalette)

되는데요? 

 

scale_colour_manual(values=cbPalette)

선이나 점이면 이거 쓰자. 

 

> ggplot(data=data4_medium,aes(x=Product.name,y=Order,fill=Product.name))+geom_bar(stat="identity")+scale_fill_hue(l=40)

Hue를 바꾸면 밝기가 달라지고(default=65)

 

> ggplot(data=data4_medium,aes(x=Product.name,y=Order,fill=Product.name))+geom_bar(stat="identity")+scale_fill_hue(c=45)

c를 바꾸면 채도가... 이건 근데 default가 얼마임? 

 

> ggplot(data=data4_medium,aes(x=Product.name,y=Order,fill=Product.name))+geom_bar(stat="identity")+scale_fill_brewer()

아, 파레트 자체를 바꾸는 것도 된다.