【问题标题】:Independent data and group colors in different layers不同层中的独立数据和组颜色
【发布时间】:2019-04-24 09:25:42
【问题描述】:

当我绘制以下内容时:

library(ggplot2)

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

我得到了这个情节:

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

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 变量后的第二层着色?

【问题讨论】:

  • 我现在没有找到“最佳”答案,但谷歌“情节 ggplot 之间的颜色一致”你就明白了。

标签: r ggplot2


【解决方案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')

【讨论】:

    【解决方案2】:

    但是,我们可以选择基础 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)
    

    【讨论】:

    • 谢谢,这是一个有效的解决方案。可悲的是,我只能接受一个答案。
    • @Benni 不用担心,你明确要求 ggplot,我只是想表明,在 R 中绘图不仅仅是ggplot()
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-24
    • 2013-10-08
    • 2023-03-30
    • 1970-01-01
    • 1970-01-01
    • 2013-11-27
    • 1970-01-01
    相关资源
    最近更新 更多