web-dev-qa-db-ja.com

2つのgeom_pointsが凡例を追加します

次のコードで2 geom_pointグラフをプロットします。

source("http://www.openintro.org/stat/data/arbuthnot.R")
library(ggplot2)
ggplot() +
  geom_point(aes(x = year,y = boys),data=arbuthnot,colour = '#3399ff') +
  geom_point(aes(x = year,y = girls),data=arbuthnot,shape = 17,colour = '#ff00ff') +
  xlab(label = 'Year') +
  ylab(label = 'Rate')

右側に凡例を追加する方法を知りたいだけです。同じ形と色で。三角形のピンクには「女性」という凡例があり、青い円には「男性」という凡例があります。非常に単純なようですが、多くの試行の後、私はそれを行うことができませんでした。 (私はggplotの初心者です)。

enter image description here

14
S12000

元のデータフレームの列の名前を変更してから、長い形式に溶けた場合withreshape2::melt、ggplot2で処理する方がはるかに簡単です。 colorおよびshape aestheticsをggplotコマンドで指定し、色と形状のスケールを手動で指定すると、凡例が表示されます。

source("http://www.openintro.org/stat/data/arbuthnot.R")
library(ggplot2)
library(reshape2)

names(arbuthnot) <- c("Year", "Men", "Women")

arbuthnot.melt <- melt(arbuthnot, id.vars = 'Year', variable.name = 'Sex', 
    value.name = 'Rate')

ggplot(arbuthnot.melt, aes(x = Year, y = Rate, shape = Sex, color = Sex))+
geom_point() + scale_color_manual(values = c("Women" = '#ff00ff','Men' = '#3399ff')) + 
scale_shape_manual(values = c('Women' = 17, 'Men' = 16))

enter image description here

16
Jim M.

これは、reshape :: meltを使用せずにこれを行う方法です。 reshape :: meltは機能しますが、ラインセグメントなどの他のものをグラフに追加する場合は、バインドに入ることができます。以下のコードは、元のデータ構成を使用しています。凡例を変更する鍵は、scale_color_manual(...)とscale_shape_manual(...)の引数が同じであることを確認することです。そうでない場合、2つの凡例が表示されます。

source("http://www.openintro.org/stat/data/arbuthnot.R")
library(ggplot2)
library(reshape2)



ptheme <- theme (
  axis.text            = element_text(size = 9),              # tick labels
  axis.title           = element_text(size = 9),              # axis labels
  axis.ticks           = element_line(colour = "grey70", size = 0.25),
  panel.background     = element_rect(fill = "white", colour = NA),
  panel.border         = element_rect(fill = NA, colour = "grey70", size = 0.25),
  panel.grid.major     = element_line(colour = "grey85", size = 0.25),
  panel.grid.minor     = element_line(colour = "grey93", size = 0.125),
  panel.margin         = unit(0 , "lines"),
  legend.justification = c(1, 0), 
  legend.position      = c(1, 0.1),
  legend.text          = element_text(size = 8),
  plot.margin          = unit(c(0.1, 0.1, 0.1, 0.01), "npc")   # c(bottom, left, top, right), values can be negative
)

cols    <- c( "c1" = "#ff00ff", "c2" = "#3399ff" )
shapes  <- c("s1" = 16, "s2" = 17)

p1 <- ggplot(data = arbuthnot, aes(x = year))
p1 <- p1 + geom_point(aes( y = boys,  color = "c1", shape = "s1"))
p1 <- p1 + geom_point(aes( y = girls, color = "c2", shape = "s2")) 
p1 <- p1 + labs( x = "Year", y = "Rate" )
p1 <- p1 + scale_color_manual(name = "Sex", 
                                breaks = c("c1", "c2"), 
                                values = cols,
                                labels = c("boys", "girls"))
p1 <- p1 + scale_shape_manual(name = "Sex", 
                              breaks = c("s1", "s2"),
                              values = shapes,
                              labels = c("boys", "girls"))
p1 <- p1 +  ptheme

print(p1)

出力結果

8
Ken Junk

これがtidyverseパッケージに基づく回答です。パイプ、_%>%_を使用して関数をチェーンできます。 1つの継続的な方法でプロットを作成すると、一時的に変数を作成する必要がなくなります。パイプの詳細はこの投稿で確認できます Rで%>%関数はどういう意味ですか?

私の知る限り、ggplot2の凡例は美的変数にのみ基づいています。したがって、個別の凡例を追加するには、カテゴリ列を使用し、カテゴリに応じて美学を変更します。 ggplotでは、これはたとえばaes(color=category)によって行われます。

したがって、データフレームの2つ(またはそれ以上)の異なる変数を凡例に追加するには、データ列を変換して、どの列(変数)がプロットされているかを示すカテゴリ列と、実際に保持する2番目の列を用意する必要があります値。 tidyverseによってもロードされた_tidyr::gather_関数は、まさにそれを実行します。

次に、どの美的変数を変える必要があるかを指定するだけで、凡例を作成します。この例では、コードは次のようになります。

_source("http://www.openintro.org/stat/data/arbuthnot.R")
library(tidyverse)

arbuthnot %>%
    rename(Year=year,Men=boys,Women=girls) %>%
    gather(Men,Women,key = "Sex",value = "Rate") %>%
    ggplot() +
    geom_point(aes(x = Year, y=Rate, color=Sex, shape=Sex)) +
    scale_color_manual(values = c("Men" = "#3399ff","Women"= "#ff00ff")) +
    scale_shape_manual(values = c("Men" = 16, "Women" =  17))
_

tidyverseパッケージも_ggplot2_パッケージに自動的にロードされることに注意してください。インストールされているパッケージの概要は、Webサイト tidyverse.org にあります。

上記のコードでは、_dplyr::rename_(tidyverseによってもロードされる)関数を使用して、最初に列の名前を目的のラベルに変更しました。凡例は自動的にカテゴリ名と等しいラベルを取得するため。

凡例のラベルの名前を変更する2つ目の方法があります。これには、_scale_aesthetic_manual_引数によって_labels =_関数でラベルを明示的に指定する必要があります。例は legends cookbook を参照してください。ただし、変数が増えるとすぐに乱雑になるため、お勧めしません。

0
Escalen