2017-08-15 5 views
0

私は、棒グラフの2つの離散変数をそれぞれfillalphaを使ってggplot2で視覚化しようとしています。次のようにこれを行うための標準的な方法がある:rggplot2:棒グラフのグループ化の凡例

#creating data and building the basic bar plot 
library(ggplot2) 
myleg<-read.csv(text="lett,num 
a,1 
a,2 
b,1 
b,2 
h,1 
h,2 
h,3 
h,4") 
ggplot(myleg,aes(lett,alpha=factor(num),fill=lett)) +geom_bar(position=position_stack(reverse=T)) +scale_alpha_discrete(range=c(1,.1), name="alpha legend",labels=c("alpha lab 4","alpha lab 3","alpha lab 2", "alpha lab 1")) +labs(title="initial bar plot for data") 

initial bar plot of data

デフォルトの凡例を提示(LETT及びグレースケールの着色、またはnumの不透明度)の二つの異なる方法に従ってグループ化されます。

私はプロット上にデータバーとして凡例をグループ化する必要があります。すなわち3つのカラーストリップを含み、それぞれがアルファレベルを変化させる。部分的な解決策は、次のように別々に所望の三の凡例ストリップでプロットを生成することである。

ggplot(myleg,aes(lett,alpha=factor(num),fill=lett)) +geom_bar(position="stack",fill="#f8766d") +scale_alpha_discrete(name="red legend",labels=c("red lab 2","red lab 1"),breaks=c("3","4")) 
ggplot(myleg,aes(lett,alpha=factor(num),fill=lett)) +geom_bar(position="stack",fill="#00ba38") +scale_alpha_discrete(name="green legend",labels=c("green lab 2","green lab 1"),breaks=c("3","4")) 
ggplot(myleg,aes(lett,alpha=factor(num),fill=lett)) +geom_bar(position="stack",fill="#619cff") +scale_alpha_discrete(name="blue legend",labels=c("blue lab 4","blue lab 3","blue lab 2", "blue lab 1")) 

出力である: artificially created plots with needed legend strips

だから、今の私は主グラフに3つの凡例ストリップを切断して貼り付けることができまともな方法でこれをプログラムすることが可能である方法

final plot with desired legend

:、例えば、Inkscapeの中で、所望の結果を得るには?

+0

マルコの答えは、それを行うには「正しい」方法ですが、特に手間のかかる数字のために、いくつかの時点でInkscapeの中でそれを行うのあなたの方法は、より良く、よりカスタマイズ可能な方法です。 – Brian

+0

@astrskによって投稿された新しい問題の解決策を提案した私の回答を編集しました –

答えて

4

あなたはscale_fill_manualを使用してカスタマイズされた凡例を描画することができます:

df <- mtcars 
df$cyl <- factor(df$cyl) 
df$vs <- factor(df$vs) 

library(ggplot2)  
p <- ggplot(df,aes(x=cyl, fill=interaction(cyl,vs))) + geom_bar(position="stack") 

# Breaks 
brks <- levels(interaction(df$cyl,df$vs)) 

# Values - Colors 
library(scales) 
pal <- hue_pal()(3) 
cls <- as.character(c(sapply(pal,alpha,0.3),sapply(pal,alpha,1))) 

# Labels 
lbls <- paste(levels(df$cyl), "-", rep(levels(df$vs),each=3)) 

p + scale_fill_manual(name ='Cyl - Vs', breaks=brks, values=cls, labels=lbls) 

enter image description here

EDITここではの彼/彼女の変更後(@astrskにより投稿(新)問題の解決策です最初の質問)。以下

library(ggplot2) 
library(grid) 
library(gridExtra) 
myleg <- structure(list(lett = structure(c(1L, 1L, 2L, 2L, 3L, 3L, 3L, 
3L), .Label = c("a", "b", "h"), class = "factor"), num = c(1L, 
2L, 1L, 2L, 1L, 2L, 3L, 4L)), .Names = c("lett", "num"), 
class = "data.frame", row.names = c(NA, -8L)) 

getLegend <- function(p) { 
    g <- ggplotGrob(p) 
    k <- which(g$layout$name=="guide-box") 
    g$grobs[[k]] 
} 

p1 <- ggplot(myleg,aes(lett,alpha=factor(num),fill=lett)) +geom_bar(position="stack",fill="#f8766d") +scale_alpha_discrete(name="red legend",labels=c("red lab 2","red lab 1"),breaks=c("3","4")) 
p2 <- ggplot(myleg,aes(lett,alpha=factor(num),fill=lett)) +geom_bar(position="stack",fill="#00ba38") +scale_alpha_discrete(name="green legend",labels=c("green lab 2","green lab 1"),breaks=c("3","4")) 
p3 <- ggplot(myleg,aes(lett,alpha=factor(num),fill=lett)) +geom_bar(position="stack",fill="#619cff") +scale_alpha_discrete(name="blue legend",labels=c("blue lab 4","blue lab 3","blue lab 2", "blue lab 1")) 

p <- ggplot(myleg,aes(lett,alpha=factor(num),fill=lett)) + 
    geom_bar(position=position_stack(reverse=T)) + 
    scale_alpha_discrete(range=c(1,.1), name="alpha legend", 
     labels=c("alpha lab 4","alpha lab 3","alpha lab 2", "alpha lab 1")) + 
    labs(title="initial bar plot for data") 
g <- ggplotGrob(p) 

k <- which(g$layout$name=="guide-box") 
g$grobs[[k]] <- grid.arrange(getLegend(p1),getLegend(p2),getLegend(p3),ncol=1) 
grid.draw(g) 

enter image description here

+0

あなたの答えは両方とも "正しい"方法です:) gtablesから伝説を引っ張ってもかなり滑らかです! – Brian

関連する問題