ggplot2 - 使用不同类型的色阶

时间:2017-03-18 07:41:13

标签: r plot ggplot2

我想独立使用色标,即连续和分类尺度。

我有一个特定的应用程序,我在这里有一个简单的情节

mtcars %>%
  mutate(cylcol = factor(if_else(cyl == 6, "six", "not six"))) %>%
  ggplot(aes(x = mpg, y = wt)) +
  geom_point(aes(color = drat)) +
  facet_wrap(~ cyl)

enter image description here

但我也想highlight border, like in the answer of Seth_P, of a specific condition(我不想使用刻面的填充背景!)。例如

mtcars %>%
  mutate(cylcol = factor(if_else(cyl == 6, "six", "not six"))) %>%
  ggplot(aes(x = mpg, y = wt)) +
  geom_point() +
  geom_rect(xmin = -Inf, xmax = Inf, show.legend = FALSE,
            ymin = -Inf, ymax = Inf, aes(col = cylcol), fill = "#00000000") + 
  facet_wrap(~ cyl)

enter image description here

现在我想"结合"这两个,例如:

mtcars %>%
  mutate(cylcol = factor(if_else(cyl == 6, "six", "not six"))) %>%
  ggplot(aes(x = mpg, y = wt)) +
  geom_point(aes(color = drat)) +
  geom_rect(xmin = -Inf, xmax = Inf, show.legend = FALSE,
            ymin = -Inf, ymax = Inf, aes(col = cylcol), fill = "#00000000") + 
  facet_wrap(~ cyl)

这会产生错误Error: Discrete value supplied to continuous scale。这一方面有意义,但另一方面,由于两者都使用自变量,我想使用"不同的色标"。我可以使用叠加层,例如here, where facet colors are plotted over the plot,但我非常感谢更简单的解决方案。我知道specifying fill and color separately - 但这不是目标。我真的很想在不同的尺度上使用颜色。有什么建议 ?

1 个答案:

答案 0 :(得分:1)

我不知道同时具有离散和连续colour尺度的任何方式。但是,您可以使用由geom_point填充的fill形状而非colour来解决此问题:

library(ggplot2)
library(dplyr)
mtcars %>%
  mutate(cylcol = factor(if_else(cyl == 6, "six", "not six"))) %>%
  ggplot(aes(x = mpg, y = wt)) +
  geom_point(aes(fill = drat), shape = 21) +
  geom_rect(aes(colour = cylcol), xmin = -Inf, xmax = Inf,
    ymin = -Inf, ymax = Inf, fill = NA) +
  facet_wrap(~ cyl)

demo plot

这是第二种方式,可能有点过于复杂,但通过分割数据并有效地手动进行分面来实现。宽度需要根据y轴标签尺寸,图例尺寸和绘图尺寸手动调整。

library(ggplot2)
library(dplyr)
library(purrr)
lims <- list(x = range(mtcars$mpg), y = range(mtcars$wt))

make_plot <- function(data) {
  cyl <- data$cyl[1]
  if (cyl == 6) {
    rec_col <- "light blue"
  } else {
    rec_col <- "red"
  }
  p <- data %>%
    ggplot(aes(x = mpg, y = wt)) +
    geom_point(aes(colour = drat)) +
    geom_rect(xmin = -Inf, xmax = Inf, ymin = -Inf, ymax = Inf,
              fill = NA, colour = rec_col) +
    xlim(lims$x) + ylim(lims$y) +
    facet_wrap(~ cyl)
  if (cyl != 4) {
    p <- p + theme(axis.title.y = element_blank(), axis.ticks.y = element_blank(),
                   axis.text.y = element_blank())
  }
  if (cyl != 8) {
    p <- p + theme(legend.position = "none")
  }
  if (cyl != 6) {
    p <- p + theme(axis.title.x = element_text(colour = "white"))
  }
  p
}

mtcars %>%
  split(.$cyl) %>%
  map(make_plot) %>%
  grid.arrange(grobs = ., layout_matrix = matrix(1:3, nrow = 1),
               widths = c(0.32, 0.28, 0.4))

demo plot 2

最后,值得注意的是considered three years ago,但是我觉得没有足够的开发带宽。