使用plotly分组和堆叠的条形图

问题描述

我是R的新手,对R不太好。我试图做堆栈图,最后得到了一个非常麻烦的代码,我相信可以使用RColorbrewer和ggplot2简化堆叠的条形图,从而简化了工作,但是我不确定该怎么做。 以下是我使用的数据,它们位于名为data2

的data.frame中

           Nation glider radar AUV ROV USV corer towed_eq Seismic_eq Drill_rig Manned_sub Other clean
1         Belgium      0     0   1   1   1     3        0          0         0          0     0     6
2        Bulgaria      0     0   0   0   0     0        1          0         0          1     0     2
3         Croatia      0     2   1   2   0     0        0          0         0          0     0     5
4          Cyprus      3     0   0   0   0     0        0          0         0          0     0     3
5         Estonia      0     0   0   1   0     0        0          0         0          0     0     1
6         Finland      1     0   0   0   0     0        0          0         0          0     0     1
7          France     11     2   3   1   0     1        1          3         0          1     0    23
8         Germany     18     3   3   4   0     0        1          4         2          1     0    36
9          Greece      1     0   0   3   0     0        0          0         0          0     0     4
10        Ireland      0     0   0   2   0     0        0          0         0          0     0     2
11          Italy     10     8   3   2   4     0        0          1         0          0     0    28
12          Malta      0     2   0   0   0     0        0          0         0          0     0     2
13    Netherlands      0     2   0   0   0     0        0          0         0          0     0     2
14         norway     17     3   1   3   0     1        3          1         0          0     1    30
15         Poland      0     0   0   1   0     0        0          0         0          0     0     1
16       Portugal      0     3   6   6   4     2        1          0         0          2     1    25
17        Romania      0     0   0   1   0     0        0          0         0          0     0     1
18       Slovenia      0     1   0   0   0     0        0          0         0          0     0     1
19          Spain     12    17   2   1   0     0        0          2         0          0     0    34
20         Sweden      0     2   1   3   0     0        0          0         0          0     0     6
21         Turkey      0     0   0   0   0     0        0          0         0          2     0     2
22 United Kingdom      0     0  13   4   1    11        4          2         1          0     4    40
23        UnkNown      5     0   0   0   0     0        0          0         0          0     0     5

这是我使用的代码

fig <- plot_ly(data2,x = ~Nation,y = ~glider,type = 'bar',name = 'Glider')
fig <- fig %>% add_trace(y = ~radar,name = 'Radar',marker=list(color='rgb(26,118,255)'))
fig <- fig %>% add_trace(y = ~AUV,name = 'AUV',marker=list(color='rgb(255,128,0)'))
fig <- fig %>% add_trace(y = ~ROV,name = 'ROV',marker=list(color='rgb(204,0)'))
fig <- fig %>% add_trace(y = ~USV,name = 'USV',marker=list(color='rgb(51,255,153)'))
fig <- fig %>% add_trace(y = ~corer,name = 'Corer',204)'))
fig <- fig %>% add_trace(y = ~towed_eq,name = 'Towed equipment',51)'))
fig <- fig %>% add_trace(y = ~Seismic_eq,name = 'Seismic equipment',204,229)'))
fig <- fig %>% add_trace(y = ~Drill_rig,name = 'Drill rig',marker=list(color='rgb(102,255)'))
fig <- fig %>% add_trace(y = ~Manned_sub,name = 'Manned submersible',marker=list(color='rgb(128,0)'))
fig <- fig %>% add_trace(y = ~Other,name = 'Other equipment',marker=list(color='rgb(153,153,0)'))
fig <- fig %>% layout(xaxis = list(title = "",tickfont = list(size = 14)),yaxis = list(title = 'Number of assets',barmode = 'stack')
fig

是否有更简单的方法通过使用Rcolorbrewer而不是每种颜色进行编码?是否可以将堆叠的条形图分组为第1组(滑翔机,AUV,rov,usv),第2组(CORer,towed_ew,地震_eq,drill_rig)和第3组(雷达,manned_sub,其他)?stack_plot

解决方法

您可以通过融合数据来尝试这种方法:

library(dplyr)
library(plotly)
library(tidyr)
library(RColorBrewer)

#Data
data <- structure(list(Nation = c("Belgium","Bulgaria","Croatia","Cyprus","Estonia","Finland","France","Germany","Greece","Ireland","Italy","Malta","Netherlands","Norway","Poland","Portugal","Romania","Slovenia","Spain","Sweden","Turkey","United Kingdom","Unknown"),glider = c(0,3,1,11,18,10,17,12,5),radar = c(0,2,8,0),AUV = c(1,6,13,ROV = c(1,4,USV = c(1,corer = c(3,towed_eq = c(0,Seismic_eq = c(0,Drill_rig = c(0,Manned_sub = c(0,Other = c(0,clean = c(6,5,23,36,28,30,25,34,40,5)),row.names = c(NA,-23L),class = "data.frame")

现在输入代码:

#First reshape
df2 <- pivot_longer(data,cols = -Nation)
#Plot
p <- plot_ly(df2,x = df2$Nation,y = df2$value,type = 'bar',name = df2$name,text = df2$value,color = df2$name,colors = brewer.pal(length(unique(df2$name)),"Paired"))%>%
  layout(barmode = 'stack',hoverlabel = list(bgcolor= 'white'),bargap = 0.5) %>%
  layout(xaxis = list(categoryorder = 'array',categoryarray = df2$Nation),showlegend = T)

输出:

enter image description here