2016-07-07 14 views
0

ggplot2を使うことを学んだことがありますが、私が使っているデータセットでうまく動作するようにする方法が分かりません。私はここに私の実際のデータを掲載することはできませんが、それがどのようなものかの簡単な例を与えることができます。私は2つの主要なデータフレームを持っています。 1つはさまざまな企業の四半期の総収益を含み、もう1つは各社のさまざまなセグメントの四半期収益を含んでいます。たとえば、次のように複数の時系列とggplot2

Quarter, CompA, CompB, CompC... 
2011.0, 1, 2, 3... 
2011.25, 2, 3, 4... 
2011.5, 3, 4, 5... 
2011.75, 4, 5, 6... 
2012.0, 5, 6, 7... 

Quarter, CompA_Footwear, CompA_Apparel, CompB_Wholesale... 
2011.0, 1, 2, 3... 
2011.25, 2, 3, 4... 
2011.5, 3, 4, 5... 
2011.75, 4, 5, 6... 
2012.0, 5, 6, 7... 

私は、最初の表では、各会社を通じてループを構築し、第二のテーブルのすべての列をつかむために()を選択し使用してきたスクリプトこの質問の目的のために、他の会社については忘れて、最初の表はCompAだけであり、2番目の表はすべて異なるCompAの部分であると仮定します。

私がしようとしているのは、セグメントごとに、全社収益とセグメント収益が時間の経過とともにチャート化されたラインプロットを作成することです。 thisのようなものは、それがどのように見えるかです。理想的には、facet_wrap()や何かを使って、各セグメントのすべての異なるグラフを一度に作ることができるようにしたいと考えていますが、それは絶対に必要というわけではありません。明確にするために、個々のグラフには、会社全体と特定のセグメントの2つの線のみが必要です。

私は、必要な方法でデータを再構成する必要はありません。私はこれをどのように働かせることができるか知っていますか?

+5

あなたは本当に最小限の[再現可能な例]を提供する必要があります(http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example)(部分データと... i非常に役に立たない)。あなたがすでに試したコードを表示して、どこに止まっているのか正確に説明してください。それぞれの面ではどういうことでしょうか?最初の表のCompA列は、2番目の表のすべてのセグメントの合計にすぎませんか? – MrFlick

+0

@MrFlick私の主な問題は、私のデータが2つの異なるテーブルから来ているという事実に問題があることです。私はそれらを組み合わせてみましたが、それは本当に私を助けてくれていません。理想的には、私は各面を全体のデータと別のセグメントのグラフにすることができるようにしたいと思います。私はちょうど各社のすべてのグラフのグリッドを作成するために探しています。そして、いいえ、最初の表の列は必ずしも2番目の表のセグメントの合計ではありません。 –

+0

複数のレイヤー/ジオメトリを追加することができ、それぞれ異なるデータセットからそれぞれを取り出すことができます。それには問題はないはずです。 – MrFlick

答えて

1

私は以下がうまくいくと思います。公正なビットの周りにデータを移動する必要があることに注意してください。

# Load packages 
library(dplyr) 
library(ggplot2) 
library(reshape2) 
library(tidyr) 

再現性のあるデータセットを作成します:あなたが欲しいと言う

# Create companies 
# Could pull this from column names in your data 
companies <- paste0("Comp",LETTERS[1:4]) 

set.seed(12345) 

sepData <- 
    lapply(companies, function(thisComp){ 
    nDiv <- sample(3:6,1) 
    temp <- 
     sapply(1:nDiv,function(idx){ 
     round(rnorm(24, rnorm(1,100,25), 6)) 
     }) %>% 
     as.data.frame() %>% 
     setNames(paste(thisComp,sample(letters,nDiv), sep = "_")) 
    }) %>% 
    bind_cols() 

sepData$Quarter <- 
    rep(2010:2015 
     , each = 4) + 
    (0:3)/4 

meltedSep <- 
    melt(sepData, id.vars = "Quarter" 
     , value.name = "Revenue") %>% 
    separate(variable 
      , c("Company","Division") 
      , sep = "_") %>% 
    mutate(Division = factor(Division 
          , levels = c(sort(unique(Division)) 
             , "Total"))) 

fullCompany <- 
    meltedSep %>% 
    group_by(Company, Quarter) %>% 
    summarise(Revenue = sum(Revenue)) %>% 
    mutate(Division = factor("Total" 
          , levels = levels(meltedSep$Division))) 

プロットはこちらです。それは一種の恐ろしい見えると、

enter image description here

ただし:出力の

theme_set(theme_minimal()) 

catch <- lapply(companies, function(thisCompany){ 
    tempPlot <- 
    meltedSep %>% 
    filter(Company == thisCompany) %>% 
    ggplot(aes(y = Revenue 
       , x = Quarter)) + 
    geom_line(aes(col = "Division")) + 
    facet_wrap(~Division) + 
    geom_line(aes(col = "Total") 
       , fullCompany %>% 
       filter(Company == thisCompany) %>% 
       mutate(Division = NULL) 
      ) + 
    ggtitle(thisCompany) + 
    scale_color_manual(values = c(Division = "darkblue" 
            , Total = "green3")) 
    print(tempPlot) 
}) 

例:あなたは、独自の面に現れてからの合計を防ぐためにDivison = NULLを設定する必要があることに注意してください。 「合計」と1つの部門の差は常に大きくなります。代わりに、あなただけの1つのプロット上のすべての部門をプロットすることもできます。

allData <- 
    bind_rows(meltedSep, fullCompany) 

catch <- lapply(companies, function(thisCompany){ 
    tempPlot <- 
    allData %>% 
    filter(Company == thisCompany) %>% 
    ggplot(aes(y = Revenue 
       , x = Quarter 
       , col = Division)) + 
    geom_line() + 
    ggtitle(thisCompany) 
    # I would add manual colors here, assigned so that, e.g. "Clothes" is always the same 
    print(tempPlot) 
}) 

例:

enter image description here

合計と各間の差は依然として大きいが、少なくともあなたは比較することができます部門。

もしそれが私のものだったら、私はおそらく2つのプロットを作っています。各企業(ファセット)から各部門で一つと合計で1:

meltedSep %>% 
    ggplot(aes(y = Revenue 
      , x = Quarter 
      , col = Division)) + 
    geom_line() + 
    facet_wrap(~Company) 

enter image description here

fullCompany %>% 
    ggplot(aes(y = Revenue 
      , x = Quarter 
      , col = Company)) + 
    geom_line() 

enter image description here

1

私はfacet_wrap()それを使用してそれを行うに考えることができる他の二つの方法があります

  • を使用しています。 ggplot2中(単純なアプローチ)
  • (エラーにちょうどより多くなりやすい、まだ比較的簡単な)各企業のためのあなたのデータフレームを倍増

いずれかの方法で、私たちはあなたの例を再現できるように、のあなたの2つのデータフレームを作成し直してみましょう:

Quarter <- seq(2011, 2012, by = .25) 
CompA <- as.integer(runif(5, 5, 15)) 
CompB <- as.integer(runif(5, 6, 16)) 
CompC <- as.integer(runif(5, 7, 17)) 
df1 <- data.frame(Quarter, CompA, CompB, CompC) 

次に、A社の "セグメントの売上高" のデータフレーム:

まず "総会社の収入" データフレームを作成します

CompA_Footwear <- as.integer(runif(5, 0, 5)) 
CompA_Apparel <- as.integer(runif(5,1 , 6)) 
CompA_Wholesale <- as.integer(runif(5, 2, 7)) 
df2 <- data.frame(Quarter, CompA_Footwear, CompA_Apparel, CompA_Wholesale) 

は、今、私たちは、私たちは今、グラフをほとんど準備ができているreshape2

require(reshape2) 
melt.df1 <- melt(df1, id = "Quarter") 
melt.df2 <- melt(df2, id = "Quarter") 
df <- rbind(melt.df1, melt.df2) 

からするmelt()を使用してggplot2ためのより認識の何かを、あなたのデータを再arrageます。それが唯一のA社

CompA.df2 <- df[grep("CompA_", df$variable),] 
ための「セグメントの売上高」が含まれるように例のために、私は、「A社」 annotate()

サブセットデータを使用して



に焦点を当てます

これは、すべてのセグメント収益が「CompA_ *」で始まるコードであることを前提としています。あなたはあなたのデータに従ってサブセットを作らなければならないでしょう。

今プロット:

require(ggplot2) 
ggplot(data = CompA.df2, aes(x = Quarter, y = value, 
          group = variable, colour = variable)) + 
    geom_line() + 
    geom_point() + 
    theme(axis.text.x = element_text(angle = 90, hjust = 1)) + 
    facet_wrap(~variable) + # Facets by segment 
    # Next, adds the total revenue data as an annotation 
    annotate(geom = "line", x = Quarter, y = df1$CompA) + 
    annotate(geom = "point", x = Quarter, y = df1$CompA) 

基本的に、私たちはこれに主要な欠点は、の欠如であるA社のために独自の「全社収益の」データフレームからのラインとポイントをグラフに注釈をしています伝説

Plot using method 1

第2のアプローチは、

方法のfacet_wrap(あなたのデータを複製するすべての値



の凡例を作成します)作品、我々は同じ面を定義する必要があります各ファセット上の意図されたプロットされたラインのそれぞれについての変数。そこで、それぞれの「セグメント収益」レベルごとに総収益を再現し、これらのペアをまとめてグループ化します。

我々は合計A社の収益を分離しようとしていると、A社

CompA.df1 <- df[which(df$variable == "CompA"),] # Total Company A Revenue 
CompA.df2 <- droplevels(df[grep("CompA_", df$variable),]) # Segment Revenue of Company A 

のセグメント別売上高は、今どのように基づいてA社の総売上データフレームを繰り返して、上記と同じデータフレームを使用して「セグメント収益」

rep.CompA.df1 <- CompA.df1[rep(seq_len(nrow(CompA.df1)), nlevels(CompA.df2$variable)), ] 

ため、我々は持っている多くのレベルあなたはNA'sまたはNaN's

0123を持っている場合、これはエラーになりやすいかもしれませんここで、繰り返しデータフレームをマージし、ファセット変数(ここではfacet.var)を追加してこれらをペアにします。

CompA.df3 <- rbind(rep.CompA.df1, CompA.df2) 
CompA.df3$facet.var <- rep(CompA.df2$variable,2) 

これでグラフ作成の準備が整いました。あなたはまだgroup = variableを定義することができますが、今回は私たちはあなたが見ることができるように、新たにfacet.var

require(ggplot2) 
ggplot(data = CompA.df3, aes(x = Quarter, y = value, 
          group = variable, colour = variable)) + 
    geom_line() + 
    geom_point() + 
    theme(axis.text.x = element_text(angle = 90, hjust = 1)) + 
    facet_wrap(~facet.var) 

を作成し、我々は今、私たちの「総収入」は伝説に追加したにfacet_wrap()を設定します:

Plot 2 using second approach

そのプロットは本当に美しいです

関連する問題