web-dev-qa-db-ja.com

Rで複数のカテゴリ変数を使用して平行座標をプロットする方法

GGallyパッケージのggparcoordを使用して平行座標プロットをプロットするときに、問題が発生します。 2つのカテゴリ変数があるため、視覚化で表示したいのは下の画像のようです。 ggparcoordでは、groupColumn単一の変数にのみ許可されていることがわかりました。 =でグループ化(色)し、確かにshowPointsを使用して軸の値をマークできますが、カテゴリ変数に従ってこれらのマーカーの形状を変更する必要もあります。私のアイデアを実現するのに役立つ他のパッケージはありますか?

どんな回答でも大歓迎です!ありがとう!

university and country are two categories

10
Lexi

Ggplot2で独自の平行座標プロットをロールすることはそれほど難しくありません。これにより、美学をカスタマイズする柔軟性が得られます。以下は、組み込みのdiamondsデータフレームを使用した図です。

平行座標を取得するには、ID列を追加して、データフレームの各行を識別できるようにする必要があります。これは、ggplotでgroup美学として使用されます。また、数値をscaleして、プロットするときにすべて同じ垂直スケールになるようにする必要があります。次に、x軸に必要なすべての列を取得し、それらを「長い」形式に再形成する必要があります。以下のすべてをtidyverse/dplyrパイプ演算子を使用してオンザフライで実行します。

カテゴリの組み合わせの数を制限した後でも、線が絡みすぎてこのプロットを簡単に解釈できない可能性があるため、これは単なる「概念実証」と見なしてください。うまくいけば、データを使ってもっと便利なものを作成できます。以下のcolour(線の場合)とfill(点の場合)の美学を使用しました。必要に応じて、代わりにshapeまたはlinetypeを使用できます。

library(tidyverse)
theme_set(theme_classic())

# Get 20 random rows from the diamonds data frame after limiting
#  to two levels each of cut and color
set.seed(2)
ds = diamonds %>% 
  filter(color %in% c("D","J"), cut %in% c("Good", "Premium")) %>%
  sample_n(20)

ggplot(ds %>% 
         mutate(ID = 1:n()) %>%             # Add ID for each row
         mutate_if(is.numeric, scale) %>%   # Scale numeric columns
         gather(key, value, c(1,5:10)),     # Reshape to "long" format
       aes(key, value, group=ID, colour=color, fill=cut)) +
  geom_line() +
  geom_point(size=2, shape=21, colour="grey50") +
  scale_fill_manual(values=c("black","white"))

enter image description here

以前はggparcoordsを使用したことがありませんが、(少なくともこの関数を最初に試したときは)簡単に思えた唯一のオプションは、2列のデータを貼り付けることでした。以下に例を示します。カテゴリの組み合わせが4つしかない場合でも、プロットはわかりにくいですが、データに強いパターンがある場合は解釈できる可能性があります。

library(GGally)

ds$group = with(ds, paste(cut, color, sep="-"))

ggparcoord(ds, columns=c(1, 5:10), groupColumn=11) +
  theme(panel.grid.major.x=element_line(colour="grey70"))

enter image description here

4
eipi10