Skip to content

Commit e108934

Browse files
committed
Support conversion for geom_vline()
1 parent c47df47 commit e108934

File tree

2 files changed

+36
-2
lines changed

2 files changed

+36
-2
lines changed

R/ggplotly.R

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,10 @@ gg2list <- function(p){
9898
xrange <- sapply(ggranges, `[[`, "x.range", simplify=FALSE, USE.NAMES=FALSE)
9999
ggxmin <- min(sapply(xrange, min))
100100
ggxmax <- max(sapply(xrange, max))
101+
# Extract y.range
102+
yrange <- sapply(ggranges, `[[`, "y.range", simplify=FALSE, USE.NAMES=FALSE)
103+
ggymin <- min(sapply(yrange, min))
104+
ggymax <- max(sapply(yrange, max))
101105

102106
# Get global size range because we need some of its info in layer2traces
103107
if ("size.name" %in% name.names) {
@@ -168,6 +172,9 @@ gg2list <- function(p){
168172
# Add global x-range info
169173
misc$prestats.data$globxmin <- ggxmin
170174
misc$prestats.data$globxmax <- ggxmax
175+
# Add global y-range info
176+
misc$prestats.data$globymin <- ggymin
177+
misc$prestats.data$globymax <- ggymax
171178

172179
# Add global size info if relevant
173180
if ("size.name" %in% name.names) {

R/trace_generation.R

Lines changed: 29 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,7 @@ layer2traces <- function(l, d, misc) {
121121
}
122122
## Then split on visual characteristics that will get different
123123
## legend entries.
124-
data.list <- if(basic$geom %in% names(markLegends)){
124+
data.list <- if (basic$geom %in% names(markLegends)) {
125125
mark.names <- markLegends[[basic$geom]]
126126
## However, continuously colored points are an exception: they do
127127
## not need a legend entry, and they can be efficiently rendered
@@ -152,11 +152,24 @@ layer2traces <- function(l, d, misc) {
152152
}
153153
}
154154

155+
# Split hline and vline when multiple
156+
if (g$geom == "hline" || g$geom == "vline") {
157+
if (nrow(g$data) > 1) {
158+
df.list <- split(basic$data, rep(1:nrow(g$data))) #, drop=TRUE)
159+
data.list <- lapply(df.list, function(df) {
160+
params <- basic$params
161+
list(data=df,
162+
params=params)
163+
})
164+
}
165+
}
166+
155167
## case of no legend, if either of the two ifs above failed.
156168
if(is.null(data.list)){
157169
data.list <- structure(list(list(data=basic$data, params=basic$params)),
158170
names=basic$params$name)
159171
}
172+
160173
getTrace <- geom2trace[[basic$geom]]
161174
if(is.null(getTrace)){
162175
warning("Conversion not implemented for geom_",
@@ -167,7 +180,8 @@ layer2traces <- function(l, d, misc) {
167180
}
168181
traces <- NULL
169182
names.in.legend <- NULL
170-
for(data.i in seq_along(data.list)){
183+
184+
for (data.i in seq_along(data.list)) {
171185
data.params <- data.list[[data.i]]
172186
data.params$params$stat.type <- l$stat$objname
173187
tr <- do.call(getTrace, data.params)
@@ -303,6 +317,11 @@ toBasic <- list(
303317
g$params$xend <- max(g$prestats.data$globxmax)
304318
g
305319
},
320+
vline=function(g) {
321+
g$params$ystart <- min(g$prestats.data$globymin)
322+
g$params$yend <- max(g$prestats.data$globymax)
323+
g
324+
},
306325
point=function(g) {
307326
if ("size" %in% names(g$data)) {
308327
g$params$sizemin <- min(g$prestats.data$globsizemin)
@@ -527,5 +546,13 @@ geom2trace <- list(
527546
type="scatter",
528547
mode="lines",
529548
line=paramORdefault(params, aes2line, line.defaults))
549+
},
550+
vline=function(data, params) {
551+
list(x=c(data$xintercept, data$xintercept),
552+
y=c(params$ystart, params$yend),
553+
name=params$name,
554+
type="scatter",
555+
mode="lines",
556+
line=paramORdefault(params, aes2line, line.defaults))
530557
}
531558
)

0 commit comments

Comments
 (0)