2017-08-09 3 views
0

betadispersオブジェクトmod1をプロットするためにggplot()を使用して、色をよりよく制御できるようにしようとしています。ggplot geom_pointとgeom_segのための別の色

私はmod1から重心を抽出して、私は重心をプロットするために、各砂丘つ星の行をプロットするgeom_seg()、各砂丘の年間反復をプロットするためgeom_point()を使用して、第二geom_point()声明ています。 scale_colour_manual(values=cols, guide= FALSE) を使用してプロットすると、最初のgeom_pointsとgeom_segの色が変更されますが、重心は変更されません。

砂丘地点がcolsで、セグメントの色がcols1、重心がcols2であるように、各コンポーネントの色を個別に制御するにはどうすればよいですか? また、各重心の黒い輪郭の色をcols1に変更したいと思います。

library(vegan) 
library(ggplot2) 

cols = c("blue","red") 
cols1 = c("green","dark orange") 
cols2 = c("purple","yellow") 

data(dune) 
sites = data.frame(year = rep(c(1:5), times= 4), dune = rep(c(1:4),each=5), dune.type = rep(c("A","B"),each=10)) 
distances <- vegdist(dune, method = "bray") 

#create Betadispersion model on betad (effectively a PCoA) 
mod1 <- with(sites, betadisper(distances, dune, type = "centroid")) 
s = scores(mod1) 

# Get points 
pnt_sites = as.data.frame(s$sites) 
pnt_sites = cbind(pnt_sites, sites) 

# Get centroids 
pnt_centroids = as.data.frame(s$centroids) 
pnt_centroids$dune = rownames(pnt_centroids) 
pnt_centroids$dune.type = rep(c("A","B"),each=2) 

# Calculate segments 
seg = pnt_sites[, c("PCoA1", "PCoA2", "dune")] 
tmp = rename(pnt_centroids, c("PCoA1" = "PCoA1_ctr", "PCoA2" = "PCoA2_ctr")) 
seg = join(seg, tmp, "dune") 

# Plot 
ggplot() + 
    geom_point(
    data = pnt_sites, 
    aes(x = PCoA1, y = PCoA2, colour = dune.type, shape = dune.type), 
    size = 2 
) + 
    geom_segment(
    data = seg, 
    aes(x = PCoA1, y = PCoA2, xend = PCoA1_ctr, yend = PCoA2_ctr, colour = 
     dune.type) 
) + 
    geom_point(
    data = pnt_centroids, 
    aes(x = PCoA1, y = PCoA2, fill = dune.type), 
    size = 3, shape = 21 
) + 
    scale_colour_manual(values=cols, guide= FALSE) + 
    coord_equal() + 
    theme_bw() 

答えて

1

あなただけが1つのデータフレーム(重心/サイトのための変数を追加することにあなたの重心やサイトを結合する必要がありますプロットに一回ではなく、各geom_point呼び出し用に複数回、ようscale_colour_manual()を指定することができ、かつ重心A /重心B /サイトA /サイトB)は、単一geom_point()

#combine centroids and points into one dataframe 
pnt_centroids$year = NA 
pnt_centroids$data.type = "centroid" 
pnt_sites$data.type = "site" 
sites_centroids <- rbind(pnt_centroids, pnt_sites) 
sites_centroids$type <- paste(sites_centroids$data.type, sites_centroids$dune.type) 

としてプロットあなたが持っている変数の数と一致するように、それぞれが6つのレベルを持つことになり、scale_fill_manualscale_colour_manualに使用する色のベクトルを定義すると( 4点タイプと2セグメントタイプ)。あなたのサイトポイントとセグメントには塗りつぶし属性がないので、塗りつぶしは無視されますが、十字の塗りつぶしポイントが適切にプロットされるように、scale_fill_manualに6色を定義する必要があります。

#change the cols vector definitions at the beginning of code to this 
cols.fill <- c("purple", "yellow", "purple", "yellow", "purple", "yellow") 
cols.colour <- c("green", "dark orange", "green", "dark orange", "blue", "red") 

、新しい色を指定して記入し、このようなプロットコードでスケールを形作る:ここ

# Plot 
ggplot() + 
    geom_segment(#segment must go before point so points are in front of lines 
    data = seg, 
    aes(x = PCoA1, y = PCoA2, xend = PCoA1_ctr, yend = PCoA2_ctr, colour = dune.type)) + 
    geom_point(
    data = sites_centroids, 
    aes(x = PCoA1, y = PCoA2, colour = type, fill = type, shape = type), size = 2) + 
    scale_colour_manual(values = cols.colour) + 
    scale_fill_manual(values = cols.fill, guide = FALSE) + 
    scale_shape_manual(values = c(21, 21, 16, 17)) + 
    coord_equal() + 
    theme_bw() 

は結果です。伝説はちょっと忙しいですが、それを削除し、砂丘の種類にラベルを付けるためにテキスト注釈を使用する方が良いかもしれません。

enter image description here

関連する問題