简体   繁体   中英

R plotly: How to keep width parameter of ggplot2 geom_bar() when using ggplotly()

For some reason, when converting in R a ggplot2 bar chart ( geom_bar ) into an interactive plot using plotly 's ggplotly function, ggplotly "forces" the bars to stick together, even if the width parameter is specified:

library(plotly)
library(ggplot2)

DF <- read.table(text="Rank F1     F2     F3
1    500    250    50
2    400    100    30
3    300    155    100
4    200    90     10", header=TRUE)

library(reshape2)
DF1 <- melt(DF, id.var="Rank")

p <- ggplot(DF1, aes(x = Rank, y = value, fill = variable)) +
  geom_bar(stat = "identity")

ggplotly(p)

在此处输入图片说明

p <- ggplot(DF1, aes(x = Rank, y = value, fill = variable)) +
  geom_bar(stat = "identity", width = 0.4)

ggplotly(p)

在此处输入图片说明

It also reverses ggplot2 s default colors order for some reason (although keeping the order in the legend...), but I can handle this.

Any idea hot to tell ggplotly to not stick my bars together, like the default ggplot2 behavior?

Any idea hot to tell ggplotly to not stick my bars together, like the default ggplot2 behavior?

ggplotly sets bargap to 0 , you could set to your desired value via layout

ggplotly(p) %>% layout(bargap=0.15)

在此处输入图片说明


It also reverses ggplot2s default colors order for some reason (although keeping the order in the legend...), but I can handle this.

Let's get that fixed as well. You can change the order afterwards by flipping the bars and reversing the legend.

gp <- ggplotly(p) %>% layout(bargap = 0.15, legend = list(traceorder = 'reversed'))

traces <- length(gp[['x']][[1]])
for (i in 1:floor(traces / 2)) {
  temp <- gp[['x']][[1]][[i]]
  gp[['x']][[1]][[i]] <- gp[['x']][[1]][[traces + 1 - i]]
  gp[['x']][[1]][[traces + 1 - i]] <- temp
}

在此处输入图片说明

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM