不同层中的独立数据和组颜色

时间:2018-11-21 18:22:18

标签: r ggplot2

当我绘制以下内容时:

library(ggplot2)

ggplot() +
  geom_point(data=mtcars, mapping=aes(x=mpg, y=wt, col=factor(cyl)))

我得到这个情节: enter image description here

现在我想添加具有不同组和颜色的不同数据

library(ggplot2)

data = data.frame(x = rep(12, times=50), y = seq(1, 5, length.out = 50), c = c(rep(1, times=10),
                                                                               rep(2, times=10),
                                                                               rep(3, times=10),
                                                                               rep(4, times=10),
                                                                               rep(5, times=10)))

ggplot() +
  geom_point(data=mtcars, mapping=aes(x=mpg, y=wt, col=factor(cyl))) +
  geom_point(data=data, aes(x=x, y=y, col=factor(c)), inherit.aes = FALSE)

但是我得到了第一层颜色发生变化的图。如何在c变量之后为第二层着色,而不更改第一层? enter image description here

2 个答案:

答案 0 :(得分:1)

您不能将单个美学(在这种情况下为颜色)映射到同一图中的两组不同值。 ggplot 正在以唯一有效的方式来解释您的命令:构造一个单一的色标,其中包含mtcars$cyldata$c中的所有唯一值。

但是,通过将颜色映射到一组值并填充到另一组值,我们可以接近所需的值。我们可以使用pch = 21,因为该点样式既有颜色又有填充。我们在一层中关闭点笔画(颜色),然后在另一层中关闭点:

ggplot() +
  geom_point(data=mtcars, mapping=aes(x=mpg, y=wt, col=factor(cyl)), pch = 21) +
  geom_point(data=data, aes(x=x, y=y, fill=factor(c)), pch = 21, color = '#00000000')

enter image description here

答案 1 :(得分:1)

但是,我们有带有基本R的plot()的选项。根据this answer,我们可以定义适合我们数据的调色板:

rbPal1 <- colorRampPalette(c('red','blue'))
rbPal2 <- colorRampPalette(c('green', 'purple','orange'))
mtcars$cyl.col <- rbPal1(8)[mtcars$cyl]  # for mtcars
data$c.col <- rbPal2(5)[data$c]  # for your data

然后我们可以通过引用这些颜色(甚至带有图例)来绘制它。

with(mtcars, plot(mpg, wt, col=cyl.col, pch=16))
with(data, points(y ~ x, col=c.col, pch=16))
legend("topright", as.character(unique(mtcars$cyl)), title="cyl",
       col=unique(mtcars$cyl.col), lty=0, lwd = 2, pch=16)
legend("bottomright", as.character(unique(data$c)), title="c",
        col=unique(data$c.col), lty=0, lwd = 2, pch=16)

enter image description here