0

次のデータセットをプロットしたい:

data<-list()
data$Year<-c(rep(1995,4),rep(2005,4))
data$Name<-as.factor(c("name1","name2","name3","name4","name1","name2","name3","name4"))
data$species<-as.factor(c("cat","cat","dog","dog","cat","cat","dog","dog"))
data$Value<-c(1,2,3,4,5,6,7,8)
data<-as.data.frame(data)

これは私の希望のプロットです

p<-ggplot(data, aes(x=Year, y=Value,fill=Name, colour=Name,linetype=species,shape=species))
p<-p+geom_point()
p<-p+geom_line()

しかし、私は別の伝説が欲しいです。まず、凡例には、正しい記号 (色、線種、および形状) を持つ「名前」ごとに 1 つのエントリが含まれている必要があります。次のようにすることでこれを実現できます(線種が正確に一致しません、申し訳ありません):

#Plot with better legend
gg_color_hue <- function(n) {
  hues = seq(15, 375, length=n+1)
  hcl(h=hues, l=65, c=100)[1:n]
}
p2<-ggplot(data, aes(x=Year, y=Value,fill=Name, colour=Name,linetype=Name,shape=Name))
p2<-p2+scale_linetype_manual(values=c(1,1,2,2),breaks=levels(data$Name),name="test")
p2<-p2+scale_shape_manual(values=c(16,16,17,17),breaks=levels(data$Name),name="test")
p2<-p2+scale_colour_manual(values=gg_color_hue(4),breaks=levels(data$Name),name="test")
p2<-p2+scale_fill_manual(values=gg_color_hue(4),breaks=levels(data$Name),name="test")
p2<-p2+geom_point(show_guide=T)
p2<-p2+geom_line(show_guide=T)

しかし、今では猫と犬の区別はありません。したがって、凡例(または本質的に2つの凡例)に字幕を付けたいと思います:このようなもの:

cats
symbol(name1) name1
symbol(name2) name2

dogs
symbol(name3) name3
symbol(name4) name4

誰かがこれについて私を助けることができますか? ありがとうございました。

4

1 に答える 1

0

Didzis Elferts は親切にも、パッケージ gridExtra を使用したソリューションが提供されているこのスレッドを教えてくれました。これは原則として私にとっては機能しますが (以下のコードを参照)、独自のライブラリ セットが既にあり、残念ながら gridExtra パッケージ (getNames) と競合するメソッドがいくつかあります。gridExtra パッケージに依存しない方法はありますか?

gridExtra を使用した例のコードは次のとおりです。

pcat<-ggplot(subset(data,species=="cat"), aes(x=Year, y=Value,fill=Name, colour=Name))+geom_point(shape=16)+geom_line(linetype=1)+guides(colour=guide_legend(title="cat"),shape=guide_legend(title="cat"),linetype=guide_legend(title="cat"),fill=guide_legend(title="cat"))
ppcat<-ggplot_gtable(ggplot_build(pcat))
legcat<-ppcat$grobs[[8]]

pdog<-ggplot(subset(data,species=="dog"), aes(x=Year, y=Value,fill=Name, colour=Name))+geom_point(shape=1)+geom_line(linetype=2)+guides(colour=guide_legend(title="dog"),shape=guide_legend(title="dog"),linetype=guide_legend(title="dog"),fill=guide_legend(title="dog"))
ppdog<-ggplot_gtable(ggplot_build(pdog))
legdog<-ppdog$grobs[[8]]

library(gridExtra)
grid.arrange(arrangeGrob(p,arrangeGrob(legcat,legdog),ncol=2,widths=c(4/5,1/5)))
于 2013-04-02T08:21:30.500 に答える