创建一个堆积条形图 plotly 只提供一种颜色而不是两种

Create a stacked bar chart with plotly provide only one color instead of two

我有以下数据框:

dp<-structure(list(`Demand Per Section` = c(125, 350, 100, 538, 75, 
25, 138, 138, 75, 150, 37, 225, 35, 40, 125, 25, 25, 125, 50, 
250, 88, 325, 4, 50, 6, 5, 500, 500, 3, 146, 5, 34, 15, 51, 2, 
32, 48, 18, 5, 6, 44, 16, 46, 12, 100, 750, 15, 500, 30, 333), 
    `Element Name` = c("Nitric acid (concentrated)", "Sulphuric acid(concentrated)", 
    "2-hydroxybenzoic acid", "Acetic anhydride", "2-Naphthol", 
    "Sodium Hydroxide", "Phenyl hydrazine hydrochloride", "Glucose", 
    "Sodium acetate", "Aniline", "Zinc poweder", "2-amino-benzoic acid", 
    "1.3-dihydroxybenzene", "Ethyl acetate", "hydroxy benzene", 
    "phenyl methanol", "Sodium carbonate", "Potassium permanganate", 
    "Sodium bisulfite.", "Hydrochloric acid (concentrated)", 
    "Sodium nitrite", "Copper(II) sulfate", "Methyl orange", 
    "EtOH", "Distilled water", "cuper ion", "ammonium hydroxide", 
    "ammonium hydroxide", "Iron( III)", "Potassium Thiocyanate", 
    "ferric ammonium sulfate", "Ammonium Sulfate", "sodium hypochlorite", 
    "Acetic acid", "Phenolphthalein", "Sodium carbonate", "Sodum hydroxide", 
    "Acetic acid", "Phenolphthalein", "Methyl orange", "Phosphoric acid", 
    "Sodium carbonate", "Iron(II) sulfate", "Potassium permanganate", 
    "Sulfuric Acid", "Barium Chloride.monoHydrate", "Distilled water", 
    "nickel Sulphate", "Dimethyl glyoxime (DMG)", "Calsium chloride"
    ), Department = c("Chemsitry", "Chemsitry", "Chemsitry", 
    "Chemsitry", "Chemsitry", "Chemsitry", "Chemsitry", "Chemsitry", 
    "Chemsitry", "Chemsitry", "Chemsitry", "Chemsitry", "Chemsitry", 
    "Chemsitry", "Chemsitry", "Chemsitry", "Chemsitry", "Chemsitry","Chemsitry", "Chemsitry", "Chemsitry", "Chemsitry", "Chemsitry", 
    "Chemsitry", "Chemsitry", "Chemsitry", "Chemsitry", "Chemsitry", 
    "Chemsitry", "Chemsitry", "Chemsitry", "Chemsitry", "Chemsitry", 
    "Chemsitry", "Chemsitry", "Chemsitry", "Chemsitry", "Chemsitry", 
    "Chemsitry", "Chemsitry", "Chemsitry", "Chemsitry", "Chemsitry", 
    "Chemsitry", "Chemsitry", "Chemsitry", "Chemsitry", "Chemsitry", 
    "Chemsitry", "Chemsitry"), DemandCourse = c(375, 1050, 300, 
    1614, 225, 75, 414, 414, 225, 450, 111, 675, 105, 120, 375, 
    75, 75, 375, 150, 750, 264, 975, 20, 250, 30, 25, 2500, 2500, 
    15, 730, 25, 170, 75, 255, 10, 160, 144, 54, 15, 18, 132, 
    48, 138, 36, 300, 2250, 45, 1500, 90, 999), `Amount Available` = c(1000, 
    3000, 4000, 1000, 750, 750, 2000, 5000, 150, 24000, 450, 
    3000, 1400, 400, 400, 250, 250, 1000, 1000, 7500, 6400, 900, 
    250, 1500, 20000, 50, 300, 4000, 200, 3000, 500, 1200, 1000, 
    6000, 900, 250, 200, 6000, 900, 250, 200, 250, 150, 1000, 
    15000, 3000, 20000, 1500, 600, 7500)), row.names = c(NA, 
-50L), class = c("tbl_df", "tbl", "data.frame"), na.action = structure(c(`1` = 1L, 
`24` = 24L, `32` = 32L, `36` = 36L, `38` = 38L, `42` = 42L, `45` = 45L, 
`49` = 49L, `66` = 66L, `111` = 111L, `140` = 140L, `151` = 151L, 
`154` = 154L, `164` = 164L, `169` = 169L, `171` = 171L, `175` = 175L,`185` = 185L, `193` = 193L, `227` = 227L, `252` = 252L, `253` = 253L, 
`256` = 256L, `257` = 257L, `258` = 258L, `262` = 262L, `263` = 263L, 
`265` = 265L, `275` = 275L, `276` = 276L, `277` = 277L, `279` = 279L, 
`280` = 280L, `281` = 281L, `282` = 282L, `283` = 283L, `284` = 284L, 
`285` = 285L, `286` = 286L, `288` = 288L, `289` = 289L, `290` = 290L, 
`291` = 291L, `292` = 292L, `293` = 293L, `298` = 298L, `299` = 299L, 
`300` = 300L, `302` = 302L, `303` = 303L, `304` = 304L, `308` = 308L, 
`309` = 309L, `310` = 310L, `311` = 311L, `312` = 312L, `314` = 314L, 
`315` = 315L, `316` = 316L, `317` = 317L, `318` = 318L, `319` = 319L, 
`323` = 323L, `325` = 325L), class = "omit"))

我想用 Amount AvailableDemandCourse 创建堆叠条形图,但它不起作用。

fig <- plot_ly(
  data = as.data.frame(dp),
  x = ~ `Element Name`,
  y = ~ `Amount Available`,
  name = "Amount Available",
  hovertext = paste(
    "Chemical Name:",dp$`Element Name`,
    "<br>Available Amount :",
    dp$`Amount Available`
    
  ),
  hoverinfo = "text"
)%>% add_trace(y = ~DemandCourse, name = 'Demand',
               hovertext = paste(
                 "Chemical Name:",dp$`Element Name`,
                 "<br>Available Amount :",
                 dp$`DemandCourse`
                 
               ),
               hoverinfo = "text")%>% layout(showlegend=T,
                                             barmode="stack"
                                             
                                             #legend = list(title = list(text = "<b>Department</b>"))
               )

fig

plotly 不理解当反引号围绕变量名称时它仍然是数据中的一列。 (特别是关于悬停文本。)有几种方法可以解决这个问题。由于您仍在使用每条轨迹的 x 和 y,因此您可以改用 hovertemplate


已更新


发布此答案后,我注意到 2500 看起来与 4000 大小相同,但不太正确。从那里我记得 plotly 不会汇总总数。您可以在之前或期间进行汇总,但它不会自动对值求和。

此外,函数 aggregate 也不接受反引号中的变量名。

我已经更新了此处的代码以聚合总计,以便您的 hovertext 显示按组的总计,而不是在您将鼠标向下移动到列时显示单个层。

我在对 layout 的调用中添加了 x 和 y 标签,因为反引号在图中。

dp <- as.data.frame(dp)

fig <- plot_ly(data = aggregate(list(y = dp[, 5]),
                                list(x = dp[, 2]),
                                sum), 
               x = ~x,
               y = ~y, name = "Amount Available",
               hovertemplate = "Chemical Name: %{x}<br>Available Amount: %{y}",
               type = "bar") %>% 
  add_bars(data = aggregate(list(y = dp[, 4]),
                            list(x = dp[, 2]),
                            sum),
           x = ~x,
           y = ~y, name = "Demand",
           hovertemplate = "Chemical Name: %{x}<br>Available Amount: %{y}",
           inherit = F) %>% 
  layout(barmode = "stack",
         xaxis = list(title = "Element Names"),
         yaxis = list(title = "Amount Available",
                      range = c(0, 45000)))
fig