Nikos Tsafos
Nikos Tsafos

Reputation: 23

Error plotting chart with facet_wrap and scales = "free" in plotly

I have a time series with various categories (facets), and I am trying to create a chart using the facet_wrap feature from ggplot2 and upload it on plotly.

If I set scales = "fixed", I have no problem: the graph looks fine on my computer and on plotly. But if I set scales = "free", as in the code below, then the ggplot2 on my computer looks fine, but the plotly version is not showing up properly (either on my computer or the web).

Here is some sample code; I create some random values for 12 states covering a 16-year period from 2000 to 2015, and I want to plot a time series of those values with each state having its own chart and unique y-axis.

library(ggplot2)
library(plotly)

set.seed(1) 
states = sample(state.name, 12) ## create random list of 12 states 

## create random data with values for state and by year 
dat <- data.frame(Year = rep(2000:2015, times = 12),
              State = rep(states, each = 16),
              Value = rnorm((12*16), mean = 5, sd = 2))

## plot data with facet_wrap for each state
p <- ggplot(dat, aes(Year, Value)) + geom_line() + 
    facet_wrap(~ State, ncol = 4, scales = "free")
p
ggplotly(p)

The ggplot2 command (p) shows up as expected:

enter image description here

But the ggplotly(p) is distorted:

enter image description here

As far as I can tell, there was a previous thread on this topic, but it was not resolved:

Plotly Facets not translating properly

I would appreciate any help on this.

Upvotes: 1

Views: 1396

Answers (2)

wxxyyyzz
wxxyyyzz

Reputation: 251

Came across very similar issue with ggplotly if not exact the same cause. (After many years) What made a difference for me is removing the ncol argument within facet_wrap(), or find a value it likes... It could be an issue with the arrangement with subplot but not 100% sure.

Upvotes: 0

MLavoie
MLavoie

Reputation: 9836

If you are open to an alternative, you could try with native plotly with subplot. Try:

dat$id <- as.integer(dat$State)
p <- plot_ly(dat, x = Year, y = Value, group = State,
             xaxis = paste0("x", id), marker=list(color="black"))
p <- layout(
    subplot(p, nrows=3, margin = 0.05),
    xaxis = list(title = "Arizona"),
    xaxis2 = list(title = "Connecticut"),
    xaxis3 = list(title = "Florida"),
    xaxis4 = list(title = "Georgia"),
    xaxis5 = list(title = "Indiana"),
    xaxis6 = list(title = "Maine"),
    xaxis7 = list(title = "Nebraska"),
    xaxis8 = list(title = "Nevada"),
    xaxis9 = list(title = "New Hampshire"),
    xaxis10 = list(title = "South Dakota"),
    xaxis11 = list(title = "Tennessee"),
    xaxis12 = list(title = "Texas"), 

    yaxis = list(title = "Value"),
    yaxis2 = list(title = ""),
    yaxis3 = list(title = ""),
    yaxis4 = list(title = ""),
    yaxis5 = list(title = "Value"),
    yaxis6 = list(title = ""),
    yaxis7 = list(title = ""),
    yaxis8 = list(title = ""),
    yaxis9 = list(title = "Value"),
    yaxis10 = list(title = ""),
    yaxis11 = list(title = ""),
    yaxis12 = list(title = ""), showlegend = FALSE)
p

Upvotes: 2

Related Questions