正如已经指出的here https://stackoverflow.com/a/37825559/2761575,该问题是由于用于颜色分组的列中存在重复值而引起的(在此示例中,cars
)。如前所述,可以通过按一列唯一名称对颜色进行分组来纠正条形的顺序。然而,这样做会产生一些不良的副作用:
- 同一制造商的不同型号汽车将显示为不同的颜色(不是您想要的 - 您想要按制造商着色)
- 图例中的条目比您想要的要多,即每个汽车型号一个,而不是每个制造商一个。
我们可以通过a)从永远不会显示的虚拟跟踪创建图例来解决这个问题(add_trace(type = "bar", x = 0, y = 0...
在下面的代码中),以及b)使用手动设置每个类别的颜色colors=
争论。下面我用一个彩虹调色板来展示原理。您可能想自己选择一些更有吸引力的颜色。
dat$unique.car <- make.unique(as.character(dat$cars))
dat2 <- data.frame(cars=levels(as.factor(dat$cars)),color=rainbow(nlevels(as.factor(dat$cars))))
dat2[] <- lapply(dat2, as.character)
dat$color <- dat2$color[match(dat$cars,dat2$cars)]
plot_ly() %>%
add_trace(data=dat2, type = "bar", x = 0, y = 0, color = cars, colors=color, showlegend=T) %>%
add_trace(data=dat, type = "bar", x = carb, y = mpg, color = unique.car, colors=color, showlegend=F, marker=list(line=list(color="black", width=1))) %>%
layout(barmode = "stack", xaxis = list(range=c(0.4,8.5)))