2017-09-19 17 views
1

저는 이것에 대해 몇 시간 씩 머리를 긁적 거리고 있습니다. 나는 지금까지 무엇을 가지고 :g : gplot2 in R : 음표 외부에 주석을 달고 텍스트에 밑줄을 긋습니다.

library(ggplot2) 
library(grid) 

all_data = data.frame(country=rep(c("A","B","C","D"),times=1,each=20), 
        value=rep(c(10,20,30,40),times=1,each=20), 
        year = rep(seq(1991,2010),4)) 


# PLOT GRAPH 

p1 <- ggplot() + theme_bw() + geom_line(aes(y = value, x = year, 
colour=country), size=2, 
            data = all_data, stat="identity") + 
theme(plot.title = element_text(size=18,hjust = -0.037), legend.position="bottom", 
    legend.direction="horizontal", legend.background = element_rect(size=0.5, linetype="solid", colour ="black"), 
    legend.text = element_text(size=16,face = "plain"), panel.grid.major = element_blank(), panel.grid.minor = element_blank(), 
    panel.border = element_blank(),axis.line = element_line(colour = "black"),legend.title = element_blank(), 
    axis.text=element_text(size=18,face = "plain"),axis.title.x=element_text(size=18,face = "plain", hjust = 1, 
                      margin = margin(t = 10, r = 0, b = 0, l = 0)), 
    axis.title.y=element_blank()) 


p1 <- p1 + ggtitle("Index")  
p1 <- p1 + xlab("Year") 
p1 <- p1 + scale_x_continuous(expand=c(0,0),breaks=seq(1991,2010,4)) 

p1 <- p1 + theme(plot.margin=unit(c(5.5, 300, 5.5, 5.5), "points")) 

p1 <- p1 + geom_text(aes(label = "Country", x = 2011, y = 
max(all_data$value)+10), hjust = 0, vjust = -2.5, size = 6) 
p1 <- p1 + geom_text(aes(label = "Average", x = Inf, y = 
max(all_data$value)+10), hjust = -1.5, vjust = -2, size = 6) 

p1 <- p1 + geom_text(aes(label = all_data$country, x = 2011, y = 
all_data$value), hjust = 0, size = 6) 
p1 <- p1 + geom_text(aes(label = as.character(all_data$value), x = Inf, 
y = all_data$value), hjust = -5, size = 6) 


p1 <- p1 + 
annotate("segment",x=2011,xend=2014,y=Inf,yend=Inf,color="black",lwd=1) 

# Override clipping 

gg2 <- ggplot_gtable(ggplot_build(p1)) 
gg2$layout$clip[gg2$layout$name == "panel"] <- "off" 
grid.draw(gg2) 

Output

는 내가 고민하고하는 것은 다음

1) 방법 평균 "모두"나라 "를 강조, 플롯의 외부에 주석하고 "x 축을 연장하지 않고.

2) 전체 주석 처리에 대한 체계적인 접근 방법이 없습니까? 시각적 인 검사로 hjust와 vjust를 조정하는 것은 매우 번거로운 것처럼 보입니다.

도움을 주시면 감사하겠습니다. 이 당신을 위해 작동하는 경우

+0

는 "출력"을 열 경우, 당신은 알 것 그 "나라"아래 모든 값 (A, B, C, D) x 축을 "연장"합니다. 나는 x 축 제목 "Year"와 x 축이 2009 년까지 이어 지도록 그릴 계획을 세우고 싶습니다. 둘째로, 저는 "Country"와 "Average"문자열을 위에 강조하고 싶습니다. 나는 "국가"에 밑줄을 긋고 "평균"에 밑줄을 긋기 위해 고심하고 있습니다. –

답변

1

참조 :

# define some offset parameters 
x.offset.country = 2 
x.offset.average = 5 
x.range = range(all_data$year) + c(0, x.offset.average + 2) 
y.range = range(all_data$value) + c(-5, 10) 
y.label.height = max(all_data$value) + 8 

# subset of data for annotation 
all_data_annotation <- dplyr::filter(all_data, year == max(year)) 

p <- ggplot(all_data, 
     aes(x = year, y = value, group = country, colour = country)) + 
    geom_line(size = 2) + 

    # fake axes (x-axis stops at year 2009, y-axis stops at value 45) 
    annotate("segment", x = 1991, y = 5, xend = 2009, yend = 5) + 
    annotate("segment", x = 1991, y = 5, xend = 1991, yend = 45) + 

    # country annotation 
    geom_text(data = all_data_annotation, inherit.aes = FALSE, 
      aes(x = year + x.offset.country, y = value, label = country)) + 
    annotate("text", x = max(all_data$year) + x.offset.country, y = y.label.height, 
      label = "~underline('Country')", parse = TRUE) + 

    # average annotation 
    geom_text(data = all_data_annotation, inherit.aes = FALSE, 
      aes(x = year + x.offset.average, y = value, label = value)) + 
    annotate("text", x = max(all_data$year) + x.offset.average, y = y.label.height, 
      label = "~underline('Average')", parse = TRUE) + 

    # index (fake y-axis label) 
    annotate("text", x = 1991, y = y.label.height, 
      label = "Index") + 

    scale_x_continuous(name = "Year", breaks = seq(1991, 2009, by = 4), expand = c(0, 0)) + 
    scale_y_continuous(name = "", breaks = seq(10, 40, by = 10), expand = c(0, 0)) + 
    scale_colour_discrete(name = "") + 
    coord_cartesian(xlim = x.range, ylim = y.range) + 
    theme_classic() + 
    theme(axis.line = element_blank(), 
     legend.position = "bottom", 
     legend.background = element_rect(size=0.5, linetype="solid", colour ="black")) 

# Override clipping (this part is unchanged) 
gg2 <- ggplot_gtable(ggplot_build(p)) 
gg2$layout$clip[gg2$layout$name == "panel"] <- "off" 
grid.draw(gg2) 

plot

+0

잘 작동하는 것 같습니다, 정말 고마워요! 마지막으로 한 가지 : 색상을 직접 정의하려고하는 경우 scale_colour_manual (값 = 색상) 색상은 색상 <- c ("# 081E90", "# 02CFBB", "# 3259BA", "# 9FAEE5" , "# A76FE3") 전설에 "국가"가 표시됩니다. 이걸 어떻게 피할 수 있니? –

+0

어리석은 저, 그것은 물론 전설 제목이었습니다. 모두 고쳐졌습니다. –