2017-12-09 11 views
2

サンプル・データがggplot2のファセット - ハイライト一致列

brand=c('MS', 'Google', 'Apple', 'MS', 'FB', 'Apple', 'Oracle') 
product=c('OS', 'Search', 'Iphone', 'Search', 'Network', 'OS', 'DB') 
df= data.frame(brand, product) 

を設定し、私はここに、ggplotを使用して、このグラフをプロットしています問題文の

この

brand product 
1  MS  OS 
2 Google Search 
3 Apple Iphone 
4  MS Search 
5  FB Network 
6 Apple  OS 
7 Oracle  DB 

ように見えますコード

library(dplyr) 
library(ggplot2) 
df %>% 
    group_by(brand) %>% 
    count(product, sort = TRUE) %>% 
    ggplot(aes(product, n)) + 
     geom_col() + 
     facet_wrap(~brand, ncol = 5, scales = "free_x") + 
     coord_flip() 

それが今、私たちは「検索」を参照することができ、この

のようなグラフを与えるの「Google」と「MS」の両方に共通で、「OS」は「MS」と「Appple」では一般的ですが、私はしたいです両方のバーを強調表示するにはどうすればいいのか分からないので、ggplot以外の他のグラフィカルインターフェイスでも可能であるかどうか教えてください。

enter image description here

答えて

1

一般的な原則は、あなたがその列を持っていたら、あなたが好きなアプローチ使用して描画することができjust like @PoGibas did.、あなたのデータフレームにカラーリング情報を保持する列を追加する必要があるなど、選択した方法がgeom_col()になります。

brand=c('MS', 'Google', 'Apple', 'MS', 'FB', 'Apple', 'Oracle') 
product=c('OS', 'Search', 'Iphone', 'Search', 'Network', 'OS', 'DB') 
df= data.frame(brand, product) 

# Define color  
df$myColor <- NA 
foo <- df$product %in% names(which(table(df$product) > 1)) 
df$myColor[foo] <- df$product[foo] 

df 
# brand product myColor 
#1  MS  OS  4 
#2 Google Search  5 
#3 Apple Iphone  NA 
#4  MS Search  5 
#5  FB Network  NA 
#6 Apple  OS  4 
#7 Oracle  DB  NA 

以下は、オリジナルのプロットコードです。わずかに変更されています。ベンダーごとに各製品を1回しか持っていない場合は、カウントするコードを追加するのではなく、aes()ステートメントにy = 1を設定することをお勧めします。

library(dplyr) 
library(ggplot2) 
ggplot(df, aes(x = product, y = 1, fill = factor(myColor))) + 
    geom_col() + 
    facet_wrap(~brand, ncol = 5, scales = "free_x") + 
    guides(fill = "none") + 
    coord_flip() 

enter image description here

そして今、我々は物事が良く見えるようにテーマを少しいじっすることができます。

ggplot(df, aes(x = brand, y = product, fill = factor(myColor))) + 
    geom_tile(width = 0.9, height = 0.9) + 
    guides(fill = "none") + 
    scale_x_discrete(name = "", position = "top") + 
    scale_y_discrete(name = "") + 
    theme(panel.grid.major = element_blank(), 
     panel.grid.minor = element_blank(), 
     axis.ticks = element_blank(), 
     axis.text = element_text(color = "black"), 
     panel.background = element_rect(fill="gray95")) 

enter image description here:あなたが使用したりgeom_point() @PoGibasにより示唆されるように、しかしgeom_tile()しかし

ggplot(df, aes(x = product, y = 1, fill = factor(myColor))) + 
    geom_col() + 
    facet_wrap(~brand, ncol = 5) + 
    guides(fill = "none") + 
    scale_y_continuous(breaks = NULL, name = "") + 
    scale_x_discrete(expand = c(0, 0)) + 
    coord_flip() + 
    theme(panel.grid.major = element_blank(), 
     panel.grid.minor = element_blank(), 
     axis.ticks = element_blank(), 
     axis.text = element_text(color = "black"), 
     strip.background = element_blank(), 
     panel.background = element_rect(fill="gray95", color="gray95"), 
     panel.spacing = unit(0, "pt")) 

enter image description here

、このアプリケーションのための正しいGEOMは、私の心の中で、どちらもgeom_col()です

geom_tile()を使用すると、塗りつぶし領域の高さと幅、プロットのサイズを変更したりアスペクト比を変更すると、奇妙な驚きはありません。

+0

説明、素晴らしい答えをありがとう... – Vineet

2

この問題への私のアプローチ:代わりに、ファセットのgeom_point()を使用し、同じ製品が複数ある場合の色を指定するには、(また、いくつかのマイナーな視覚的なひねりを加えました)。

library(ggplot2) 

# Define color  
df$myColor <- NA 
foo <- df$product %in% names(which(table(df$product) > 1)) 
df$myColor[foo] <- df$product[foo] 

ggplot(df, aes(brand, product, color = myColor)) + 
    geom_point(shape = 15, size = 20) + 
    scale_color_brewer(guide = FALSE, palette = "Dark2", na.value = "grey") + 
    labs(x = NULL, 
     y = NULL) + 
    theme_classic() + 
    theme(axis.ticks = element_blank(), 
      axis.text = element_text(size = 15, color = "black")) 

enter image description here

+0

大変ありがとうございます。私のために働きます – Vineet

+0

@PoGibasあなたのコードは掲載されていません(エラー:連続した値が離散スケールに供給されています)。'color = myColor'を' color = factor(myColor) 'に置き換える必要があります。 –

関連する問題