在R中的图中添加第二个图例

时间:2013-03-09 21:45:44

标签: r statistics ggplot2

我根据列的因子得到了默认图例。我根据另一列的因子对x轴着色。

我可以为这个x轴颜色添加图例吗?

enter image description here

合并数据(https://dl.dropbox.com/u/81597211/Untitled.pdf

row.names   LCA_CASE_WORKLOC1_CITY  LCA_CASE_JOB_TITLE  LCA_CASE_WORKLOC1_STATE LCA_CASE_WAGE_RATE_FROM Company
    4726    REDWOOD SHORES  SOFTWARE DEVELOPER - ARCHITECT  CA  263500.00   ORACLE
    102663  DENVER  SOFTWARE ENGINEER (SOFTWARE DEVELOPER 5)    CO  170000.00   ORACLE
    103621  DENVER  SOFTWARE ENGINEER (SOFTWARE DEVELOPER 5)    CO  170000.00   ORACLE
    95210   SANTA CLARA SOFTWARE ENGINEER (SOFTWARE DEVELOPER 4)    CA  155000.00   ORACLE
    18858   SANTA CLARA SOFTWARE ENGINEER (CONSULTING SOLUTION DIRECTOR)    CA  150000.00   ORACLE
    19514   IRVING  CONSULTING TECHNICAL MANAGER    TX  150000.00   ORACLE
    57054   REDWOOD SHORES  SOFTWARE ENGINEER (SOFTWARE DEVELOPER 4)    CA  150000.00   ORACLE
    76335   REDWOOD SHORES  SOFTWARE ENGINEER (APPLICATIONS DEVELOPER 4)    CA  150000.00   ORACLE
    79964   REDWOOD SHORES  SOFTWARE ENGINEER (SOFTWARE DEVELOPER 5)    CA  150000.00   ORACLE

代码

library("ggplot2")
colour = factor(merged$Company)
xcolor = factor(merged$LCA_CASE_WORKLOC1_STATE)
qplot(merged[[2]], merged[[4]], colour = colour, xlab="Positions", ylab ="Salary", main="H1B Salary 2012") + theme(axis.text.x=element_text(angle=90,vjust=0.5, hjust=1, size=10, color= xcolor, lineheight=10)) + scale_y_continuous(breaks=seq(0,300000, 10000)) + theme(panel.grid.minor = element_line(colour = "red", linetype = "dotted")) + scale_x_discrete(merged[[2]])

1 个答案:

答案 0 :(得分:1)

这个解决方案并不像我们想要的那样通用,但也不是很困难和技术性的。首先是一些数据:

y <- c(5, 2, 3, 2)
x <- factor(c("A", "B", "C", "A"))
z <- factor(c("D", "E", "F", "E"))

p <- qplot(x, y, geom = "point") +
  theme(axis.text.x = element_text(color = z))

一个流行的函数g_legend(可以找到,例如here)在这种情况下非常有用,它将图中的图例作为一个grob(因此这个解决方案并不快)。

g_legend<-function(a.gplot){
  tmp <- ggplot_gtable(ggplot_build(a.gplot))
  leg <- which(sapply(tmp$grobs, function(x) x$name) == "guide-box")
  legend <- tmp$grobs[[leg]]
  legend
}

所以我们保存了两个图例,一个用于点(x),另一个用于x轴(z)。

legends <- list(g_legend(p + geom_point(aes(color = x))),
                g_legend(p + geom_point(aes(color = z)) + 
                          scale_color_manual(values = palette()[as.numeric(z)])))

注意第二个图例的区别。此处使用palette(),因为例如, z <- factor(c(1, 2, 3))然后element_text(color = z)使用与geom_point(aes(color = z))不同的颜色,即element_text(color = z)从基础图中获取颜色,例如plot(1, col = 2)library(gridExtra) grid.arrange(p + geom_point(aes(color = x)) + guides(color = 'none'), do.call(arrangeGrob, legends), nrow = 1, widths = c(0.8, 0.2)) 中的2。

最后,把所有东西放在一起:

{{1}}

enter image description here