2017-01-28 106 views
1

有沒有什麼辦法可以在R中使用plot_ly來製作堆積條形圖?我知道一個可能的解決方案是use ggplot and then convert with ggplotly,但它看起來並不像其他圖表那麼好。 Plotly site有一個示例,但通過單擊圖例刪除某個類別時總數保持不變。堆積面積圖使用Plotly和R無ggplot

使示例性數據:

library(tidyverse) 
library(plotly) 

# Create some data 
grpnames <- c("Thing_3", "Thing_2", "Thing_1") 
xval <- as.factor(c(100, 101, 102, 103)) 
frame <- merge(grpnames, xval, all=T) 
yval <- runif(12, 0, .2) 
df <- tbl_df(cbind(frame, yval)) 
colnames(df) <- c("GroupName", "X", "Y") 
df.wide <- spread(df, key = GroupName, value = Y) 

堆疊條的工作原理:

# Creates a legit stacked bar where values sum to highest point 
plot_ly(df, x = ~X, y = ~Y, color = ~GroupName, type='bar') %>% 
    layout(barmode = 'stack') 

我無法找到一個模擬到 「barmode = '堆'」 爲線圖:

# Attempt with tidy data 
df %>% 
    plot_ly(
    x = ~X, 
    y = ~Y, 
    color = ~GroupName, 
    type='scatter', 
    mode = 'lines', 
    fill = 'tonexty', 
    fillcolor = ~GroupName) 

而來自Plotly方面的例子,在這裏嘗試,不會爲每個X的值添加Y值 - 它只是疊加是他們。

# Attempt with wide data 
df.wide %>% 
    plot_ly(
    x = ~X, 
    y = ~Thing_1, 
    name = 'Thing 1', 
    type = 'scatter', 
    mode = 'none', 
    fill = 'tozeroy', 
    fillcolor = 'aquamarine') %>% 
    add_trace(
    x = ~X, 
    y = ~Thing_2, 
    name = 'Thing 2', 
    fill = 'tonexty', 
    fillcolor = 'orange') %>% 
    add_trace(
    x = ~X, 
    y = ~Thing_3, 
    name = 'Thing 3', 
    fill = 'tonexty', 
    fillcolor = 'gray') 

有沒有人能夠成功地做到這一點?謝謝!

編輯澄清:我知道可以首先做一個cumsum,然後創建圖表,但仍然欣賞響應!我想知道是否可以在圖表內進行總和,以使其表現得像堆疊酒吧一樣,點擊圖例去除一個組顯示剩餘組的總和。

回答

0

您可以通過將要堆疊的東西相加來計算堆疊區域的高度。然後繪製這些已經堆積的累積值。來自原始問題的「可重現」數據不具有可重複性,因此我在此展示一些新數據。

[注意,在本例中使用的plotly頁上的數據也被轉換成累計表這樣的 - https://plot.ly/r/filled-area-plots/#stacked-area-chart-with-cumulative-values]

set.seed(123) 
df.wide = data.frame(
    X = 100:105, 
    Thing_1 = cumsum(rnorm(6,10,3)), 
    Thing_2 = cumsum(rnorm(6,6,2)), 
    Thing_3 = cumsum(rnorm(6,3,1))) 

df.wide$T1 = df.wide$Thing_1 
df.wide$T2 = df.wide$Thing_1 + df.wide$Thing_2 
df.wide$T3 = df.wide$T2 + df.wide$Thing_3 

    plot_ly(df.wide, fill = 'tozeroy', line = list(color = '#00000000')) %>% 
    add_trace(x = ~X, y = ~T3, name = 'Thing 3', 
       type = 'scatter', mode = 'lines', fillcolor = 'green') %>% 
    add_trace(x = ~X, y = ~T2, name = 'Thing 2', 
       type = 'scatter', mode = 'lines', fill = 'tozeroy', fillcolor = 'blue') %>% 
    add_trace(x = ~X, y = ~T1, name = 'Thing 1', 
       type = 'scatter', mode = 'lines', fill = 'tozeroy', fillcolor = 'orange') 

enter image description here

+0

D'哦,對不起!實際上是一個獨立的例子。 (並在新鮮環境中確認) 另外,感謝您的回答!我希望有一個解決方案可以產生類似堆積的條形圖,其中不需要事先提供cumsum,用戶可以刪除一個組並查看三個項目中任意兩個項目的總和。 – kkd42

1

你可以調整你的數據使用累積總和的那個點的y值來計算堆積值,例如

library(plotly) 
library(tidyverse) 

     # group, sort (to keep cumulative sum in right order), and adjust Y 
df %>% group_by(X) %>% arrange(GroupName) %>% mutate(Y = cumsum(Y)) %>% 
    plot_ly(type = 'scatter', x = ~X, y = ~Y, color = ~GroupName, 
      mode = 'lines', fill = 'tonexty') 

stacked plotly area plot

+0

感謝您的回答!如果可能的話,我希望通過圖表發生疊加/總和,以產生類似堆積條形的解決方案,您可以在其中單擊以刪除組並查看剩餘兩組的總和,但如果可能,請執行此操作那是不可能的。 – kkd42

+0

公平;這種方法確實使得圖例交互性毫無價值。 – alistaire