2013-04-29 2 views
2

나는 ggplot2로 3 월 광기 브래킷을 만들려고 노력 중이며 플롯에 주석을다는 데 문제가 있습니다. 특히 팀 이름을 지정하는 데 문제가 없지만 텍스트를 절대 크기로 유지할 수는 없다는 것을 발견했습니다. 따라서 사용자가 ggplot 객체를 보는 창의 크기에 따라 일부 팀 이름이 너무 크게 보입니다. 두 이미지에서 small bracketmarch madness bracket with ggplot2

medium bracket 텍스트의 크기가 서로 다른되는 바의 길이에도 불구하고 변경되지 않습니다 :

는 다음과 같은 두 가지 이미지를보고, 내가 무슨 말 증명합니다. 크기가 고정되어있는 것과는 대조적으로 이미지에 텍스트 크기의 크기를 지정하는 방법이 있는지 알고 싶습니다. (내 코드는 다음과 같습니다; 나는 그것이 보일 수 있습니다 얼마나 고통스러운 사전에 죄송합니다.)

### Helper functions 
first_evens <- function(x) {seq(from=2,to=2*x,length.out=x)} 
first_odds <- function(x) {seq(from=1,to=2*x-1,length.out=x)} 

### calculate y-values for horizontal lines: 
### this is for top-left corner of the bracket, 
### but multiplying sequences by -1 makes these 
### values work for bottom right and left corners; 
### final round has teams at y=2*off.set 

r1.y.width <- 1.5*strheight(s="Virginia Common",units="in") # this effects the width of the first round 
r1.y.offset <- 0.125*r1.y.width # this effects distance from y=0 

r1.y <- seq(from=r1.y.offset,to=r1.y.offset+r1.y.width,length.out=16) 
r2.y <- seq(from=mean(r1.y[1:2]),to=mean(r1.y[15:16]),length.out=8) 
r3.y <- seq(from=mean(r2.y[1:2]),to=mean(r2.y[7:8]),length.out=4) 
r4.y <- seq(from=mean(r3.y[1:2]),to=mean(r3.y[3:4]),length.out=2) 
r5.y <- seq(from=mean(r4.y[1:2]),to=mean(r4.y[1:2]),length.out=1) 
r6.y <- 1.5*r1.y.offset 

### calculate horizontal bar start and stop coordinates 
### note that there are 6 total rounds -- 5 rounds per quadrant 
r1.x.width <- 1.25*strwidth("Viriginia Commonwealth","inches") # how long should horizontal lines be? 
r1.x.offset <- 1 
round.break.points <- -(seq(from=0,to=7*r1.x.width,by=r1.x.width)+r1.x.offset) 

r1.x <- round.break.points[7:6] 
r2.x <- round.break.points[6:5] 
r3.x <- round.break.points[5:4] 
r4.x <- round.break.points[4:3] 
r5.x <- round.break.points[3:2] 
r6.x <- round.break.points[2:1] 

### calculate verticals line coordinates: these are based off of 
### r1.y values. Round 5 verticals need to connect the four subtrees 
### via the top-left <-> bottom-left and top-right <-> bottom-right 

r1.verticals.start <- r1.y[first_odds(8)] 
r1.verticals.stop <- r1.y[first_evens(8)] 

r2.verticals.start <- r2.y[first_odds(4)] 
r2.verticals.stop <- r2.y[first_evens(4)] 

r3.verticals.start <- r3.y[first_odds(2)] 
r3.verticals.stop <- r3.y[first_evens(2)] 

r4.verticals.start <- r4.y[first_odds(1)] 
r4.verticals.stop <- r4.y[first_evens(1)] 

r5.verticals.start <- r5.y[1] 
r5.verticals.stop <- -r5.y[1] 

empty.bracket <- ggplot() + theme_bw() + theme(axis.line=element_blank(), axis.text.x=element_blank(), axis.text.y=element_blank(), axis.ticks=element_blank(), axis.title.x=element_blank(), axis.title.y=element_blank(), panel.border=element_blank(), panel.grid.major.x=element_blank(), panel.grid.minor.x=element_blank(), panel.grid.major.y=element_blank(), panel.grid.minor.y=element_blank(), plot.margin=unit(c(0,0,-6,-6),"mm"), text=element_text(size=12,hjust=0,vjust=0)) + coord_cartesian(ylim = c(-1.05*r1.y[16],1.05*r1.y[16]), xlim = c(1.025*r1.x[1],-1.025*r1.x[1])) 

### add first round bars, and vertical connectors, make addition of each quadrant verbose 
empty.bracket <- empty.bracket + geom_segment(aes(x=r1.x[1],y=r1.y,yend=r1.y,xend=r1.x[2])) + geom_segment(aes(x=r1.x[2],xend=r1.x[2],y=r1.verticals.start,yend=r1.verticals.stop)) + geom_segment(aes(x=r1.x[1],y=-r1.y,yend=-r1.y,xend=r1.x[2])) + geom_segment(aes(x=r1.x[2],xend=r1.x[2],y=-r1.verticals.start,yend=-r1.verticals.stop)) + geom_segment(aes(x=-r1.x[1],y=r1.y,yend=r1.y,xend=-r1.x[2])) + geom_segment(aes(x=-r1.x[2],xend=-r1.x[2],y=r1.verticals.start,yend=r1.verticals.stop)) + geom_segment(aes(x=-r1.x[1],y=-r1.y,yend=-r1.y,xend=-r1.x[2])) + geom_segment(aes(x=-r1.x[2],xend=-r1.x[2],y=-r1.verticals.start,yend=-r1.verticals.stop)) 

### add second round 
empty.bracket <- empty.bracket + geom_segment(aes(x=r2.x[1],y=r2.y,yend=r2.y,xend=r2.x[2])) + geom_segment(aes(x=r2.x[2],xend=r2.x[2],y=r2.verticals.start,yend=r2.verticals.stop)) + geom_segment(aes(x=r2.x[1],y=-r2.y,yend=-r2.y,xend=r2.x[2])) + geom_segment(aes(x=r2.x[2],xend=r2.x[2],y=-r2.verticals.start,yend=-r2.verticals.stop)) + geom_segment(aes(x=-r2.x[1],y=r2.y,yend=r2.y,xend=-r2.x[2])) + geom_segment(aes(x=-r2.x[2],xend=-r2.x[2],y=r2.verticals.start,yend=r2.verticals.stop)) + geom_segment(aes(x=-r2.x[1],y=-r2.y,yend=-r2.y,xend=-r2.x[2])) + geom_segment(aes(x=-r2.x[2],xend=-r2.x[2],y=-r2.verticals.start,yend=-r2.verticals.stop)) 

### add third round 
empty.bracket <- empty.bracket + geom_segment(aes(x=r3.x[1],y=r3.y,yend=r3.y,xend=r3.x[2])) + geom_segment(aes(x=r3.x[2],xend=r3.x[2],y=r3.verticals.start,yend=r3.verticals.stop)) + geom_segment(aes(x=r3.x[1],y=-r3.y,yend=-r3.y,xend=r3.x[2])) + geom_segment(aes(x=r3.x[2],xend=r3.x[2],y=-r3.verticals.start,yend=-r3.verticals.stop)) + geom_segment(aes(x=-r3.x[1],y=r3.y,yend=r3.y,xend=-r3.x[2])) + geom_segment(aes(x=-r3.x[2],xend=-r3.x[2],y=r3.verticals.start,yend=r3.verticals.stop)) + geom_segment(aes(x=-r3.x[1],y=-r3.y,yend=-r3.y,xend=-r3.x[2])) + geom_segment(aes(x=-r3.x[2],xend=-r3.x[2],y=-r3.verticals.start,yend=-r3.verticals.stop)) 

### add fourth round 
empty.bracket <- empty.bracket + geom_segment(aes(x=r4.x[1],y=r4.y,yend=r4.y,xend=r4.x[2])) + geom_segment(aes(x=r4.x[2],xend=r4.x[2],y=r4.verticals.start,yend=r4.verticals.stop)) + geom_segment(aes(x=r4.x[1],y=-r4.y,yend=-r4.y,xend=r4.x[2])) + geom_segment(aes(x=r4.x[2],xend=r4.x[2],y=-r4.verticals.start,yend=-r4.verticals.stop)) + geom_segment(aes(x=-r4.x[1],y=r4.y,yend=r4.y,xend=-r4.x[2])) + geom_segment(aes(x=-r4.x[2],xend=-r4.x[2],y=r4.verticals.start,yend=r4.verticals.stop)) + geom_segment(aes(x=-r4.x[1],y=-r4.y,yend=-r4.y,xend=-r4.x[2])) + geom_segment(aes(x=-r4.x[2],xend=-r4.x[2],y=-r4.verticals.start,yend=-r4.verticals.stop)) 

### add fifth round: add necessary horizontal bars and then 
### vertical bars 
empty.bracket <- empty.bracket + geom_segment(aes(x=r5.x[1],y=r5.y,yend=r5.y,xend=r5.x[2])) + geom_segment(aes(x=r5.x[1],y=-r5.y,yend=-r5.y,xend=r5.x[2])) + geom_segment(aes(x=r5.x[2],y=-r5.y, yend=r5.y, xend=r5.x[2])) + geom_segment(aes(x=-r5.x[1],y=r5.y,yend=r5.y,xend=-r5.x[2])) + geom_segment(aes(x=-r5.x[1],y=-r5.y,yend=-r5.y,xend=-r5.x[2])) + geom_segment(aes(x=-r5.x[2],y=-r5.y,yend=r5.y,xend=-r5.x[2])) 

### due to symmetry, the 6th (and final round) 
empty.bracket <- empty.bracket + geom_segment(aes(x=r6.x[1],y=r6.y,xend=r6.x[2],yend=r6.y)) + geom_segment(aes(x=-r6.x[1],y=-r6.y,xend=-r6.x[2],yend=-r6.y)) 

### add winner location 
empty.bracket <- empty.bracket + geom_segment(aes(x=mean(r6.x),xend=-mean(r6.x),y=0,yend=0)) 

### put some test labels on the bracket slots 
Labels <- c("Alabama", "Alaska", "Arizona", "Arkansas", "Virginia Commonwealth") 
TextFrame <- data.frame(X = r1.x[1], Y = sample(r1.y,5), LAB = Labels) 
TextFrame <- transform(TextFrame, w = strwidth(LAB, 'inches') + 0.05, h = strheight(LAB, 'inches') + 0.5) 

### display results 
empty.bracket + geom_rect(data = TextFrame, aes(xmin = X, xmax = X + w, ymin = Y, ymax = Y + h),alpha=0) + geom_text(data=TextFrame,aes(x=X,y=Y,label=LAB),size=rel(3),hjust=0,vjust=0) 

답변

0

내가 몇 분리 된 부분에 질문을 할게요.

  1. 창 크기 : 그래픽 객체가 창으로 확장하면서

    Hence, depending on the size of the window from 
    which users view their ggplot object some team names 
    look too big. 
    

    에 R 그래픽보기, 텍스트 크기는 일정하게 유지된다. 즉, R 그래프 창에 표시되는 내용은 인쇄 할 때 얻을 수있는 것과 동일하지 않습니다 (savePlot 명령을 사용하지 않는 한).

  2. 텍스트 크기 조정 :

    In both images the size of the text is unchanged, despite the 
    length of the bars being different. I'd like to know if there's a 
    way to have the size of the text scale with the image, as opposed to 
    being fixed in size. 
    

    나는 짧은 대답이 더 믿습니다. 텍스트 크기를 지정하면 고정됩니다. 그러나 pdf 장치로 출력하는 경우 pdf 너비에 따라 텍스트 크기를 조정할 수 있습니다.

+0

pdf 너비에 따라 텍스트 크기를 조정하는 방법에 대한 예를 들려 줄 수 있습니까? – StevieP

+0

나는 놀라운 게 없다. 그러나 기본 PDF 너비가'w = 6 '이라고 가정합니다. 'geom_text (..., size = rel ((w * 3)/6))'너의 너비가 증가하면 텍스트 크기 또한 증가한다. – csgillespie

+0

어떻게 구현할 수 있습니까? (모든 후속 조치에 대해 유감스럽게 생각합니다.) 매개 변수'pdf.width <- 11; pdf.height <- 8.5'라고 말하면 내 플롯을 만듭니다. march.madness <- ggplot() + ... + geom_text (..., size = rel (pdf.width/10))'. 'ggsave (march.madness, filename = "test_plot", width = pdf.width, height = pdf.height, units = "in")를 호출하면 플롯 개체와 출력 매개 변수 사이에 통신이 이루어지지 않습니다. 뭐라고? – StevieP