2017-07-04 4 views
0

ggplot2を使って作成したプロットは、マイナーグリッド線の一部を修正しようとしています。離散値とファセットグリッドを持つggplot2のマイナーグリッド線

library(tidyverse) 

data(starwars) 
starwars = starwars %>% 
    filter(!is.na(homeworld), !is.na(skin_color)) %>% 
    mutate(tatooine = factor(if_else(homeworld == "Tatooine", "Tatooine Native", "Other Native")), 
     skin_color = factor(skin_color)) 

ggplot(starwars, aes(birth_year, skin_color)) + 
    geom_point(aes(color = gender), size = 4, alpha = 0.7, show.legend = FALSE) + 
    facet_grid(tatooine ~ ., scales = "free_y", space = "free_y", switch = "y") + 
    theme_minimal() + 
    theme(
    panel.grid.major.x = element_blank(), 
    panel.grid.major.y = element_blank(), 
    axis.title.x = element_blank(), 
    axis.title.y = element_blank(), 
    strip.placement = "outside", 
    strip.background = element_rect(fill="gray90", color = "white"), 
) + 
    geom_hline(yintercept = seq(0, length(unique(starwars$skin_color))) + .5, color="gray30") 

Y軸はファクタで、ファセットグリッドが使用され、各グリッド内に不均一なカテゴリ数があります。私はgeom_hlineを使ってマイナーなグリッド線を追加しました(私の理解は、panel.grid.minorはカテゴリデータ、つまり因子では機能しません)。

下の黄色の線を削除し、2つのファセットグリッドの間に1本の黒線を追加します(つまり、現在の二重線は黄色で強調表示されています)。

これを行う方法はありますか?私は、データが変更された場合に、任意の行の位置を厳密にコーディングすることを避けることを好むでしょう。ありがとう。動的頂部および底部のグリッド線を取り外し

enter image description here

答えて

0

比較的容易です。ファセットグループに基づいてデータセット内の行位置をコード化し、最高値と最低値を除外してxinterceptaes()文内に入れてプロットします。このアプローチはデータを変更することで堅牢です(データを変更した場合はこのアプローチが有効であることを確認し、下記の# filter(!is.na(birth_year))行をコメントアウトしてください)。

library(tidyverse) 
library(grid) 

data(starwars) 
starwars = starwars %>% 
    filter(!is.na(homeworld), !is.na(skin_color)) %>% 
    mutate(tatooine = factor(if_else(homeworld == "Tatooine", "Tatooine Native", "Other Native")), 
     skin_color = factor(skin_color)) %>% 
    # filter(!is.na(birth_year)) %>% 
    group_by(tatooine) %>% 

    # here we assign the line_positions 
    mutate(line_positions = as.numeric(factor(skin_color, levels = unique(skin_color))), 
     line_positions = line_positions + .5, 
     line_positions = ifelse(line_positions == max(line_positions), NA, line_positions)) 


plot_out <- ggplot(starwars, aes(birth_year, skin_color)) + 
    geom_point(aes(color = gender), size = 4, alpha = 0.7, show.legend = FALSE) + 
    geom_hline(aes(yintercept = line_positions)) + 
    facet_grid(tatooine ~ ., scales = "free_y", space = "free_y", switch = "y") + 
    theme_minimal() + 
    theme(
    panel.grid.major.x = element_blank(), 
    panel.grid.major.y = element_blank(), 
    panel.grid.minor.y = element_line(colour = "black"), 
    axis.title.x = element_blank(), 
    axis.title.y = element_blank(), 
    strip.placement = "outside", 
    strip.background = element_rect(fill="gray90", color = "white"), 

) 

print(plot_out) 

enter image description here

を与えるしかし、任意のハードコーディングすることなく、ファセット間の固体を追加することは困難です。ファセット間に罫線を追加する方法はいくつかありますが(here参照)、ファセットが変更されているかどうかわからない場合は、どの値に境界を割り当てるべきかはわかりません。私はファセットを分割するプロットにハードコーディングされた線を描画する可能性のある解決策があると思いますが、面倒な部分は、その境界がどこにあるかを動的に決定することです(データとファセットを最終的に描画する方法例えば、順序など)。私はこれに関する他の意見を聞くことに興味があります。

関連する問題