Skip to content

Plot_ly bar plots - bars span sevral x values when there are missing values.

3 messages · Rasmus Liland, Nevil Amos

#
I need to plot a number of bar charts as part of a shiny app.

I am using ploty ly

x and y  values are both numeric x being consecutive integer values.

there are often missing values in the data I wish to plot - each plot needs
to have a fixed x range.

When there are more than a few missing values  the bars for the remaining
values are being plotted much wider spanning several x values ( see example
2)

curiously when there is a single remaining value the bar width is correct
(example 3)

how can I maintain a constant bar width regardless of number of missing
values? I cannot find a bar-width setting.


df<-data.frame(x=1:20,y=rnorm(20)^2)

#twenty bars each centred above a single x value:
df%>%plot_ly(
  x =  ~ x,
  y =  ~ y,
  type = "bar")%>%
  layout(xaxis = list(range = c(0,20)),
         title = "example 1")

# this produces wide bars first one spread x= 0-6 second x= 8-14
# expected two column same width as in example 1 centred above x=3 and x=11
df[c(3,11),]%>%plot_ly(
  x =  ~ x,
  y =  ~ y,
  type = "bar")%>%
  layout(xaxis = list(range = c(0,20)),
         title = "example 2 column width expands across multiple x values")

# when only a single bar is present it is again the correct width - in this
case centred above x=3
df[3,]%>%plot_ly(
  x =  ~ x,
  y =  ~ y,
  type = "bar")%>%
  layout(xaxis = list(range = c(0,20)),
         title = "example 3 correct columns again")
#
Dear Nevil,

Although I am a bit unfamiliar with 
plotly, it seems it is possible to plot 
two bars side by side at least:

	h <- df[3:4,]
	p <- plotly::plot_ly(
	  data = h,
	  x =  ~ x,
	  y =  ~ y,
	  type = "bar")
	p <- plotly::layout(p=p,
	  xaxis = list(range = c(0,20)),
	  title = "example 4 two bars side by side")
	plotly::orca(p=p, file="amos4.png")

Thus, if you want to only plot x=3 and 
x=11 you need to set y=0 when x=4:10:

	h <- df[c(3, 11),]
	h <- rbind(h, cbind(x=4:10, y=0))
	p <- plotly::plot_ly(
	  data = h,
	  x =  ~ x,
	  y =  ~ y,
	  type = "bar")
	p <- plotly::layout(p=p,
	  xaxis = list(range = c(0,20)),
	  title = "example 2 corrected")
	plotly::orca(p=p, file="amos2.png")

I think this has to do with the xaxis 
option in plotly::layout there, and not 
with the bar width.

Best,
Rasmus

-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 833 bytes
Desc: not available
URL: <https://stat.ethz.ch/pipermail/r-help/attachments/20210309/61ad8b56/attachment.sig>
9 days later
#
Hi Rasmus,

thanks for that suggestion. It does indeed fix the column widths in this
example.  the reason it does this is becuase it means that the additonal 0
values added result in values for two adjacent columns.

so if adjacent columns are present the "correct" column width is maintained

df[c(3,4),]%>%plot_ly(
  x =  ~ x,
  y =  ~ y,
  type = "bar")%>%
  layout(xaxis = list(range = c(0,20)),
         title = "adjcant x values get correct column width")
however if there are not tow adjacent columns  then the width increases

df[c(3,5),]%>%plot_ly(
  x =  ~ x,
  y =  ~ y,
  type = "bar")%>%
  layout(xaxis = list(range = c(0,20)),
         title = "gap between x values column width changes")

given this I'm still not sure why the single value example produces a
correct column width.

for now the generic work around is to pad with y=0 as you suggested.
On Wed, 10 Mar 2021 at 05:58, Rasmus Liland <jral at posteo.no> wrote: