@@ -12,8 +12,12 @@ calc_views <- function(gsplot){
1212
1313 usrs <- calc_view_usr(views )
1414
15+ labs <- calc_view_labs(views )
16+
1517 views <- add_view_usr(views , usrs )
1618
19+ views <- add_view_labs(views , labs )
20+
1721 return (views )
1822}
1923
@@ -47,7 +51,17 @@ add_view_usr <- function(views, usrs){
4751 view_i <- which(names(views ) %in% ' view' )
4852 for (i in view_i ){
4953 sides <- views [[i ]][[' gs.config' ]][[' side' ]]
50- views [[i ]][[' usr' ]] <- c(usrs [[sides [1 ]]][[1 ]], usrs [[sides [2 ]]][[1 ]])
54+ views [[i ]][[' gs.config' ]][[' usr' ]] <- c(usrs [[sides [1 ]]][[1 ]], usrs [[sides [2 ]]][[1 ]])
55+ }
56+ return (views )
57+ }
58+
59+ add_view_labs <- function (views , labs ){
60+ view_i <- which(names(views ) %in% ' view' )
61+ for (i in view_i ){
62+ sides <- views [[i ]][[' gs.config' ]][[' side' ]]
63+ views [[i ]][[' gs.config' ]][[' xlab' ]] <- labs [[sides [1 ]]]
64+ views [[i ]][[' gs.config' ]][[' ylab' ]] <- labs [[sides [2 ]]]
5165 }
5266 return (views )
5367}
@@ -65,11 +79,16 @@ calc_view_usr <- function(views){
6579
6680 if ((side %% 2 ) == 0 ){
6781 # is y
82+
6883 lims <- lims_from_list(lapply(side_components , var = ' y' , function (list , var ) strip_pts(list ,var )))
84+ client_lims <- lims_from_client(side_components , var = ' ylim' , side )
85+ lims [! is.na(client_lims )] <- client_lims [! is.na(client_lims )]
6986 usr <- usr_from_lim(lims , type = par()$ yaxs )
7087 } else {
7188 # is x
7289 lims <- lims_from_list(lapply(side_components , var = ' x' , function (list , var ) strip_pts(list ,var )))
90+ client_lims <- lims_from_client(side_components , var = ' xlim' , side )
91+ lims [! is.na(client_lims )] <- client_lims [! is.na(client_lims )]
7392 usr <- usr_from_lim(lims , type = par()$ xaxs )
7493 }
7594 sides [[side ]] = list (usr = usr )
@@ -79,12 +98,65 @@ calc_view_usr <- function(views){
7998 return (sides )
8099}
81100
101+ calc_view_labs <- function (views ){
102+
103+ # // to do: refactor to eliminate duplicated comb_view methods (like this on and the usr one)
104+ unique_sides <- unique(unlist(lapply(views ,function (x )x [[' gs.config' ]][[' side' ]])))
105+ labels <- list ()
106+ for (side in unique_sides ){
107+
108+ view_i <- which(unlist(lapply(views ,function (x )any(x [[' gs.config' ]][[' side' ]]== side ))))
109+
110+ # collapse these into a single list of components that reference this side
111+ side_components <- do.call(c ,views [view_i ])
112+
113+ if ((side %% 2 ) == 0 ){
114+ # is y
115+ var = ' ylab'
116+ lab <- labs_from_client(side_components , var = var ,side = side )
117+ } else {
118+ # is x
119+ var = ' xlab'
120+ lab <- labs_from_client(side_components , var = var ,side = side )
121+ }
122+
123+ labels [[side ]] = lab
124+
125+ }
126+ names(labels ) <- unique_sides
127+ return (labels )
128+ }
129+
82130strip_pts <- function (list , var ){
83131 if (var %in% names(list ))
84132 list [[var ]]
85133 else
86134 NA
87135}
136+
137+ lims_from_client <- function (list , var , side ){
138+ client_lims <- lapply(list , var = var , function (list , var ) strip_pts(list ,var ))
139+ client_lims <- client_lims [! is.na(client_lims )]
140+ if (length(client_lims ) > 1 )
141+ warning(' for side ' , side ,' , more than one ' ,var ,' specified. Using last' )
142+
143+ if (length(client_lims ) == 0 )
144+ client_lims <- list (c(NA ,NA ))
145+
146+ return (client_lims [[length(client_lims )]])
147+ }
148+
149+ labs_from_client <- function (list ,var ,side ){
150+ client_labs <- lapply(list , var = var , function (list , var ) strip_pts(list ,var ))
151+ client_labs <- client_labs [! is.na(client_labs )]
152+ if (length(client_labs ) > 1 )
153+ warning(' for side ' , side ,' , more than one ' ,var ,' specified. Using last' )
154+
155+ if (length(client_labs ) == 0 )
156+ client_labs <- list (NA )
157+ return (client_labs [[length(client_labs )]])
158+ }
159+
88160lims_from_list <- function (list ){
89161 c(min(sapply(list , min ),na.rm = TRUE ), max(sapply(list , max ),na.rm = TRUE ))
90162}
@@ -95,7 +167,7 @@ usr_from_lim <- function(lim, type = 'i', log=FALSE){
95167 stop(' log = TRUE not currently supported' )
96168 usr <- switch (type ,
97169 i = lim ,
98- r = c(lim [1 ]- 0.04 * lim [ 1 ] , lim [2 ]+ 0.04 * lim [ 2 ] )
170+ r = c(lim [1 ]- 0.04 * diff( lim ) , lim [2 ]+ 0.04 * diff( lim ) )
99171 )
100172 if (diff(usr ) == 0 ){
101173 usr <- c(usr [1 ]- 0.5 , usr [2 ]+ 0.5 )
0 commit comments