Skip to content

Commit 4bfd0c4

Browse files
author
Jordan S Read
authored
Merge pull request #368 from lindsaycarr/master
reverse axis tests + xlim() ylim() lim() function updates
2 parents 6bde551 + 11a36c8 commit 4bfd0c4

File tree

6 files changed

+77
-25
lines changed

6 files changed

+77
-25
lines changed

NAMESPACE

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ S3method(as.axis,numeric)
55
S3method(as.side_name,character)
66
S3method(as.side_name,numeric)
77
S3method(gsplot,default)
8+
S3method(lim,gsplot)
89
S3method(logged,gsplot)
910
S3method(print,gsplot)
1011
S3method(summary,gsplot)

R/access-gsplot.R

Lines changed: 49 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -97,11 +97,15 @@ ylim.gsplot <- function(object, side=NULL, set.undefined=TRUE){
9797
#' @export
9898
lim <- function(object, side, axis, set.undefined, if.null) UseMethod("lim")
9999

100-
lim <- function(object, side=NULL, axis = NULL, set.undefined=TRUE, if.null=c(0,1)){
101-
side.names <- names(sides(object))
102-
if (!is.null(side))
100+
#' @export
101+
lim.gsplot <- function(object, side=NULL, axis = NULL, set.undefined=TRUE, if.null=c(0,1)){
102+
all.side.names <- names(sides(object))
103+
side.names <- all.side.names
104+
if (!is.null(side)) {
103105
side.names <- as.side_name(side)
104-
else {
106+
side.axis <- as.axis(side)
107+
if(!is.null(axis) && side.axis != axis){ warning(paste("side", side, "does not have", axis, "limits"))}
108+
} else {
105109
if (!is.null(axis)){
106110
sides <- as.side(names(sides(object)))
107111
if (axis == 'y')
@@ -113,31 +117,56 @@ lim <- function(object, side=NULL, axis = NULL, set.undefined=TRUE, if.null=c(0,
113117

114118
}
115119

116-
lims <- lapply(side.names, function(x) {
120+
lims <- lapply(all.side.names, function(x) {
117121
lim <- object[[x]]$lim
118122
if (object[[x]]$reverse){
119123
lim <- rev(lim)
120124
}
121125
return(lim)
122126
})
123-
names(lims) <- side.names
124-
if (!is.null(side) && length(side)==1){
125-
lims <- lims[[1]]
126-
if (set.undefined && all(is.na(lims))){
127-
lims <- lim(object, axis=as.axis(side))
128-
sides <- as.side(names(lims)[sapply(lims, function(x) !any(is.na(x)))])
129-
closest.side <- sides[which.min(abs(side-sides))][1]
130-
if (is.null(closest.side)){
131-
lims <- NULL
132-
} else {
133-
lims <- lims[[as.side_name(closest.side)]]
127+
names(lims) <- all.side.names
128+
129+
if(set.undefined){
130+
# get names of all sides on the same axis (x or y) that are not completely NA
131+
which.undef <- sapply(lims, function(x) all(is.na(x)))
132+
if(all(which.undef)){
133+
lims <- NULL
134+
} else {
135+
undef.sides <- as.side(all.side.names[which.undef])
136+
def.sides <- as.side(all.side.names[!which.undef])
137+
if(is.null(side) || side %in% undef.sides){
138+
for (tmp.side in undef.sides){
139+
# find side closest to the undefined side (must be same axis)
140+
tmp.side.name <- as.side_name(tmp.side)
141+
tmp.lims <- lims[[tmp.side.name]]
142+
def.sides.axis.match <- def.sides[as.axis(def.sides) == as.axis(tmp.side)]
143+
closest.side <- def.sides.axis.match[which.min(abs(tmp.side-def.sides.axis.match))]
144+
if (length(closest.side) == 0){
145+
tmp.lims <- NULL
146+
} else {
147+
tmp.lims <- lims[[as.side_name(closest.side)]]
148+
match.reverse <- object[[tmp.side.name]]$reverse == object[[as.side_name(closest.side)]]$reverse
149+
if(!match.reverse){
150+
warning(paste("undefined limits for side", tmp.side,
151+
", cannot reverse; therefore, matching side", closest.side))
152+
}
153+
}
154+
lims[[tmp.side.name]] <- tmp.lims
155+
}
134156
}
135157
}
136-
if (is.null(lims)){
137-
lims <- if.null
138-
}
139158
}
140-
159+
160+
if (!is.null(lims) && !is.null(side) && length(side)==1){ ## move this to the end
161+
lims <- lims[[side.names]]
162+
} else {
163+
lims <- lims[side.names]
164+
}
165+
166+
if (is.null(lims)){
167+
lims <- if.null
168+
}
169+
141170
return(lims)
142171
}
143172

R/curve.R

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@
3939
#' legend()
4040
#' gs
4141
curve <- function(object, ...) {
42-
override("graphics", "curve", object, ...)
42+
override(package="graphics", name="curve", object=object, ...)
4343
}
4444

4545
curve.gsplot <- function(object, expr, from=0, to=1, n=101, ..., legend.name=NULL, side=c(1,2)){

R/gsplot.R

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,9 @@ pkg.env <- new.env()
1616
list(package='gsplot', def.funs=gsplot::callouts.default),
1717
'error_bar' =
1818
list(package='gsplot', def.funs=gsplot::error_bar.default),
19+
1920
"par" = c(),"axis" = c(), "abline" = c(), "legend" = c(),
20-
"title" = c(), "text" = c(), "mtext" = c(), "grid" = c(),
21+
"title" = c(), "mtext" = c(), "grid" = c(),
2122
"segments" = c(), "arrows" = c(), "rect" = c(),
2223
"polygon" = c(), "symbols" = c(), "curve" = c()
2324
)

man/lim.Rd

Lines changed: 1 addition & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

tests/testthat/tests-axis.R

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,4 +23,26 @@ test_that("axis gsplot",{
2323
expect_false(gs$side.1$axes)
2424
expect_false(gs$side.2$axes)
2525

26-
})
26+
})
27+
28+
test_that("axis reverse",{
29+
30+
gs <- gsplot() %>%
31+
points(1:10, 1:10) %>%
32+
axis(1, at = seq(0,10,by=0.1),labels=FALSE, tcl=0.15) %>%
33+
axis(2, reverse=TRUE)
34+
35+
expect_true(gs$side.2$reverse)
36+
expect_equal(ylim(gs, side=2), c(10,1))
37+
38+
gs2 <- gsplot() %>%
39+
points(1:10, 1:10, side=c(3,2)) %>%
40+
points(1:10, 1:10, side=c(1,2)) %>%
41+
axis(3, reverse=TRUE)
42+
43+
expect_true(gs2$side.3$reverse)
44+
expect_equal(xlim(gs2, side=3), c(10,1))
45+
expect_warning(ylim(gs2, side=3))
46+
47+
})
48+

0 commit comments

Comments
 (0)