2017-01-28 10 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の値を追加しません。単純にoverlaそれらのys。

# 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') 

誰でもこれを正常に実行できましたか?ありがとう!

編集のために編集:最初に熊手を行い、次にグラフを作成することは可能ですが、依然として回答に感謝しています。チャート内で合計を行うことができるかどうか、積み重ね棒のように振る舞い、グループを削除する凡例をクリックすると残りのグループの合計が表示されるかどうかは疑問です。

答えて

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'ああ、ごめんなさい!実際にはスタンドアロンの例になるように編集されています。 (新鮮な環境で確認された) また、あなたの答えに感謝します!私は、ユーザーがグループを削除して3つのアイテムのいずれか2つの合計を見ることができる事前に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

お返事ありがとうございます!可能であれば、積み重なった棒のようなソリューションを生み出すために、積み上げ/合計がチャートを通して起こることを望んでいました。そこでは、グループをクリックして残りの2つのグループの合計を見ることができますが、それは不可能です。 – kkd42

+0

フェア;このアプローチは、伝説のインタラクティビティを無価値にします。 – alistaire

関連する問題