基于ggplot2中的另一个因素的scale_fill_manual [英] scale_fill_manual based on another factor in ggplot2

查看:238
本文介绍了基于ggplot2中的另一个因素的scale_fill_manual的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我试图根据用于在ggplot2中填充我的geom_bar的因子更广泛的分类对我的图例进行颜色编码。我的情节看起来像这样:

ggplot(df,aes(year,TOTALshark,fill = fishery))+ geom_bar(width = .5,stat =identity,position =dodge) + facet_wrap(〜div)



以下是我的数据集的dput示例: pre> >输入(smp1)
df < - 结构(列表(s1)结构(列表(X1)结构(c(6L,11L,22L,27L,10L,10L,
6L,11L,6L,10L,8L,6L, 6L,4L,22L,18L,10L,10L,11L,6L
),标签= c(美国飞机,BIGEYE金枪鱼,BIVALVE,BLUEFIN金枪鱼 CAPELIN,COD(ATL),CRAB(SNOW,QUEEN),HADDOCK,HAGFISH(ATL),
HALIBUT(ATL),HALIBUT(GREENLAND) (ATL),JONAH CRAB(CANC.BOR。),
龙虾,LONGHORN SCULPIN,LUMPFISH,MACKEREL(ATL),MONKFISH,
PAND .BOR。,PAND.MON。,POLLOCK,REDFISH,SCALLOP,SEA URCHINS,
SEACU,SILVER HAKE,SWORDFISH,WHELK, 白色哈克,冬季粉红色,
WITCH FLOUNDER,YELLOWFIN TUNA,YELLOWTAIL FLOUNDER),class =factor),
X2 =结构(c(2L,2L ,8L,5L,5L,5L,5L,8L,5L,5L,
5L,2L,5L,5L,8L,2L,5L,5L,2L,2L),标签= c(Dredge ,
Gillnet,Hook,Jigger,Line,Seine,Trap,Trawlb,
Trawlm),class =factor =结构(c(1 2L,
25L,43L,50L,24L,24L,15L,27L,15L,24L,21L,12L,15L,
9L,43L,36L,24L,24L,25L,12L)标签= C( 美国的鲽鱼,刺网,
AMERICAN鲽鱼线, 美国的鲽鱼,Trawlb, 大眼金枪鱼,鱿鱼钓,
大眼金枪鱼行,BIVALVE- BLUEFIN TUNA-Hook,
BLUEFIN TUNA-JIGGER,BLUEFIN TUNA-Line,CAPELIN-Seine,
CAPELIN-Trap,COD(ATL) - Gillnet,COD(ATL)-Hook,COD(ATL)-Jigger,
COD(ATL) - 线性,COD(ATL)-Trap,COD(ATL) - 爬虫,CRAB(SNOW,QUEEN)-Trap,
CUSK-Line,HADDOCK-Gillnet,HADDOCK-Line,HADDOCK-Trawlb,
HAGFISH(ATL) -Trap 比目鱼(ATL) - 线路, 比目鱼(格陵兰)-Gillnet,
比目鱼(格陵兰) - 线路, 比目鱼(格陵兰)-Trawlb, HERRING(ATL) - 塞纳河
HERRING(ATL)-Trawlm, 北黄道蟹(CANC.BOR) - 陷阱, 龙虾陷阱,
为 Longhorn杜父鱼,Trawlb, 圆鳍鱼,刺网,MACKEREL(ATL)-Seine,
MACKEREL(ATL)-Trawlm,MONKFISH-G ,MONWFISH-Trawlb,
PAND.BOR.-Trawlb,PAND.MON.-Trawlb,POLLOCK-Gillnet,
POLLOCK-Trawlb,REDFISH-刺网 REDFISH-Trawlb, REDFISH-Trawlm,
扇贝疏通, 海胆,疏通, SEACU-疏通, SILVER HAKE-Trawlb,
SWORDFISH-Jigger,SWORDFISH-Line,SWORDFISH-UNK,WHELK-Trap,
白色HAKE-Gillnet,WHITE HAKE-Line,WINTER FLOUNDER-Gillnet,
WINTER FLOUNDER-Trawlb,WITCH FLOUNDER-Trawlb,YELLOWFIN TUNNA-Line,
YELLOWTAIL FLOUNDER-Trawlb),class =factor),year = c(2008L,
2008L,2009L,2009L,2008L,2009L,2009L,2008L,2006L,2007L,
2007L,2007L,2007L,2007L,2008L,2008L,2009L,2009L,2009L,
2009L),div =结构(c(6L,19L,2L,4L,5L,10L,3L,19L,
9L,10L,3L,9L,6L,4L,3L,9L,6L,11L,7L,9L), 。标签= c(5Z,
5Y,4X,4W,4V,4T,4S,4R,3P,3O 3N,
3M,3L,3K,2J,2H,2G,1F 0b 时, 1B, 0A
)中,类= 因子),TOTALshark = C(3369.72,12243.2,6080.06,
316646.05,18786.8,6565.91,1339771.2,45841.03,41329.64 ,
6411.86,204980.36,67608.78,2617.05,61547.64,447349.44,
13226.4,1362.55,6012.23,13152.51,1067.92),猫=结构(C(1L,
1L,1L,2L, 1L,1L,1L,1L,1L,1L,1L,1L,1L,2L,1L,1L,
1L,1L,1L,1L),.Label = c(底层鱼,largepelagic
bivalve,smallpelagic,crabs / lobsters,shrimps,others
),class =factor)),.Names = c(X1,X2 ,fishery,
year,div,TOTALshark,cat),class =data.frame,row.names = c(70L,
278L,500L ,554L,242L,245L,131L,315L,106L,224L,194L,60L,
115L,37L,489L,385L,249L,244L,284L,75L))
code >

我希望有相同的传说,但是有几种颜色是基于哪种类别的猫变量(即,远洋,底层鱼类)渔业跌入。

  library(ggplot2)
这是你想要的吗?库(plyr)
库(gridExtra)

#创建将每个'cat'与'fishery'链接的数据
#'cat'颜色将被用作手动设置填充颜​​色。

#获得'猫'颜色

#alt。 1:从阴谋对象获取'猫'颜色
#创建一个填充=渔业*和*颜色=猫
g1 < - ggplot(df,aes(x = year,y = TOTALshark, fill = fishery,color = cat))+
geom_bar(width = 0.5,stat =identity,position =dodge)+
facet_wrap(〜div)

g1

从绘图对象中为每个'fishery'抓取'cat'颜色
#用于手动填充
cat_cols< - unique(ggplot_build(g1)[[ data]] [[1]] $ color)

#unique'cat'
cat < - unique(df $ cat)

#create每个'猫'有一种颜色的数据框架
df2< - data.frame(cat = cat,cat_cols)
df2


#alt 2:创建你的自己的'猫'颜色
#独特的'猫'数量
n < - 长度(猫)

#每个'猫'从例如brewer_pal或其他调色板工具
cat_cols< - brewer_pal(type =qual)(n)
#cat_cols< - rainbow(n)

#每个'猫'一个颜色
df2< - data.frame(cat,cat_cols)
df2

#选择独特的'fishery'和'cat'组合
#按照它们在图例中显示的顺序排列,即按照渔业
df3< - 独特(排列(df [,c(渔业,猫),渔业)排序('排列'))
df3
$ b $#将'cat'颜色加入'fishery'
#使用'join'保存订单
df3 < - join(df3,df2)
df3

#以fishery填充的情节创建一个由渔业填充的比例,
#但颜色是使用scale_fill_manual手动设置的,而cat'颜色是从
g2 < - ggplot(df,aes(x = year,y = TOTALshark,fill = fishery))+
geom_bar(width = 0.5,stat =identity,position =dodge)+
facet_wrap(〜div,nrow = 5)+
scale_fill_manual(values = as.character(df3 $ cat_c ols))

g2



  '渔业'和'猫'的传说。 

#extract'fisheries'legend
tmp< - ggplot_gtable(ggplot_build(g2))
leg< - 其中(sapply(tmp $ grobs,function(x)x $ name)==guide-box)
legend_fish< - tmp $ grobs [[leg]]

#创建一个无意义图来获得一个'fill = cat 'legend
g3 < - ggplot(df,aes(x = year,y = TOTALshark,fill = cat))+
geom_bar(stat =identity)+
scale_fill_manual = as.character(df3 $ cat_cols))

#extract'cat'legend
tmp< - ggplot_gtable(ggplot_build(g3))
leg< - which(sapply (tmp $ grobs,function(x)x $ name)==guide-box)
legend_cat< - tmp $ grobs [[leg]]


#安排剧情和传说

library(gridExtra)

#在第一列中用grid.arrange快速和肮脏的
#,把剧情(g2) (删除使用'主题'代码)
#把第二列中的两个图例
grid.arrange(g2 + theme(legend.position =none),
arrangeG rob(legend_fish,legend_cat),ncol = 2)


#使用视口排列
#定义绘图区域(视口)
grid.newpage()
vp_plot <-viewport(x = 0.25,y = 0.5,
width = 0.5,height = 1)

vp_legend < - 视口(x = 0.75,y = 0.7,
width = 0.5,height = 0.5)

vp_sublegend < - viewport(x = 0.7,y = 0.25,
width = 0.5,height = 0.3)


print(g2 + theme(legend.position =none),vp = vp_plot)
upViewport(0)
$ b $ pushViewport(vp_legend)
grid.draw(legend_fish)

upViewport(0)
pushViewport(vp_sublegend)
grid.draw(legend_cat)



另请参阅@ mnel的答案这里来替换绘图对象中的值。这也值得在这里尝试。您也可以检查 gtable 方法来安排grob。

I am trying to color-code my legend based on a broader categorization of the factor used to "fill" my geom_bar in ggplot2. My plot looks like this: which I got using this R code:

ggplot(df, aes(year, TOTALshark, fill=fishery)) + geom_bar(width=.5,stat="identity", position="dodge")+ facet_wrap(~div)

Here is a dput sample of my dataset:

> dput(smpl)
df <- structure(list(X1 = structure(c(6L, 11L, 22L, 27L, 10L, 10L, 
6L, 11L, 6L, 10L, 8L, 6L, 6L, 4L, 22L, 18L, 10L, 10L, 11L, 6L
), .Label = c("AMERICAN PLAICE", "BIGEYE TUNA", "BIVALVE", "BLUEFIN TUNA", 
"CAPELIN", "COD(ATL)", "CRAB(SNOW,QUEEN)", "HADDOCK", "HAGFISH(ATL)", 
"HALIBUT(ATL)", "HALIBUT(GREENLAND)", "HERRING(ATL)", "JONAH CRAB (CANC.BOR.)", 
"LOBSTER", "LONGHORN SCULPIN", "LUMPFISH", "MACKEREL(ATL)", "MONKFISH", 
"PAND.BOR.", "PAND.MON.", "POLLOCK", "REDFISH", "SCALLOP", "SEA URCHINS", 
"SEACU", "SILVER HAKE", "SWORDFISH", "WHELK", "WHITE HAKE", "WINTER FLOUNDER", 
"WITCH FLOUNDER", "YELLOWFIN TUNA", "YELLOWTAIL FLOUNDER"), class = "factor"), 
    X2 = structure(c(2L, 2L, 8L, 5L, 5L, 5L, 5L, 8L, 5L, 5L, 
    5L, 2L, 5L, 5L, 8L, 2L, 5L, 5L, 2L, 2L), .Label = c("Dredge", 
    "Gillnet", "Hook", "Jigger", "Line", "Seine", "Trap", "Trawlb", 
    "Trawlm"), class = "factor"), fishery = structure(c(12L, 
    25L, 43L, 50L, 24L, 24L, 15L, 27L, 15L, 24L, 21L, 12L, 15L, 
    9L, 43L, 36L, 24L, 24L, 25L, 12L), .Label = c("AMERICAN PLAICE-Gillnet", 
    "AMERICAN PLAICE-Line", "AMERICAN PLAICE-Trawlb", "BIGEYE TUNA-Jigger", 
    "BIGEYE TUNA-Line", "BIVALVE-Dredge", "BLUEFIN TUNA-Hook", 
    "BLUEFIN TUNA-Jigger", "BLUEFIN TUNA-Line", "CAPELIN-Seine", 
    "CAPELIN-Trap", "COD(ATL)-Gillnet", "COD(ATL)-Hook", "COD(ATL)-Jigger", 
    "COD(ATL)-Line", "COD(ATL)-Trap", "COD(ATL)-Trawlb", "CRAB(SNOW,QUEEN)-Trap", 
    "CUSK-Line", "HADDOCK-Gillnet", "HADDOCK-Line", "HADDOCK-Trawlb", 
    "HAGFISH(ATL)-Trap", "HALIBUT(ATL)-Line", "HALIBUT(GREENLAND)-Gillnet", 
    "HALIBUT(GREENLAND)-Line", "HALIBUT(GREENLAND)-Trawlb", "HERRING(ATL)-Seine", 
    "HERRING(ATL)-Trawlm", "JONAH CRAB (CANC.BOR.)-Trap", "LOBSTER-Trap", 
    "LONGHORN SCULPIN-Trawlb", "LUMPFISH-Gillnet", "MACKEREL(ATL)-Seine", 
    "MACKEREL(ATL)-Trawlm", "MONKFISH-Gillnet", "MONKFISH-Trawlb", 
    "PAND.BOR.-Trawlb", "PAND.MON.-Trawlb", "POLLOCK-Gillnet", 
    "POLLOCK-Trawlb", "REDFISH-Gillnet", "REDFISH-Trawlb", "REDFISH-Trawlm", 
    "SCALLOP-Dredge", "SEA URCHINS-Dredge", "SEACU-Dredge", "SILVER HAKE-Trawlb", 
    "SWORDFISH-Jigger", "SWORDFISH-Line", "SWORDFISH-unk", "WHELK-Trap", 
    "WHITE HAKE-Gillnet", "WHITE HAKE-Line", "WINTER FLOUNDER-Gillnet", 
    "WINTER FLOUNDER-Trawlb", "WITCH FLOUNDER-Trawlb", "YELLOWFIN TUNA-Line", 
    "YELLOWTAIL FLOUNDER-Trawlb"), class = "factor"), year = c(2008L, 
    2008L, 2009L, 2009L, 2008L, 2009L, 2009L, 2008L, 2006L, 2007L, 
    2007L, 2007L, 2007L, 2007L, 2008L, 2008L, 2009L, 2009L, 2009L, 
    2009L), div = structure(c(6L, 19L, 2L, 4L, 5L, 10L, 3L, 19L, 
    9L, 10L, 3L, 9L, 6L, 4L, 3L, 9L, 6L, 11L, 7L, 9L), .Label = c("5Z", 
    "5Y", "4X", "4W", "4V", "4T", "4S", "4R", "3P", "3O", "3N", 
    "3M", "3L", "3K", "2J", "2H", "2G", "1F", "0B", "1B", "0A"
    ), class = "factor"), TOTALshark = c(3369.72, 12243.2, 6080.06, 
    316646.05, 18786.8, 6565.91, 1339771.2, 45841.03, 41329.64, 
    6411.86, 204980.36, 67608.78, 2617.05, 61547.64, 447349.44, 
    13226.4, 1362.55, 6012.23, 13152.51, 1067.92), cat = structure(c(1L, 
    1L, 1L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 1L, 1L, 
    1L, 1L, 1L, 1L), .Label = c("groundfish", "largepelagic", 
    "bivalve", "smallpelagic", "crabs/lobsters", "shrimps", "others"
    ), class = "factor")), .Names = c("X1", "X2", "fishery", 
"year", "div", "TOTALshark", "cat"), class = "data.frame", row.names = c(70L, 
278L, 500L, 554L, 242L, 245L, 131L, 315L, 106L, 224L, 194L, 60L, 
115L, 37L, 489L, 385L, 249L, 244L, 284L, 75L))

I wish to have the same legend, but with a few colors based on which category "cat" variable (i.e.,, pelagic, groundfish) the fishery falls in.

解决方案

Is this what you want?

library(ggplot2)
library(plyr)
library(gridExtra)

# create data that links colour per 'cat' with 'fishery'
# the 'cat' colours will be used as manually set fill colours. 

# get 'cat' colours

# alt. 1: grab 'cat' colours from plot object
# create a plot with fill = fishery *and* colour = cat
g1 <- ggplot(df, aes(x = year, y = TOTALshark, fill = fishery, colour = cat)) +
  geom_bar(width = 0.5, stat = "identity", position = "dodge") +
  facet_wrap(~ div)

g1

# grab 'cat' colours for each 'fishery' from plot object
# to be used in manual fill
cat_cols <- unique(ggplot_build(g1)[["data"]][[1]]$colour)

# unique 'cat'
cat <- unique(df$cat)

# create data frame with one colour per 'cat'
df2 <- data.frame(cat = cat, cat_cols)
df2


# alt 2: create your own 'cat' colours
# number of unique 'cat'
n <- length(cats)

# select one colour per 'cat', from e.g. brewer_pal or other palette tools 
cat_cols <- brewer_pal(type = "qual")(n)
# cat_cols <- rainbow(n)

# create data frame with one colour per 'cat'
df2 <- data.frame(cat, cat_cols)
df2

# select unique 'fishery' and 'cat' combinations
# in the order they show up in the legend, i.e. ordered ('arranged') by fishery
df3 <- unique(arrange(df[, c("fishery", "cat")], fishery))
df3

# add 'cat' colours to 'fishery'
# use 'join' to keep order
df3 <- join(df3, df2)
df3

# plot with fill by 'fishery' creates a fill scale by fishery,
# but colours are set manually using scale_fill_manual and the 'cat' colours from above
g2 <- ggplot(df, aes(x = year, y = TOTALshark, fill = fishery)) +
  geom_bar(width = 0.5, stat = "identity", position = "dodge") +
  facet_wrap(~ div, nrow = 5) +
  scale_fill_manual(values = as.character(df3$cat_cols))

g2

# create plot with both 'fishery' and 'cat' legend.

# extract 'fisheries' legend
tmp <- ggplot_gtable(ggplot_build(g2))
leg <- which(sapply(tmp$grobs, function(x) x$name) ==  "guide-box")
legend_fish <- tmp$grobs[[leg]]

# create a non-sense plot just to get a 'fill = cat' legend
g3 <- ggplot(df, aes(x = year, y = TOTALshark, fill = cat)) +
  geom_bar(stat = "identity") +
  scale_fill_manual(values = as.character(df3$cat_cols))

# extract 'cat' legend
tmp <- ggplot_gtable(ggplot_build(g3))
leg <- which(sapply(tmp$grobs, function(x) x$name) ==  "guide-box")
legend_cat <- tmp$grobs[[leg]]


# arrange plot and legends

library(gridExtra)

# quick and dirty with grid.arrange
# in the first column, put the plot (g2) without legend (removed using the 'theme' code)
# put the two legends in the second column
grid.arrange(g2 + theme(legend.position = "none"),
             arrangeGrob(legend_fish, legend_cat), ncol = 2) 


# arrange with viewports
# define plotting regions (viewports)
grid.newpage()
vp_plot <- viewport(x = 0.25, y = 0.5,
                    width = 0.5, height = 1)

vp_legend <- viewport(x = 0.75, y = 0.7,
                      width = 0.5, height = 0.5)

vp_sublegend <- viewport(x = 0.7, y = 0.25,
                         width = 0.5, height = 0.3)


print(g2 + theme(legend.position = "none"), vp = vp_plot)
upViewport(0)

pushViewport(vp_legend)
grid.draw(legend_fish)

upViewport(0)
pushViewport(vp_sublegend)
grid.draw(legend_cat)  

See also @mnel's answer here for replacing values in the plot object. It might be worth trying here as well. You may also check gtable methods for arranging grobs.

这篇关于基于ggplot2中的另一个因素的scale_fill_manual的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆